【问题标题】:Hiding C++ symbols with -fvisibility=hidden [duplicate]使用 -fvisibility=hidden 隐藏 C++ 符号 [重复]
【发布时间】:2020-08-22 04:30:05
【问题描述】:

我有一个带有 C API 的 C++ 库,并且我设置了 -fvisibility=hidden 编译器标志, 然后我在 C API 方法上设置了__attribute__ ((visibility ("default")))。

但是,我仍然看到可见的 C++ 符号。当我为我的库创建一个 debian 包时, 我得到以下symbols file

为什么这些符号仍然可见?

【问题讨论】:

  • 它们是进口符号吗?你不能隐藏这样的符号
  • 谢谢,我在库中有一个静态 C++ 11 线程池,这些符号似乎在引用该线程池。
  • 您应该通过c++filt 运行您的符号文件,它将“损坏的”符号名称转换为可读的名称[在c++ 意义上]。如果这样做,您会发现三分之二的符号是std::whatever,而不是your 符号。因此,由于 STL,他们被拉进来。你可能无法控制它们。如果有帮助,其他符号是 grk_*。
  • 啊啊啊,好的。那么,我应该将过滤后的符号文件作为 lib*.symbols 文件吗?这是脚本:sed 's/ \(_.*\) \(.*\)/ (c++)"\1" \2/' libgrokj2k.symbols | c++filt
  • 有一些目标文件实用程序(例如readelf、objdump、objcopy 等)可以让您编辑/修补您的目标文件。或者,您可以使用链接描述文件。或者,您可以使用-S 进行编译以获取.s 文件。然后,您可以编写一个 [perl/python] 脚本来修改 asm 源并添加/更改您需要更改可见性的任何属性。然后,只需:c++ -c modified.s

标签: c++ c gcc clang shared-libraries


【解决方案1】:

您应该通过c++filt 运行您的符号文件,它将“损坏的”符号名称转换为可读的名称[在c++ 意义上]。

如果您这样做,您会发现三分之二的符号是std::whatever,而不是您的 符号。因此,由于 STL,他们被拉进来。你可能无法控制它们。

如果有帮助,其他符号是 grk_*。

有一些目标文件实用程序(例如readelf、objdump、objcopy 等)可以让您编辑/修补您的目标文件。

或者,您可以使用链接描述文件。

或者,您可以使用-S 进行编译以获取.s 文件。然后,您可以编写一个 [perl/python] 脚本来修改 asm 源并添加/更改您需要更改可见性的任何属性。然后,只需:c++ -c modified.s


对于给定的符号(例如):

int __attribute__((visibility("hidden")))
main(void)
{

    return 0;
}

asm 文件是:

    .file   "main.c"
    .text
    .globl  main
    .hidden main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
    .section    .note.GNU-stack,"",@progbits

注意 asm 指令:

.hidden main

即使没有这样的指令,也应该很容易编写一个脚本来添加一个[在对应的.globl之后]

【讨论】:

  • 再次感谢。我还是有点疑惑:为什么只有这些特殊的 STL 符号可见?我正在使用许多其他 STL 函数,但它们似乎没有出现在列表中。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2017-12-13
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多