链接器如何在剥离的动态库中定位代码?
Posted
技术标签:
【中文标题】链接器如何在剥离的动态库中定位代码?【英文标题】:How does the linker locate code in stripped dynamic libraries? 【发布时间】:2013-12-15 19:28:01 【问题描述】:通常的做法是从动态库(Windows 上的 .dll、OSX 上的 .dylib 和 Linux/Solaris/BSD 上的 .so)中剥离符号表。这是有道理的,因为它大大减少了库的文件大小,通常超过 75%。
但是,这个问题一直困扰着我:剥离的库没有符号表。如果我编写的可执行文件引用了这个库中的一个函数,那么当没有符号表来提供这些信息时,操作系统的动态链接器如何知道在剥离后的库中定位代码段的位置?
这个问题既包括在编译时链接可执行文件之前剥离库的情况,也包括在编译时链接可执行文件之后剥离库的情况。
如果有人可以向我解释这一点,那就太好了!谢谢。
【问题讨论】:
如果你在linux下试试readelf -Ws yourFile
(我不知道这是否适用于Mac/BSD)
***.com/questions/34732/…的可能重复
【参考方案1】:
运行 strip 时剥离的符号是调试符号,而不是实际导出符号的名称。
链接器搜索的动态符号仍然存在,并且可以使用 -D(列出动态符号)参数列出。
【讨论】:
那为什么nm
报告“无符号”?
@LeoIzen:没有任何命令行开关,nm
将默认 NOT 打印动态/导出符号表。 nm -a
或 nm -D
应该可以解决这个问题。正如答案中所讨论的,当您使用strip
时,您基本上会去除未导出的符号。导出的任何内容,即在运行时链接时需要在库中动态定位的内容都不会被此命令剥离。以上是关于链接器如何在剥离的动态库中定位代码?的主要内容,如果未能解决你的问题,请参考以下文章