使用外部变量(ARM)冲突

问题描述:

我想在ARM Cortex-A9处理器上使用wolfssl库(https://github.com/wolfSSL/wolfssl)。因此,我在Ubuntu上使用了arm-none-eabi-gcc交叉编译器,并获得了一个静态链接库“libwolfssl.a”。使用外部变量(ARM)冲突

编译和链接成功,但“PemToDer”函数(ssl.c)崩溃。

我通过使用记录功能探索了冲突点。 冲突的原因是“header = BEGIN_CERT;”。 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; // * 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; } 

结果是... 发生冲突的wolfssl库,而不是冲突的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代码上面。造成这个问题的原因是什么?

请原谅我糟糕的英语。

感谢您的帮助。

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

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

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

+0

解决了一个问题,以删除gcc选项“-fpic”。后来,我多次遇到分段错误。我通过答案的方式解决了问题。 谢谢! –

+0

@Daiki松永乐意帮忙! – Kaleb