如何从我的 executable 中的 .dynsym table 中删除已定义的符号?

How do I remove defined symbols from the .dynsym table in my executable?

ELF executable 中的 .dynsym table 显然有两个目的,导入和导出。我看到我的 executable 已定义符号(大小>0)和未定义符号(大小=0,来自库)。显然后者是必需的,但我不需要或不想从我的 executable 中导出任何符号。谁需要它们?这会向我的 executable.

添加 ~3000 个条目和 ~350kB

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

我知道我无法在我的 executable 上调用 dlopen,那是 acceptable。

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

I see that my executable has defined symbols (size>0) and undefined symbols (size=0, coming from library).

符号的大小与符号是否定义没有关系

I don't need or want to export any symbols from my executable

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

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