如何从我的 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。
[编辑]
结果是 -rdynamic
,CMake 帮助添加。
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 针对插件)。对于此类二进制文件通常有更好的解决方案,例如仅显式导出插件所需的符号。
ELF executable 中的 .dynsym table 显然有两个目的,导入和导出。我看到我的 executable 已定义符号(大小>0)和未定义符号(大小=0,来自库)。显然后者是必需的,但我不需要或不想从我的 executable 中导出任何符号。谁需要它们?这会向我的 executable.
添加 ~3000 个条目和 ~350kBstrip
无法删除它们,它显然没有触及 .dynsym
。那么我可以使用什么工具来删除这些导出并缩小我的 executable?
我知道我无法在我的 executable 上调用 dlopen
,那是 acceptable。
[编辑]
结果是 -rdynamic
,CMake 帮助添加。
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 针对插件)。对于此类二进制文件通常有更好的解决方案,例如仅显式导出插件所需的符号。