[英]Extract detailed symbol information (struct members) from elf file compiled with ARM-GCC
[英]extract debug symbol info from elf binary
我們來看看這個基本的c程序:
#include <stdio.h>
int myadd(int a, int b);
int myadd(int a, int b)
{
return a+b;
}
int main(int argc, char *argv[])
{
int res = myadd(argc,3);
printf("%d\n",res);
return 0;
}
我想要的是了解調試符號文件的工作原理。
如果我這樣編譯:
gcc test.c
我可以在gdb中看到調試符號:
gdb ./a.out
(gdb) disassemble myadd
Dump of assembler code for function myadd:
0x00000000000006b0 <+0>: push %rbp
沒關系 !
現在,如果我跑:
gcc -s test.c
這是我在gdb中得到的:
(gdb) disassemble myadd
No symbol table is loaded. Use the "file" command.
那也沒關系,因為我用-s gcc選項剝離了符號。
現在,我想在兩個文件中“拆分”我的elf可執行文件: - 剝離的精靈可執行文件 - 外部調試符號文件。
這是我在一些教程中讀到的內容:
gcc test.c
objcopy --only-keep-debug a.out a.dbg
strip ./a.out
但是,現在,如果我想運行gdb,我會告訴gdb查看./a.dbg中的調試符號
gdb -s ./a.dbg a.out
並且gdb無法解析myadd函數:
(gdb) disassemble myadd
No symbol table is loaded. Use the "file" command.
這是我不明白的:為什么gdb不解析myadd函數?
謝謝
如果我這樣編譯:
gcc test.c
我可以在gdb中看到調試符號
這里沒有看到調試符號,只有符號表(與調試符號不同)。
要查看調試符號,請使用gcc -g test.c
編譯。
gdb -s a.dbg a.out
這里的問題是當GDB看到“unadorned” a.out
,它拋棄先前指定的符號文件( a.dbg
)並用(完全剝離) a.out
替換它。 你要:
gdb -s a.dbg -e a.out
更新:
什么意思是“剝離”文件:這是否意味着這是一個沒有符號表或沒有debuging信息的文件?
在ELF平台上,與“strip”-ness相關的文件狀態不是二進制文件:您可以刪除文件的各個部分,並且根據您刪除的確切內容,您的調試體驗將受到不同程度的影響。
此命令: strip -g a.out
刪除所有.debug_*
部分,使您沒有指令地址到源文件和行映射,並且沒有堆棧地址到局部變量映射。 但是,符號表保留在二進制文件中,可用於為函數名稱映射提供指令地址。
此命令: strip a.out
刪除所有.debug_*
部分,以及.symtab
和.strtab
(它們一起構成符號表)。 這種二進制文件通常稱為“完全剝離”。
也可以使用obcopy
刪除單個部分。 可以刪除源文件/行信息( .debug_line
部分)而不刪除變量信息,反之亦然。
我試過了eu-unstrip ./a.out ./a.dbg但是./a.out結果文件不包含調試信息。
你可能會在eu-unstrip
遇到一個bug,也許就是這個 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.