簡體   English   中英

從elf二進制文件中提取調試符號信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM