【问题标题】:How do I remove defined symbols from the .dynsym table in my executable?如何从可执行文件的 .dynsym 表中删除定义的符号?
【发布时间】:2016-02-02 14:16:08
【问题描述】:

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

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

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

[编辑] 原来是-rdynamicCMake 帮助添加了。

【问题讨论】:

  • 您在可执行文件的 .dynsym 中有哪些定义的符号?一个简单的 hello world 可执行文件在我的机器上只有“libc_start_main@GLIBC_2.2.5”和“__gmon_start”。未列出程序中定义的函数和全局变量。

标签: elf


【解决方案1】:

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

符号的大小与是否定义符号无关

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

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

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

【讨论】:

  • 嗯,未定义的符号也被readelf标记为UND,其中一些肯定是由动态加载的Boost库提供的,所以对于我的用例大小是相关的。
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2019-04-08
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多