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 调试器使用的调试信息”)实际上生成了什么?它们(我安装的东西)是一样的吗?如果我需要“生成调试信息”,那么我必须需要源代码,对吗?