Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Linux 使用g+的符号可见性+; 我在LINU/MAC下编译了一个C++库,符号隐藏了。我对所有类都使用了\u属性((可见性(“隐藏”)),并使用选项(-c-O2-fPIC-MMD-MP-MF)编译。在Mac下,使用MacDependencies(http://code.google.com/p/macdependency/),这项工作做得很好,因为我只看到了我的出口(我实际上看到了前后的差异)_Linux_G++_Visibility_Symbols_Hidden - Fatal编程技术网

Linux 使用g+的符号可见性+; 我在LINU/MAC下编译了一个C++库,符号隐藏了。我对所有类都使用了\u属性((可见性(“隐藏”)),并使用选项(-c-O2-fPIC-MMD-MP-MF)编译。在Mac下,使用MacDependencies(http://code.google.com/p/macdependency/),这项工作做得很好,因为我只看到了我的出口(我实际上看到了前后的差异)

Linux 使用g+的符号可见性+; 我在LINU/MAC下编译了一个C++库,符号隐藏了。我对所有类都使用了\u属性((可见性(“隐藏”)),并使用选项(-c-O2-fPIC-MMD-MP-MF)编译。在Mac下,使用MacDependencies(http://code.google.com/p/macdependency/),这项工作做得很好,因为我只看到了我的出口(我实际上看到了前后的差异),linux,g++,visibility,symbols,hidden,Linux,G++,Visibility,Symbols,Hidden,然而,我注意到使用nm我仍然可以看到所有符号的名称。这在Mac和Linux下都会发生 为什么呢?有没有办法避免这种情况 致以最良好的问候和感谢, 乔公开或隐藏,符号仍然存在nm显示所有符号。不同之处在于,隐藏符号对动态链接器不可用,即不导出且不能插入 您可能还喜欢以下man gcc: -fvisibility=default|internal|hidden|protected ... A good explanation of the benefits offe

然而,我注意到使用nm我仍然可以看到所有符号的名称。这在Mac和Linux下都会发生

为什么呢?有没有办法避免这种情况

致以最良好的问候和感谢,

公开或隐藏,符号仍然存在<代码>nm显示所有符号。不同之处在于,隐藏符号对动态链接器不可用,即不导出且不能插入

您可能还喜欢以下
man gcc

   -fvisibility=default|internal|hidden|protected
       ...
       A good explanation of the benefits offered by ensuring ELF symbols
       have the correct visibility is given by "How To Write Shared
       Libraries" by Ulrich Drepper (which can be found at
       <http://people.redhat.com/~drepper/>)---however a superior solution
       made possible by this option to marking things hidden when the
       default is public is to make the default hidden and mark things
       public.  This is the norm with DLL's on Windows and with
       -fvisibility=hidden and "__attribute__ ((visibility("default")))"
       instead of "__declspec(dllexport)" you get almost identical
       semantics with identical syntax.  This is a great boon to those
       working with cross-platform projects.
-fvisibility=默认|内部|隐藏|保护
...
一个关于确保ELF符号的好处的好解释
“如何编写共享文件”给出了正确的可见性
Ulrich Drepper的“图书馆”(可在
)---然而,这是一个更好的解决方案
通过此选项,可以在
“默认为公共”是将默认设置隐藏并标记对象
公众。这是Windows和Windows上的DLL的规范
-fvisibility=隐藏和“_属性(可见性(“默认”))”
与“declspec(dllexport)”不同,您得到的几乎是相同的
具有相同语法的语义。这对那些人来说是一大福音
处理跨平台项目。
您可以使用二进制文件删除任何不需要的符号。

在OSX(不确定其他符号)上,我发现了以下内容

正如Maxim所提到的,使用
-fvisibility=hidden
\uuuuuu属性((可见性(“隐藏”))
仍然会将符号放在符号表中,它只是被标记为未报告。最简单的方法是使用
nm
,例如:

$ nm libfoo.dylib 
...
0000000000001fa0 t __Z10a_functionv
0000000000002140 T __Z17a_public_functionv
...
如果地址后的字母为小写,则表示未导出。此处
a_函数()
是隐藏的,并且
a_公共函数
具有默认可见性

要从符号表中删除未导出的符号,可以使用
strip-x
,根据手册页:

-删除所有本地符号(仅保存全局符号)


我相信(但不是100%确定)使用
hidden
不仅仅意味着改变一个标志,而且“取消隐藏”符号也不会是一件小事。

谢谢你,马克西姆,现在肯定有区别了。然而,另一个问题出现了:如何在Windows下看到这些符号的表格?再次感谢。可能是cygwin提供的
dependens.exe
nm
。再次感谢,我明天会试试。你知道有什么方法可以从nm的输出中删除这些符号吗?makr4o已经给了你答案:
nm--dynamic
nm--extern only
,这取决于你想要什么。对不起,我想说的是:有没有办法编译/link/strip/etc我的共享库,这样这些名称就不会用简单的“nm”来显示?在Linux上,您是否使用
nm-D
来显示动态符号表?可见性仅适用于动态符号表。nm-D确实为我提供了正确的“列表”,谢谢。谢谢!实际上,我试图在Netbeans中勾选“Strip”,但没有成功。我现在用手试着脱光所有的衣服,看起来我得到了我期待的结果。感谢所有参与的人!
strip-x
命令是我想要从表中完全删除本地符号的命令,即使用
nm
无法看到。
$ strip -x libfoo.dylib
$ nm libfoo.dylib 
...
0000000000002140 T __Z17a_public_functionv
...