我想在 ARM Cortex-A9 处理器上使用 wolfssl 库( https://github.com/wolfSSL/wolfssl )。所以,我在 Ubuntu 上使用了 arm-none-eabi-gcc 交叉编译器,得到了一个静态链接库“libwolfssl.a”。
编译和链接成功,但“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; // 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; }
结果是……与 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 代码中。这个问题的原因可能是什么?
请原谅我糟糕的英语。
感谢你的帮助。