ELF可执行文件中的.dynsym表显然有两个目的,即导入和导出。我看到我的可执行文件定义了符号(大小> 0)和未定义的符号(大小= 0,来自库)。显然后者是必需的,但我不需要或想要从我的可执行文件中导出任何符号。谁需要他们?这会为我的可执行文件添加~3000个条目和~350kB。
strip
无法删除它们,它显然没有触及.dynsym
。那么我可以用什么工具来删除那些导出并缩小我的可执行文件呢?
我知道我无法在我的可执行文件上调用dlopen
,这是可以接受的。
[编辑]
结果是-rdynamic
,CMake有助于添加。
答案 0 :(得分:2)
我看到我的可执行文件定义了符号(大小> 0)和未定义的符号(大小= 0,来自库)。
符号的大小 nothing 与是否定义符号有关。
我不需要或想要从我的可执行文件中导出任何符号
通常(在没有--export-dynamic
或-rdynamic
标志的情况下)如果符号被您链接的某个共享库引用,则链接器仅从可执行文件 中导出符号如果您设法删除此符号,则库将无法正常工作。
如果您有3000个导出符号,则可能是-rdynamic
标志。如果没有此标志(通常是在运行时加载插件但不直接链接插件的二进制文件),某些二进制文件将无法正常工作。通常,对于此类二进制文件有更好的解决方案,例如仅显式导出插件所需的符号。