Linux 检查静态链接的可执行文件中的文本段

Linux 检查静态链接的可执行文件中的文本段,linux,ld,elf,Linux,Ld,Elf,我有一个静态链接的应用程序二进制文件,它链接到多个用户库和pthread库。应用程序仅使用这些库中的有限函数集。从上一篇文章和我的实验中,我意识到链接器只包含使用/需要的函数(在可执行文件中),而不是库的全部内容 我想找出每个库中的哪些函数是链接的 可执行文件及其地址(VMA)。最后,我希望编译一个列表,其中包含每个库的开始和结束虚拟内存地址(VMA),该列表基于映射到文本段的函数(在库中) 实现这一点的一种方法是在库中列出函数列表,然后在可执行文件中查找这些函数中的每一个,以及映射到的相应虚拟

我有一个静态链接的应用程序二进制文件,它链接到多个用户库和pthread库。应用程序仅使用这些库中的有限函数集。从上一篇文章和我的实验中,我意识到链接器只包含使用/需要的函数(在可执行文件中),而不是库的全部内容

我想找出每个库中的哪些函数是链接的 可执行文件及其地址(VMA)。最后,我希望编译一个列表,其中包含每个库的开始和结束虚拟内存地址(VMA),该列表基于映射到文本段的函数(在库中)

实现这一点的一种方法是在库中列出函数列表,然后在可执行文件中查找这些函数中的每一个,以及映射到的相应虚拟内存地址。但这对我来说似乎相当乏味。有没有更简单的方法来实现这一点?谢谢

我想找出每个库中的哪些函数链接到可执行文件及其地址(VMA)

-Wl,-Map=foo.Map
参数添加到链接行。生成的
foo.map
文件将告诉您以上所有内容

最后,我想编译一个列表,其中包含每个库的开始和结束虚拟内存地址(VMA)


这假设链接器不会对函数重新排序(因此,单个库中的所有函数都占用连续的文本地址范围)。这种假设在简单的情况下可能是正确的,但无法保证。参见示例。

为什么不直接使用“libelf”来找出可执行文件包含哪些函数?@H2CO3因为我以前没有使用libelf的经验,如果有一个解决方法,那就太好了。我可以使用nm提取函数和名称的VMA。然而,问题是它们似乎没有提供有关函数父库的任何信息。不过,在您提到的时候,我简要地看了一下libelf文档。乍一看,我不知道是否可以从可执行文件中提取有关函数父库的信息。有可能得到这些信息吗?谢谢。不,它不是,链接会将这些信息剥离。我使用nm并按地址对输出进行排序,以获得可执行文件中使用的函数列表。排序之后,我意识到链接器没有跨库重新排序函数。感谢您的回答,尤其是关于重新排序功能的链接。