提问人:nagul 提问时间:10/6/2009 更新时间:11/17/2023 访问量:34221
在 linux 上链接期间出现“输出上的非代表性部分”错误
"Nonrepresentable section on output" error during linking on 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”错误,要么帮助我理解来自链接器的“输出上的非表示部分”消息的实际含义。
我已经检查过这是在调用过程中持续存在的一致行为。make clean;make
答:
在对 ARM 进行交叉编译时,我收到了“输出上的非表示部分”错误,并且某些库未使用 -fPIC 正确编译。 不过,可以肯定的是,这不是这里的错误......
评论
请尝试从命令行中删除 -fvisibility=hidden 选项。它将生成一个更大的对象(带有一些不必要的符号,这最终无关紧要,因为它是一个可执行的),但应该可以消除这个问题。这不是一个解决方案;而是一种解决方法。请检查(这只是一种预感)库和GtkLauncher.o之间是否没有libc版本不匹配
评论
我的答案是针对 和 错误的组合。hidden symbol (...) is referenced by DSO
Nonrepresentable section on output
简短的回答是:符号被标记,但也被标记为隐藏(参见可见性 (GCC wiki) 和 如何编写共享库 (Ulrich Drepper))。没有链接任何对象或存档来满足依赖关系,但共享对象使用匹配的符号链接。extern
您可能使用 进行编译,无论是编译器添加的功能(如堆栈保护器)还是完全其他功能,代码中发出的符号都会覆盖同名的未定义符号引用的默认可见性,而该引用通常由 满足。-fvisibility=hidden
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
评论
我在 Linux 上使用 scens,也遇到了这个错误。修复它的是卸载 intel/2013.1,然后加载 intel/2020。这可能特定于我的构建,但也许它会帮助其他人。ld: final link failed: Nonrepresentable section on output
在您的终端(我的 shell 是 CSH)中,检查您加载的版本:
module list
检查您的可用版本:
module avail
然后你可以尝试卸载 intel,并加载一个不同的(在我的情况下是 intel/2020):
module unload intel
module load intel/2020
评论