В настоящее время я работаю в среде отладки, и у меня возникают проблемы при создании допустимых файлов ядра в 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}