使用 -fvisibility=hidden 隐藏 C++ 符号

Hiding C++ symbols with -fvisibility=hidden

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

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

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

您应该 运行 您的符号文件通过 c++filt 将 "mangled" 符号名称转换为可读的 [在 c++ 意义上]。

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

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

目标文件实用程序(例如 readelfobjdumpobjcopy 等)可以让您 edit/patch 您的目标文件。

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

或者,您可以使用 -S 进行编译以获得 .s 文件。然后您可以编写 [perl/python] 脚本来修改 asm 源和 add/change 您需要更改可见性的任何属性。然后,只需执行: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    [=11=], %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]后加一个

应该很容易