“Nonrepresentable l'article sur la sortie” erreur lors de la liaison sur linux
J'ai cette erreur à l'éditeur de liens scène lors de la compilation de la webkit-1.1.5 paquet sur mon Ubuntu 9.04 boîte:
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
J'aimerais avoir quelques conseils sur la façon de s'attaquer à ce problème, soit en se regardant dans le "caché sybmol" d'erreur ou de m'aider à comprendre ce que le "Nonrepresentable l'article sur la sortie" message de l'éditeur de liens ne signifie réellement.
J'ai déjà vérifié que cela est conforme comportement qui persiste à travers un make clean;make
invocation.
- J'ai trouvé ce même problème ici: osdir.com/ml/linux.hardware.karma.devel/2007-01/msg00038.html Dans ce cas, le problème était ld invocation explicite.
Vous devez vous connecter pour publier un commentaire.
J'ai reçu le "nonrepresentable l'article sur la sortie" erreur lors de la crosscompiling pour les BRAS et les bibliothèques n'a pas été correctement compilé avec-fPIC.
Assez sûr que ce n'est pas l'erreur ici, mais...
Ma réponse est spécifique à la combinaison de la
hidden symbol (...) is referenced by DSO
etNonrepresentable section on output
erreurs.La réponse courte est: un symbole a été marquée
extern
mais aussi marquée caché (voir Visibilité (GCC wiki) et Comment Écrire Des Bibliothèques Partagées (Ulrich Drepper)). Aucun des objets ou des services d'archives ont été liés à satisfaire la dépendance, mais un objet partagé était en lien avec un symbole correspondant.Vous avez probablement compilé avec
-fvisibility=hidden
, et si c'était un compilateur-ajout de la fonction (comme le protecteur de la pile) ou tout autre chose, le symbole émis dans votre code a remplacé la visibilité par défaut d'un symbole non défini de référence du même nom danslibc_nonshared.a
qui devraient normalement être satisfaits parlibc.so
.Vous pouvez reproduire un problème semblable à ceci:
... puis le compiler:
En bref: j'ai hâte déclaré l'existence d'un symbole, il a marqué caché, n'a pas de lien dans une bibliothèque statique ou fichier objet qui satisfait la dépendance. Puisque c'est marqué caché, la dépendance doit être satisfait, sinon c'est un invalide objet ELF.
Dans mon cas précis, un en-tête, c'était la mauvaise
#if
chemin et causant de la ci-dessus caché déclaration deopen_memstream
.Essayez d'enlever le -fvisibility=hidden option en ligne de commande. Il va produire un grand objet (avec certains symboles inutiles, qui ne sera pas question à la fin parce que c'est un execultable), mais devrait éliminer le problème. Ce n'est pas une solution, mais plutôt une solution de contournement. Veuillez vérifier (c'est juste une intuition) si il n'existe pas de version de la libc l'inadéquation entre les bibliothèques et les GtkLauncher.o