使用外部变量发生冲突(ARM)

时间:2016-10-10 08:39:21

标签: gcc assembly arm wolfssl

我想在ARM Cortex-A9处理器上使用wolfssl库(https://github.com/wolfSSL/wolfssl)。所以,我在Ubuntu上使用了arm-none-eabi-gcc交叉编译器,得到了一个静态链接库" libwolfssl.a"。

编译和链接成功了,但是" PemToDer" function(ssl.c)崩溃。

我通过使用日志记录功能探讨了冲突点。 冲突的原因是"标题= BEGIN_CERT; &#34 ;. BEGIN_CERT是一个const char *类型,在asn.c。中定义。

int PemToDer(const unsigned char* buff, long longSz, int type, ......)
{
    const char* header      = NULL;
    const char* footer      = NULL;
    ...
    switch (type) {
        case CA_TYPE:       /* same as below */
        case TRUSTED_PEER_TYPE:
        case CERT_TYPE:
        header=BEGIN_CERT; // clash here!
        footer=END_CERT;
        break;
        case CRL_TYPE: header=BEGIN_X509_CRL; footer=END_X509_CRL; break;

我关闭了gcc优化并再次查看CFLAGS,但它没有意义。

我用END_CERT替换了BEGIN_CERT,但是END_CERT也导致了冲突。

为了找出原因,我写了一个简单的函数,它在wolfssl库(libwolfssl.a)和RTOS的任务上返回BEGIN_CERT,并从RTOS的任务中调用两个函数。

const char *test(void){ return BEGIN_CERT; }

结果是...... 在狼人图书馆发生冲突,并没有就RTOS的任务发生冲突。

所以,我比较了汇编代码。这些是一些区别。我对装配不是很熟悉,但我认为地址是正确的。

下面的代码发生了冲突。

18024cac <test1>:
18024cac:       e59f2014        ldr     r2, [pc, #20]   ; 18024cc8 <test1+0x1c>
18024cb0:       e08f2002        add     r2, pc, r2
18024cb4:       e59f3010        ldr     r3, [pc, #16]   ; 18024ccc <test1+0x20>
18024cb8:       e7923003        ldr     r3, [r2, r3]
18024cbc:       e5933000        ldr     r3, [r3]
18024cc0:       e1a00003        mov     r0, r3
18024cc4:       e12fff1e        bx      lr
18024cc8:       07ffbfe0        ldrbeq  fp, [pc, r0, ror #31]!
18024ccc:       00000000        andeq   r0, r0, r0

下面的代码没有发生冲突。

18008cd4 <test2>:
18008cd4:       e59f3004        ldr     r3, [pc, #4]    ; 18008ce0 <test2+0xc>
18008cd8:       e5930000        ldr     r0, [r3]
18008cdc:       e12fff1e        bx      lr
18008ce0:       20020b98        mulcs   r2, r8, fp

我的猜测是碰撞的原因在上面的test1代码中。可能是造成这个问题的原因是什么?

请原谅我糟糕的英语。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这种性质崩溃的最常见原因是在使用自动工具配置wolfssl库时未能包含“wolfssl / options.h”。

或者,如果您只使用“wolfssl-root”/wolfssl/wolfcrypt/settings.h头文件来控制库的构建,那么该头文件也应该包含在链接到wolfSSL库的应用程序中。

应用程序和库需要相同的配置,否则您可能会在运行时遇到无法解释的分段错误。