【问题标题】:Adding -fvisibility=hidden after compilation编译后添加 -fvisibility=hidden
【发布时间】:2016-07-28 13:39:37
【问题描述】:

我正在构建一个共享对象 (.so),并将它与第三方静态库链接。在一个理想的世界中,第三方库应该是用-fvisibility=hidden 编译的——但事实并非如此。

有没有办法避免将静态库定义的符号包含在动态库导出的全局符号中?

(如果重要的话,我在 linux 平台上使用 gcc)

【问题讨论】:

  • 看看strip
  • 我想我可以编写一个脚本,在 .a 文件上运行 nm 以查找它定义的所有符号,并使用 strip --strip-symbol=symbol1 ... 从 .so 中删除它们。这就是你的意思@MichałWalenciak?
  • 我对@9​​87654325@ 及其全部功能不是很熟悉,但一般来说我就是这么想的。

标签: linux gcc ld


【解决方案1】:

您可以控制通过-Wl,--version-script=<version-script> 导出的符号。版本脚本看起来像

LIBMYLIB_1.0 {
  global:
    libmylib_foo; libmylib_bar;

  local:
    *;
};

(库符号将在local 部分中过滤)。

请注意,您仍应尽可能使用隐藏可见性(即使您启用版本脚本),因为它允许编译器更好地优化。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2011-04-03
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多