链接 elf 应用程序和共享库时选择导出的符号

choose exported symbols when linking an elf application and shared library

在链接精灵应用程序或共享库时,我想选择要导出的符号。默认情况下,链接应用程序时不导出函数符号,链接共享库时导出所有函数符号。有什么方法可以控制要导出的符号吗?链接应用程序时,我可以使用 -rdynamic-Wl,--export-dynamic 获取所有符号,我可以使用 -Wl,--dynamic-list <symfile> 仅获取部分符号。但是,在链接库时,是否会忽略这些选项?

Is there any way to control which symbols to export?

控制共享库中符号可见性的常用方法是

  1. 使用链接描述文件,如here
  2. 所述
  3. 在您明确要导出的符号上使用 __attribute__((visibility("default"))) 并使用 -fvisibility=hidden 构建(这将隐藏其他所有内容)。

稍微测试了一下发现:

  • 对于ELF应用,可以使用-rdynamic-Wl,--export-dynamic导出所有符号,也可以在链接时使用-Wl,--dynamic-list <sym-file>仅导出部分符号通过 gcc.

  • 申请
  • 对于 ELF 库,不能使用 -rdynamic-Wl,--export-dynamic-Wl,--dynamic-list <symfile>,必须在通过链接库时使用 -Wl,--version-script=<verfile> gcc.

version-script 和 sym-file 几乎相同,除了 sym-file 您不需要编写版本和范围。文档:gnu ld