如何从可执行文件中的.dynsym表中删除已定义的符号?

时间:2016-02-02 14:16:08

标签: elf

ELF可执行文件中的.dynsym表显然有两个目的,即导入和导出。我看到我的可执行文件定义了符号(大小> 0)和未定义的符号(大小= 0,来自库)。显然后者是必需的,但我不需要或想要从我的可执行文件中导出任何符号。谁需要他们?这会为我的可执行文件添加~3000个条目和~350kB。

strip无法删除它们,它显然没有触及.dynsym。那么我可以用什么工具来删除那些导出并缩小我的可执行文件呢?

我知道我无法在我的可执行文件上调用dlopen,这是可以接受的。

[编辑] 结果是-rdynamicCMake有助于添加。

1 个答案:

答案 0 :(得分:2)

  

我看到我的可执行文件定义了符号(大小> 0)和未定义的符号(大小= 0,来自库)。

符号的大小 nothing 与是否定义符号有关。

  

我不需要或想要从我的可执行文件中导出任何符号

通常(在没有--export-dynamic-rdynamic标志的情况下)如果符号被您链接的某个共享库引用,则链接器仅从可执行文件 中导出符号如果您设法删除此符号,则库将无法正常工作。

如果您有3000个导出符号,则可能是-rdynamic标志。如果没有此标志(通常是在运行时加载插件但不直接链接插件的二进制文件),某些二进制文件将无法正常工作。通常,对于此类二进制文件有更好的解决方案,例如仅显式导出插件所需的符号。