隐藏C++;具有-fvisibility=隐藏的符号 我有一个C++的C++库,我已经设置了 -fciste=隐藏< /COD>编译器标志, 然后我在C API方法上设置了\uuuuuuuuuu属性((可见性(“默认”)) 但是,我仍然看到可见的C++符号。当我为我的库创建debian包时, 我得到以下信息
为什么这些符号仍然可见?您应该通过隐藏C++;具有-fvisibility=隐藏的符号 我有一个C++的C++库,我已经设置了 -fciste=隐藏< /COD>编译器标志, 然后我在C API方法上设置了\uuuuuuuuuu属性((可见性(“默认”)) 但是,我仍然看到可见的C++符号。当我为我的库创建debian包时, 我得到以下信息,c++,c,gcc,clang,shared-libraries,C++,C,Gcc,Clang,Shared Libraries,为什么这些符号仍然可见?您应该通过c++filt运行符号文件,该文件将“损坏”的符号名称转换为[在c++意义上]可读的名称 如果这样做,您会发现三分之二的符号是std::whatever,而不是您的符号。因此,由于STL,他们被拉了进来。你可能无法控制它们 如果有帮助的话,其他符号是grk_* 有一些对象文件实用程序(例如,readelf、objdump、objcopy等)可用于编辑/修补对象文件 或者,您可以使用链接器脚本 或者,您可以使用-S进行编译以获得.S文件。然后,您可以编写一个[pe
c++filt
运行符号文件,该文件将“损坏”的符号名称转换为[在c++
意义上]可读的名称
如果这样做,您会发现三分之二的符号是std::whatever
,而不是您的符号。因此,由于STL,他们被拉了进来。你可能无法控制它们
如果有帮助的话,其他符号是grk_*
有一些对象文件实用程序(例如,
readelf
、objdump
、objcopy
等)可用于编辑/修补对象文件
或者,您可以使用链接器脚本
或者,您可以使用-S
进行编译以获得.S
文件。然后,您可以编写一个[perl/python]脚本来修改asm源代码,并添加/更改更改可见性所需的任何属性。然后,只需执行:c++-c modified.s
对于给定的符号(例如):
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
]之后]添加一个指令。它们是导入的符号吗?你不能隐藏这些符号谢谢,我在库中有一个静态C++ 11线程池,这些符号看起来是引用那个线程池的。你应该通过<代码> C++ +文件> /CODEL运行你的符号文件,它将“被损坏的”符号名转换成可读的[在<代码> C++ +/Calp>感觉】。如果这样做,您会发现三分之二的符号是std::whatever
,而不是您的符号。因此,由于STL,他们被拉了进来。你可能无法控制它们。其他符号是grk.*
,如果有帮助的话。啊,好的。那么,我应该将过滤后的符号文件作为lib*.symbols文件吗?这是脚本:sed的/\(\u.*\)\(.*\)/(c++“\1”\2/”libgrokj2k.symbols | c++filt
有一些对象文件实用程序(例如,readelf
,objdump
,objcopy
,等等),可以让您编辑/修补对象文件。或者,您可以使用链接器脚本。或者,您可以使用-S
进行编译以获得.S
文件。然后,您可以编写一个[perl/python]脚本来修改asm源代码,并添加/更改更改可见性所需的任何属性。然后,只需执行:c++-c modified.s
再次感谢。我仍然有点困惑:为什么只有这些特殊的STL符号可见?我正在使用很多其他STL函数,但它们似乎没有出现在列表中。
.hidden main