2016-10-10 53 views
1

我想在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代碼上面。造成這個問題的原因是什麼?

請原諒我糟糕的英語。

感謝您的幫助。

回答

0

這種性質崩潰的最常見原因是當wolfssl庫配置了自動工具時未能包含「wolfssl/options.h」。

或者,如果您僅使用「wolfssl-root」/wolfssl/wolfcrypt/settings.h頭文件來控制庫的構建,那麼該頭也應包含在與wolfSSL庫鏈接的應用程序中。

應用程序和庫需要相同的配置,否則您可能會在運行時遇到無法解釋的分段錯誤。

+0

解決了一個問題,以刪除gcc選項「-fpic」。後來,我多次遇到分段錯誤。我通過答案的方式解決了問題。 謝謝! –

+0

@Daiki鬆永樂意幫忙! – Kaleb