使用 -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_*,如果有帮助的话。
目标文件实用程序(例如 readelf
、objdump
、objcopy
等)可以让您 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
]后加一个
应该很容易
我有一个带有 C API 的 C++ 库,并且我设置了 -fvisibility=hidden
编译器标志,
然后我在 C API 方法上设置了 __attribute__ ((visibility ("default")))
。
但是,我仍然看到可见的 C++ 符号。当我为我的库创建一个 debian 包时, 我得到以下 symbols file
为什么这些符号仍然可见?
您应该 运行 您的符号文件通过 c++filt
将 "mangled" 符号名称转换为可读的 [在 c++
意义上]。
如果这样做,您会发现三分之二的符号是 std::whatever
,而不是 您的 符号。所以,他们是因为STL而被拉进来的。你可能无法控制它们。
其他符号是 grk_*,如果有帮助的话。
目标文件实用程序(例如 readelf
、objdump
、objcopy
等)可以让您 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
]后加一个