在我的Ubuntu 9.04机器上编译webkit-1.1.5包时,我在链接器阶段得到了这个错误:
libtool: link: gcc -ansi -fno-strict-aliasing -O2 -Wall -W -Wcast-align -Wchar-subscripts -Wreturn-type -Wformat -Wformat-security -Wno-format-y2k -Wundef -Wmissing-format-attribute -Wpointer-arith -Wwrite-strings -Wno-unused-parameter -Wno-parentheses -fno-exceptions -fvisibility=hidden -D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libsoup-2.4 -I/usr/include/libxml2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -O2 -o Programs/.libs/GtkLauncher WebKitTools/GtkLauncher/Programs_GtkLauncher-main.o -pthread ./.libs/libwebkit-1.0.so /usr/lib/libgtk-x11-2.0.so /usr/lib/libgdk-x11-2.0.so /usr/lib/libatk-1.0.so /usr/lib/libpangoft2-1.0.so /usr/lib/libgdk_pixbuf-2.0.so -lm /usr/lib/libpangocairo-1.0.so /usr/lib/libgio-2.0.so /usr/lib/libcairo.so /usr/lib/libpango-1.0.so /usr/lib/libfreetype.so -lfontconfig /usr/lib/libgmodule-2.0.so /usr/lib/libgobject-2.0.so /usr/lib/libgthread-2.0.so -lrt /usr/lib/libglib-2.0.so -pthread
make[1]: Leaving directory `/home/nagul/build_area/webkit-1.1.5'
WebKitTools/DumpRenderTree/gtk/TestNetscapePlugin/TestNetscapePlugin.cpp: In function ‘NPError webkit_test_plugin_get_value(NPP_t*, NPPVariable, void*)’:
WebKitTools/DumpRenderTree/gtk/TestNetscapePlugin/TestNetscapePlugin.cpp:221: warning: deprecated conversion from string constant to ‘char*’
WebKitTools/DumpRenderTree/gtk/TestNetscapePlugin/TestNetscapePlugin.cpp:224: warning: deprecated conversion from string constant to ‘char*’
WebKitTools/DumpRenderTree/gtk/TestNetscapePlugin/TestNetscapePlugin.cpp: In function ‘char* NP_GetMIMEDescription()’:
WebKitTools/DumpRenderTree/gtk/TestNetscapePlugin/TestNetscapePlugin.cpp:260: warning: deprecated conversion from string constant to ‘char*’
/usr/bin/ld: Programs/.libs/GtkLauncher: hidden symbol `__stack_chk_fail_local' in /usr/lib/libc_nonshared.a(stack_chk_fail_local.oS) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make[1]: *** [Programs/GtkLauncher] Error 1
make: *** [all] Error 2
字符串
我想要一些关于如何解决这个问题的指针,要么通过查看“隐藏的sybmol”错误,要么帮助我理解链接器中“输出上的不可表示部分”消息的实际含义。
我已经检查过,这是跨make clean;make
调用持续存在的一致行为。
4条答案
按热度按时间ipakzgxi1#
我在为ARM交叉编译时收到了“输出上的不可表示部分”错误,并且一些库没有正确地使用-fPIC编译。我很确定这不是这里的错误.
e4eetjau2#
我的答案是特定于
hidden symbol (...) is referenced by DSO
和Nonrepresentable section on output
错误的组合。简短的回答是:一个符号被标记为
extern
,但也被标记为隐藏(参见Visibility (GCC wiki)和How To Write Shared Libraries (Ulrich Drepper))。没有对象或档案被链接进来以满足依赖关系,但一个共享对象 * 被 * 链接进来匹配的符号。您可能使用
-fvisibility=hidden
编译,无论它是编译器添加的功能(如堆栈保护器)还是其他功能,代码中发出的符号都覆盖了libc_nonshared.a
中同名的未定义符号引用的默认可见性,而libc.so
通常会满足此条件。你可以重现类似的问题:
字符串
然后编译它:
型
简而言之:我已经向前声明了一个符号的存在,将其标记为隐藏,然后没有链接到满足依赖关系的静态库或对象文件。由于它被标记为隐藏,依赖关系 * 必须 * 满足,否则它是一个无效的ELF对象。
在我的具体案例中,一个头沿着错误的
#if
路径前进,导致上面的open_memstream
隐藏声明。a64a0gku3#
请尝试从命令行中删除-fvisibility=hidden选项。它将生成一个更大的对象(带有一些不必要的符号,这最终不会有问题,因为它是一个可执行的),但应该消除问题。这不是解决方案;而是一个解决方案。请检查(这只是一个预感)库和GtkLauncher之间是否没有libc版本不匹配。o
oxosxuxt4#
我在Linux上使用scons,也遇到了这个错误
ld: final link failed: Nonrepresentable section on output
。修复它的方法是卸载intel/2013.1,并加载intel/2020。这可能是特定于我的构建,但也许它会帮助其他人。在你的终端(我的shell是CSH)中,检查你加载的版本:
module list
个检查您的可用版本:
module avail
个然后你可以尝试卸载intel,然后加载一个不同的(在我的例子中是intel/2020):
module unload intel
个module load intel/2020
个