столкновение при использовании внешней переменной (ARM)

#gcc #assembly #arm #wolfssl

#gcc #сборка #arm #wolfssl

Вопрос:

Я хочу использовать библиотеку wolfssl (https://github.com/wolfSSL/wolfssl ) на процессоре ARM Cortex-A9. Итак, я использовал кросс-компилятор arm-none-eabi-gcc в Ubuntu и получил статическую библиотеку ссылок «libwolfssl.a».

Компиляция и соединение прошли успешно, но функция «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 тоже вызывает столкновение.

Чтобы определить причину, я написал простую функцию, которая возвращает BEGIN_CERT для библиотеки wolfssl (libwolfssl.a) и задачи 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. Что может быть причиной этой проблемы?

Пожалуйста, простите мне мой паршивый английский.

Ценю вашу помощь.

Ответ №1:

Наиболее распространенной причиной сбоя такого рода является неспособность включить «wolfssl / options.h» когда библиотека wolfssl была настроена с помощью автоинструментов.

Или, если вы используете только настройки «wolfssl-root» / wolfssl/ wolfcrypt/.файл заголовка h для управления сборкой библиотеки, тогда этот заголовок также должен быть включен в приложение, связывающееся с библиотекой wolfSSL.

Приложению и библиотеке требуется одинаковая конфигурация, иначе во время выполнения могут возникнуть необъяснимые ошибки сегментации.

Комментарии:

1. Была решена проблема с удалением опции gcc «-fpic». Позже я много раз встречал ошибки сегментации. Я решил это с помощью вашего ответа. Спасибо!

2. @Daiki Matsunaga Рад помочь!