- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在将某些共享库与 g++ 链接时遇到问题。它给了我一个警告,例如:
hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
我已经阅读了一些关于特定问题的相关问题,但我想整体理解它——这个警告是什么意思,原因是什么:
最佳答案
什么是 DSO?
DSO 是一个动态共享对象,或者不太正式的 shared library .
什么是隐藏符号?
隐藏符号是一个符号(即函数或数据对象的名称)已使用隐藏链接编译,例如根据(特定于 GCC)声明:
int x __attribute__ ((visibility ("hidden")));
如果在一个 DSO 中定义了 x
,则动态链接不能从一个 DSO 中引用它不同的 DSO。链接器可以看到x
(不是static
),但不是可用于动态链接。文档 here
如果隐藏了怎么引用?
不可能,这是你被警告的。例如。链接时警告:
hidden symbol `stat' in /usr/lib/libc_nonshared.a(stat.oS) is referenced by DSO
告诉您链接中的 DSO 引用了符号 stat
,并且链接器可以在 /usr/lib/libc_nonshared.a
中找到 stat
的定义,但是(显然)该定义不在引用它的 DSO 中并且无法从该 DSO 中引用,因为它是隐藏的。
如果问题 DSO 未正确构建以供使用,则会出现此问题作为 DSO。见 this example并跟进解决方案。
继续 OP 的跟进
If hidden symbol is already referenced by some DSO, then why the problem is with DSO?
链接器说:
DSO X
包含对符号 S
的引用。我可以找到符号S
的定义是另一个链接模块Y
,但该定义将无法满足 X
动态 中的引用(即 在运行时),因为 S
具有Y
中的隐藏链接。
I can confirm that the problem comes with a non-shared object [...][but] I don't explicitly hide those symbols in my non-shared object.
您可能没有明确标记非共享对象中隐藏的任何符号。根据它的构建方式,符号默认情况下可能隐藏,除非明确标记否则。
假设非共享对象是libnonshared.a
,据称隐藏的符号是foo
。运行:
objdump -t libnonshared.a
获取有关 libnonshared.a
中符号的信息。在输出中,查找 foo
的条目。它是否包含标签 .hidden
? - 例如
0000000000000000 g F .text 000000000000000b .hidden foo
这个条目说 foo
是一个全局符号(标记为 g
- 这就是链接器能够看到它的原因)但是它是隐藏的用于动态链接。
如果是这种情况,那么您需要修复 libnonshared.a
的构建,以便它不会隐藏 foo
。如果没有,那我就难住了。
关于c++ - 关于 DSO 引用隐藏符号的警告到底意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696585/
我有一个 DSO(mylibrary.so.0 库),带有一个标记为 extern "C" 的 func1 函数,我'我确定它已导出,因为 nm -D mylibrary.so.0 | grep fu
user@pc ~/hiddensymbols % cat main.cpp __attribute__((visibility ("hidden"))) int f_b1(void){ return
我正在学习谷歌测试。我下载了 gtest,运行命令 ./configure 和 make 并以 结束 $ sudo cp -a include/gtest /usr/include $ sudo cp
这个问题在这里已经有了答案: libpthread.so.0: error adding symbols: DSO missing from command line (16 个答案) Linking
假设我正在创建共享对象库 libz.so,其中包含一个头文件(例如 stdio.h)。作为 libc 库一部分的 stdio.h 代码在系统中静态链接。动态链接器如何解析从 DSO 到静态链接的 li
我正在尝试在 linux 下编译 qt ffmpeg 包装器简单编码/解码示例 QTFFmpegWrapper source # Set list of required FFmpeg librari
我遇到了一个令人难以置信的链接器问题。我有两个动态 .so 库,一个定义了 gpr_log(称为 libgpr.so),另一个使用它(称为 libgrpc++.so). 我正在尝试像这样链接一个可执行
我在将某些共享库与 g++ 链接时遇到问题。它给了我一个警告,例如: hidden symbol XXX in YYY is referenced by DSO /usr/lib/... 我已经阅读了
我想构建一个 OpenSSL RSA 引擎,从 this existing source code file 开始这是英特尔实现的一种更快的方法。首先,我想构建这段代码,所以我使用这些命令: gcc
我在设置共享库的可见性时遇到问题。我想寻求帮助以解决我的问题,如下所述: 我有一堆源文件,我想将它们构建为共享库: +Base |_Parameter | |_Parameter.h | |_Para
我尝试使用我的 asr 插件运行 unimrcpserver v1.0,它运行良好(在 Windows 7 上),但是当我尝试在另一台计算机(Windows Server 2003)中运行它时,我收到
我有一个正在运行的服务器(正在将其转变为开发服务器,但首先需要一些东西),所以我们不想重新编译 php 来破坏任何东西。 在新服务器上,我们有 mysql.so 和 mysqli.so 的动态扩展我无
关于包含静态成员变量的 C++ 模板类以及从动态库或共享对象中导出它们的问题很多。但这一个更深一些:如果有多个共享对象,每个共享对象都有自己的一组实例化,但可能使用来自另一个共享对象的实例化,该怎么办
我有一个已经编译/链接的 DSO 文件,它导出了一些确实必须隐藏的函数。当我尝试将我的代码链接到该库时 - 它会选择那些不需要的符号而不是我自己的符号。我无权访问源代码,因此我无法重建二进制文件并为不
我正在尝试通过使用 Cmake 再次编译所有内容,将一个 c++ 项目从 Windows 转换为 Debian。 我不太习惯在 Linux 上工作,但我已经设法正确安装了所有东西。 这是错误: /us
我编译php7如下 ./configure --enable-bcmath --with-bz2 --enable-calendar --enable-exif --enable-dba --enab
我最近试图从第 3 方 DSO 中隐藏一些符号,并遇到了用于创建“过滤器 DSO”的“--filter”LD 选项。来自ld manpage ,我的印象是动态链接器只会考虑过滤器 DSO 的 dyns
我尝试从我的实验室编译一个项目,我使用 ccmake 对原始代码进行的唯一更改是: CMAKE_CXX_COMPILER /usr/bin/clang++ CMAKE_CXX_FLAGS -f
我正在针对我编写的共享库编译程序。该库又依赖于 Boost::program_options(以及其他库)。当我编译我的程序时,我当然需要提及我的库,但是我得到一个 DSO 错误: g++ ism_c
这实际上似乎是一个常见问题,我以为我找到了答案,但由于某种原因它不起作用。我有一个使用 GTK2 库的项目,在第一次编译和链接时,我收到错误“libgtk-x11-2.0.so.0:添加符号时出错:命
我是一名优秀的程序员,十分优秀!