链接器如何在剥离符号的动态库中定位代码?

8
通常在动态库(Windows上的.dll,OSX上的.dylib和Linux/Solaris/BSD上的.so)中删除符号表是常见做法。这是有道理的,因为它可以大幅减小库文件的大小,通常超过75%。
然而,有一个问题一直困扰着我:一个被strip掉符号表的库并没有符号表。如果我编写一个引用该库中函数的可执行文件,当没有符号表提供信息时,操作系统的动态链接器如何知道在被strip掉符号表的库中定位代码段的位置?
这个问题包括两种情况,即在编译时链接可执行文件之前将库strip掉符号表的情况以及在编译时链接可执行文件之后将库strip掉符号表的情况。

1
如果你使用的是Linux系统,可以尝试运行命令readelf -Ws yourFile(我不确定在Mac/BSD系统下是否可行)。 - user2485710
可能是 https://dev59.com/UnVD5IYBdhLWcg3wRpaX 的重复问题。 - user2485710
1个回答

13

运行strip命令时被删除的符号是调试符号,而不是实际导出符号的名称。

动态符号,即链接器搜索的符号,仍然存在,并且可以通过使用“-D”(列出动态符号)参数进行列表显示。


1
那么为什么nm报告“没有符号”? - Leo Izen
2
@LeoIzen:如果没有任何命令行开关,nm 将默认不会打印动态/导出符号表。nm -anm -D 应该可以解决这个问题。正如答案中所讨论的那样,当您使用 strip 时,基本上是剥离了非导出符号。任何需要在运行时链接库时动态定位的导出内容都不会被此命令剥离。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接