我想在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; // 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代碼上面。造成這個問題的原因是什麼?
請原諒我糟糕的英語。
感謝您的幫助。
解決了一個問題,以刪除gcc選項「-fpic」。後來,我多次遇到分段錯誤。我通過答案的方式解決了問題。 謝謝! –
@Daiki鬆永樂意幫忙! – Kaleb