【问题标题】:extract debug symbol info from elf binary从 elf 二进制文件中提取调试符号信息
【发布时间】:2017-08-13 09:58:48
【问题描述】:

让我们看看这个基本的 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 可执行文件“拆分”为 2 个文件: - 一个剥离的精灵可执行文件 - 一个外部调试符号文件。

这是我在一些教程中读到的:

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 函数?

谢谢

【问题讨论】:

    标签: debugging gcc gdb


    【解决方案1】:

    如果我这样编译:gcc test.c 我可以在 gdb 中看到调试符号

    您确实没有在这里看到调试符号,只看到符号表(与调试符号不同)。

    要查看调试符号,请使用 gcc -g test.c 编译。

    gdb -s a.dbg a.out

    这里的问题是,当 GDB 看到“未经修饰的”a.out 时,它会丢弃先前指定的符号文件 (a.dbg) 并替换它与(完全剥离的)a.out。你想要:

    gdb -s a.dbg -e a.out
    

    更新:

    什么是“剥离”文件:这是否意味着这是一个没有符号表或没有调试信息的文件?

    在 ELF 平台上,关于“剥离”的文件状态不是二进制的:您可以删除文件的各个部分,并且根据您剥离的具体内容,您的调试体验会受到不同程度的影响.

    此命令:strip -g a.out 删除所有 .debug_* 部分,使您没有指令地址到源文件和行映射,也没有堆栈地址到局部变量映射。但是,符号表仍然是二进制的,可以用来提供指令地址到函数名的映射。

    此命令:strip a.out 删除所有 .debug_* 部分,以及 .symtab.strtab(它们共同构成符号表)。这种二进制文件通常被称为“完全剥离”。

    也可以使用obcopy 删除个别部分。可以在不删除变量信息的情况下删除源文件/行信息(.debug_line 部分),反之亦然。

    我尝试了 eu-unstrip ./a.out ./a.dbg 但 ./a.out 结果文件不包含调试信息。

    您可能遇到了eu-unstrip 中的错误,也许是this one

    【讨论】:

    • 谢谢。 “剥离”文件是什么意思:这是否意味着这是一个没有符号表或没有调试信息的文件?我试过 eu-unstrip ./a.out ./a.dbg 但 ./a.out 结果文件不包含调试信息。谢谢
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-03-12
    相关资源
    最近更新 更多