我很难从剥离的二进制文件中在Linux上生成破坏键符号。
我编译:
gcc-4.4 -c -I../include -D_LINUX -m64 -fPIC -D__LP64__ -D_GNU_SOURCE -Wno-switch -Wno-missing-braces -fno-strict-aliasing -Wreturn-type -Wall -Wno-unknown-pragmas -Wno-parentheses -pipe -fmessage-length=0 -g -DRELEASE -O3 -o lin/voxl.o voxl.c -fvisibility=hidden
还有一些C ++文件。
然后我链接:
g++-4.4 -o ../liblin/foo.so -shared <objects> <libs> -z origin -Wl,-R,\$ORIGIN -Wl,-rpath,../liblin
最后使用以下命令将调试信息剥离到.debug文件中
objcopy --only-keep-debug ../liblin/foo.so ../liblin/foo.so.debug
objcopy --strip-debug ../liblin/foo.so
objcopy --add-gnu-debuglink=../liblin/foo.so.debug ../liblin/foo.so
可以使用带有完整符号信息的GDB调试生成的二进制文件。它包含一个.gnu_debuglink
部分,引用foo.so.debug
(没有dir路径),这是正确的。
但是,dump_syms似乎没有关注链接even though the code being edited in this patch strongly suggests that it should。我在stderr中得到了这个输出:
liblin/foo.so, section '.eh_frame': the call frame entry at offset 0x18 uses a DWARF expression to describe how to recover register '.cfa', but this translator cannot yet translate DWARF expressions to Breakpad postfix expressions
liblin/foo.so: file contains no debugging information (no ".stab" or ".debug_info" sections)
生成的符号文件为2MB,无论ELF中是否存在.gnu_debuglink
部分。当使用带有minidump_stackwalk的2MB符号文件时,堆栈帧上会出现错误的功能。当我在带有嵌入符号的二进制文件上运行dump_syms
时,输出文件为9MB,堆栈帧正确。
我做错了什么?
答案 0 :(得分:3)
原来这是两件事:
dump_syms
的目录路径,即使这些符号与二进制文件位于同一文件夹中。例如dump_syms foo.so .