在linux上连接时出现“输出不能代表节”的错误

编译我的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”错误或者帮助我理解链接器的“非可expression部分输出”消息的实际意义,来指导如何解决此问题。

我已经检查过这是一致的行为,坚持一个make clean;make调用。

Solutions Collecting From Web of "在linux上连接时出现“输出不能代表节”的错误"

在ARM进行交叉编译时,我收到了“输出中无法表示的部分”错误,而且某些库没有正确使用-fPIC编译。 很确定这不是这里的错误,虽然…

请尝试从命令行中删除-fvisibility = hidden选项。 它会产生一个更大的对象(带有一些不必要的符号,因为它是可执行的,所以最终并不重要),但应该消除这个问题。 这不是一个解决办法; 而是一个解决方法。 请检查(这只是一个预感),如果库和GtkLauncher.o之间没有libc版本不匹配

我的答案是特定于hidden symbol (...) is referenced by DSO的组合hidden symbol (...) is referenced by DSONonrepresentable section on output错误。

简短的回答是:一个符号被标记为extern但也被标记为隐藏(参见Visibility(GCC wiki)和How to Write Shared Libraries(Ulrich Drepper) )。 没有对象或档案链接到满足依赖性,但共享对象链接到一个匹配的符号。

你可能使用-fvisibility=hidden进行了编译,无论是编译器添加的功能(如堆栈保护)还是其他的东西,代码中发出的符号都会覆盖libc_nonshared.a相同名称的未定义符号引用的缺省可见性libc_nonshared.a通常由libc.so满足。

你可以重现像这样的类似问题:

 #include <stdio.h> extern __attribute__((visibility ("hidden"))) FILE* open_memstream( char**, size_t* ); char* asdf; size_t mysize; FILE* blah() { return open_memstream( &asdf, &mysize ); } 

然后编译它:

 # with gcc 4.9.2: ~ gcc badcode.c -shared -fPIC -o libbad.so -lc /tmp/ccC0uG80.o: In function `blah': badcode.c:(.text+0x19): undefined reference to `open_memstream' /usr/bin/ld: /tmp/libbad.so: hidden symbol `open_memstream' isn't defined /usr/bin/ld: final link failed: Bad value # with gcc 4.4.7: ~ gcc badcode.c -shared -fPIC -o libbad.so -lc /tmp/cc2SHUFD.o: In function `blah': badcode.c:(.text+0x26): undefined reference to `open_memstream' /usr/bin/ld: /tmp/libbad.so: hidden symbol `open_memstream' isn't defined /usr/bin/ld: final link failed: Nonrepresentable section on output # with oracle solaris studio (still in Linux) 12.3: ~ cc -shared -Kpic -o /tmp/libbad.so badcode.c -lc badcode.o: In function `blah': badcode.c:(.text+0x32): undefined reference to `open_memstream' /usr/bin/ld: /tmp/libbad.so: hidden symbol `open_memstream' isn't defined /usr/bin/ld: final link failed: Nonrepresentable section on output 

简而言之:我已经向前声明了一个符号的存在,将其标记为隐藏,然后没有链接到满足依赖关系的静态库或对象文件中。 由于它被标记为隐藏, 必须满足依赖性,否则它是一个无效的ELF对象。

在我的具体情况下,一个标题是错误的#if路径,导致上面的open_memstream隐藏声明。