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

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 -anm -D 应该可以解决这个问题。正如答案中所讨论的,当您使用strip 时,您基本上会去除未导出的符号。导出的任何内容,即在运行时链接时需要在库中动态定位的内容都不会被此命令剥离。

以上是关于链接器如何在剥离的动态库中定位代码?的主要内容,如果未能解决你的问题,请参考以下文章

将导出的符号保存在共享库中

如何识别IDA反汇编中动态链接库中的函数

归档时应用程序获取“架构 armv7 的未定义符号”,除非我不剥离库中的链接产品

如何使用动态链接库中的资源

如何查看DLL中的函数

如何彻底剥离可执行文件