我目前正在研究调试环境,而且我在ARM上创建有效的核心文件时遇到问题,导致共享库代码发生分段错误。
似乎在共享库中调用函数时,帧指针会丢失。
我已经检查了所有我能想到的gcc标志。我没有使用任何优化,没有使用-fomit-frame-pointer,我尝试使用-rdynamic,都没有成功。另外,我没有使用abort(),因为我读它在ARM上有些问题,因为由于函数没有返回,所以不保存帧信息。相反,我使用memset(NULL,0,1)来获得分段错误。
我正在使用arm-cortex_a8-linux-gnuabi工具链,我使用crosstool-NG的默认cortex-a8配置自行编译。 (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}