Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐藏C++;具有-fvisibility=隐藏的符号 我有一个C++的C++库,我已经设置了 -fciste=隐藏< /COD>编译器标志, 然后我在C API方法上设置了\uuuuuuuuuu属性((可见性(“默认”)) 但是,我仍然看到可见的C++符号。当我为我的库创建debian包时, 我得到以下信息_C++_C_Gcc_Clang_Shared Libraries - Fatal编程技术网

隐藏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