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