【问题标题】:examining text segment in a statically linked executable检查静态链接的可执行文件中的文本段
【发布时间】:2013-02-28 22:26:09
【问题描述】:

我有一个静态链接的应用程序二进制文件,它链接到多个用户库和 pthread 库。该应用程序仅使用这些库中的一组有限的函数。从之前的帖子Size of a library and the executable 和我的实验中,我意识到链接器只包含使用/需要的函数(在可执行文件中),而不是库的全部内容。

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

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

【问题讨论】:

  • 为什么不直接使用“libelf”来找出可执行文件包含哪些函数?
  • @H2CO3 由于我之前没有使用 libelf 的经验,如果有解决方法会很棒。我可以使用 nm 来提取函数和名称的 VMA。然而问题是他们似乎没有提供关于函数父库的任何信息。然而,在你提到的时候,我简要地看了一下 libelf 文档。乍一看,我无法确定是否可以从可执行文件中提取有关函数的父库的信息。是否有可能获得这些信息?谢谢。
  • 不,不是,链接会删除该信息。

标签: linux ld elf


【解决方案1】:

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

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

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

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

【讨论】:

  • 我使用 nm 并按地址对输出进行排序,以获得可执行文件中使用的函数列表。排序后,我意识到链接器没有跨库重新排序函数。感谢您的回答,尤其是关于重新订购功能的链接。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2013-06-24
  • 2010-12-16
  • 2010-12-25
  • 1970-01-01
相关资源
最近更新 更多