PS 英语不是我的母语;请原谅打字错误。
我(也许)了解动态链接中 ELF 文件中符号的基本主要思想。
参考教科书,如果我需要动态链接到 .so 或类似的东西,那么我需要链接目标的函数名称(比如说,如果我们只谈论函数)。然后加载器做一些事情来找到你的目标的真实位置。然后做其他事情来加载它。函数的名字是一些我们可以称之为符号的东西。
但是,在调试中,以下内容让我感到困惑。
我尝试在 Arch linux 上安装 pwndbg(GDB 插件)并遇到了一些问题。按照这些说明 [ 1 ] [ 2 ],我已经解决了这些问题。但不太明白解决方案是如何工作的。
解决方案提供者的发帖人,也是插件的作者说,Arch的glibc没有“调试符号”,需要手动安装,而Ubuntu的glibc有“调试符号”——不需要手动安装.
所以这里有一个问题真的让我很困惑。
为什么我可以为 lib安装符号,例如 glibc。如果 .so (ELF) 文件没有符号,则将符号放入其中。这将破坏 ELF 文件格式,因为 ELF 是基于文件相对偏移量的,不是吗?那么INSTALL实际上做了什么?或者在这种情况下实际上“符号”是什么意思?
gcc -g
(“gcc -g 生成 GDB 调试器使用的调试信息”)实际上生成了什么?它们(我安装的东西)是一样的吗?如果我需要“生成调试信息”,那么我必须需要源代码,对吗?
在许多发行版(Debian、Ubuntu、Fedora 等;但不是 Arch,据我从相应的 wiki 页面得知),程序是使用调试信息构建的(见下文),但调试信息随后被分离成单独的文件。这些单独的文件在调试包中和/或通过调试信息服务器提供,并且可以与它们帮助调试的文件一起安装。
gcc -g
存储基本上允许调试器从编译器生成的二进制代码返回到源代码的信息。使用此信息,调试器可以将可执行文件或内存中的位置转换为相应的源代码:例如,变量位置可以链接到相关声明,可执行代码中的位置可以链接到相关源代码行.Michael J. Eager 的DWARF 调试格式简介很好地解释了调试信息的作用。另请参阅/usr/lib/.build-id/ 目录的用途是什么?