【发布时间】:2013-02-28 22:26:09
【问题描述】:
我有一个静态链接的应用程序二进制文件,它链接到多个用户库和 pthread 库。该应用程序仅使用这些库中的一组有限的函数。从之前的帖子Size of a library and the executable 和我的实验中,我意识到链接器只包含使用/需要的函数(在可执行文件中),而不是库的全部内容。
我想找出各个库中的哪些函数被链接 到可执行文件及其地址 (VMA)。最终,我想编译一个列表,其中包含基于映射到文本段的函数(在库中)的每个库的开始和结束虚拟内存地址 (VMA)。
执行此操作的一种方法是在库中创建一个函数列表,然后在可执行文件中查找这些函数中的每一个以及它映射到的相应虚拟内存地址。但这对我来说似乎相当乏味。有没有更简单的方法来实现这一点?谢谢。
【问题讨论】:
-
为什么不直接使用“libelf”来找出可执行文件包含哪些函数?
-
@H2CO3 由于我之前没有使用 libelf 的经验,如果有解决方法会很棒。我可以使用 nm 来提取函数和名称的 VMA。然而问题是他们似乎没有提供关于函数父库的任何信息。然而,在你提到的时候,我简要地看了一下 libelf 文档。乍一看,我无法确定是否可以从可执行文件中提取有关函数的父库的信息。是否有可能获得这些信息?谢谢。
-
不,不是,链接会删除该信息。