代码之家  ›  专栏  ›  技术社区  ›  nagul

在Linux上链接时出现“输出上不可显示的部分”错误

  •  9
  • nagul  · 技术社区  · 15 年前

    在我的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 调用。

    3 回复  |  直到 15 年前
        1
  •  8
  •   phb    15 年前

    当为ARM进行交叉编译时,我收到了“关于输出的不可呈现部分”错误,有些库没有用-fpic正确编译。 当然这不是错误…

        2
  •  6
  •   Brian Vandenberg    9 年前

    我的答案是 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 .

    您可以重现类似的问题:

    #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 .

        3
  •  5
  •   Robert Obryk    14 年前

    请尝试从命令行中删除-fvisibility=hidden选项。它将产生一个更大的对象(带有一些不必要的符号,这最终无关紧要,因为它是一个可执行的),但应该消除这个问题。这不是解决办法,而是权宜之计。如果库和gtklauncher之间没有libc版本不匹配,请检查(这只是一种预感)。