11

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

「hiddensybmol」エラーを調べるか、リンカからの「出力の表現できないセクション」メッセージが実際に何を意味するのかを理解するのを手伝って、この問題を攻撃する方法についていくつかのポインタが必要です。

make clean;makeこれが呼び出し全体で持続する一貫した動作であることをすでに確認しました。

4

3 に答える 3

8

ARM のクロスコンパイル時に「出力で表現できないセクション」エラーが発生し、一部のライブラリが -fPIC で正しくコンパイルされませんでした。ここでのエラーではないことは確かですが...

于 2009-10-05T22:37:40.000 に答える
7

hidden symbol (...) is referenced by DSO私の答えは、とNonrepresentable section on outputエラーの組み合わせに固有のものです。

簡単な答えは: シンボルはマークされましexternたが、非表示にもマークされました (可視性 (GCC wiki)および共有ライブラリの書き方 (Ulrich Drepper) を参照)。依存関係を満たすためにリンクされたオブジェクトまたはアーカイブはありませんでしたが、一致するシンボルで共有オブジェクトがリンクされました。

でコンパイルした可能性があり、それがコンパイラによって追加された機能 (スタック プロテクターなど) であろうと、まったく別のものであろうと-fvisibility=hidden、コードで発行されたシンボルは、同じ名前の未定義のシンボル参照のデフォルトの可視性をオーバーライドしました。 .libc_nonshared.alibc.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

于 2015-10-07T22:28:12.790 に答える
5

コマンドラインから-fvisibility=hiddenオプションを削除してみてください。それはより大きなオブジェクトを生成します(いくつかの不要なシンボルがありますが、実行可能であるため、最終的には問題になりません)が、問題を解消するはずです。これは解決策ではありません。むしろ回避策。ライブラリとGtkLauncher.oの間にlibcバージョンの不一致がないかどうかを確認してください(これは単なる予感です)。

于 2009-11-21T10:29:26.727 に答える