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コードでの衝突の原因です。この問題の原因は何でしょうか?
私の悲惨な英語を許してください。
あなたのお手伝いをお待ちしております。
gccオプション "-fpic"を削除する問題が解決されました。 その後、何度もセグメンテーションフォルトが発生しました。私はあなたの答えの方法でそれを解決しました。 ありがとうございました! –
@Daiki Matsunaga幸い! – Kaleb