Отсутствующие кадры в общих библиотеках в ARM - PullRequest
2 голосов
/ 29 августа 2011

В настоящее время я работаю в среде отладки, и у меня возникают проблемы при создании допустимых файлов ядра в ARM, где произошел сбой, вызвавший ошибку сегментации в коде общей библиотеки.

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

Я проверил все флаги gcc, о которых мог подумать.Я не использую оптимизацию, не использую -fomit-frame-pointer, и я попытался использовать -rdynamic, но все безуспешно.Кроме того, я не использую abort (), так как я прочитал, что это несколько проблематично в ARM, поскольку информация о кадре не сохраняется, так как функция не возвращает.Вместо этого я использую memset (NULL, 0, 1), чтобы получить ошибку сегментации.

Я использую набор инструментов arm-cortex_a8-linux-gnuabi, который я скомпилировал сам, используя стандартную корттоз-NG cortex- по умолчаниюконфигурация а8.(gcc 4.4.3, gsb 6.8).На хост-машине (Ubuntu) все работает нормально.

Вывод GDB выглядит примерно так (после загрузки всех разделяемых библиотек через set solib-search-path.) Я опустил нерелевантный вывод для удобства чтения.

(gdb) thread apply all bt full

Thread 1 (process 535):
#0 0x402ff624 in memset () from <my libc path>
No Symbol table info available.
#1 0x4011f60c in my_asserting_func () at src1.cc:5
No locals.
Backtrace stopped: frame did not save the PC

src1.cc:

#include <src1.h>
#include <string.h>
void my_asserting_func(void) 
{ 
    memset(NULL, 0, 1); 
}

main.cc:

#include <src1.h>
int main(void)
{
    my_asserting_func();
    return 0;
}

Любая помощь будет очень ценной,

Андрей.

PS: используя objump, вот разборка функции my_asserting_func:

00000654 <_Z17my_asserting_funcv>:
654:    e1a0c00d        mov      ip, sp
658:    e92dd800        push     {fp, ip, lr, pc}
65c:    e24cb004        sub      fp, ip, #4
660:    e3a00000        mov      r0, #0
664:    e3a01000        mov      r1, #0
668:    e3a02001        mov      r2, #1
66c:    ebffffb1        bl       538 <_init+0x38>
670:    e89da800        ldm      sp, {fp, sp, pc}
...