2016-10-10 11 views
1

ARM Cortex-A9 프로세서에서 wolfssl 라이브러리 (https://github.com/wolfSSL/wolfssl)를 사용하고 싶습니다. 그래서 우분투에서 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의 작업에서 두 ​​가지 함수를 호출하는 간단한 함수를 작성했습니다. 그 결과는

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