2016-10-10 10 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をもう一度見ましたが、意味がありませんでした。

私はBEGIN_CERTをEND_CERTに置き換えましたが、END_CERTでも衝突が発生します。

原因を特定するために、wolfsslライブラリ(libwolfssl.a)のBEGIN_CERTとRTOSのタスクを返し、RTOSのタスクから2つの関数を呼び出した簡単な関数を書きました。

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 Matsunaga幸い! – Kaleb

関連する問題