11
votes

"Section non prescrite sur la sortie" Erreur lors de la liaison sur Linux

Je reçois cette erreur sur la phase de liaison lors de la compilation du package WebKit-1.1.5 sur ma boîte Ubuntu 9.04: xxx

J'aimerais quelques indications sur la façon d'attaquer ce problème, Soit en regardant dans l'erreur "Hidden Sybmol" ou en m'aidant à comprendre ce que la "section non prescrite sur la sortie" de la liaison signifie réellement.

J'ai déjà vérifié qu'il s'agit d'un comportement cohérent qui persiste sur un crée propre; faire Invocation.


1 commentaires

J'ai trouvé le même problème ici: OSDIR.com/ml /Linux.hardware.karma.devel/2007-01/msg00038.htm l Dans ce cas, le problème était l'invocation LD explicitement.


3 Réponses :


8
votes

J'ai reçu l'erreur "section non prescrite sur la sortie" lorsque la pivotement croisée pour le bras et certaines des bibliothèques n'étaient pas correctement compilées avec -fic. À peu près sûr que ce n'est pas l'erreur ici si ...


1 commentaires

C'était notre problème: plusieurs compilateurs de bras, ce qui entraîne la "section non prescrite de la sortie". Ajouter -fic résolut le problème.



5
votes

S'il vous plaît essayez de supprimer le -fvisibilité = option cachée à partir de la commande Commandline. Il produira un objet plus important (avec certains symboles inutiles, qui n'auront pas d'importance à la fin, car c'est une exécutable), mais devrait éliminer le problème. Ce n'est pas une solution; plutôt une solution de contournement. Veuillez vérifier (ceci est juste une hunch) s'il n'y a pas de désactivation de la version libc entre bibliothèques et gtklauncher.o


1 commentaires

ressemble à -fvisibilité = caché est une fonctionnalité quelque peu nouvelle dans GCC. Ou les docs n'ont pas été mis à jour et disent toujours que c'est nouveau ... peut-être que vous vous inquiétez avec des contrôles de sécurité ajoutés compilateurs à défendre contre les attaques de pile (Stack_chk ...), si un code a été compilé avec des défenses allumées , et certains n'était pas?



7
votes

Ma réponse est spécifique à la combinaison du symbole masqué (...) est référencée par DSO code> et section non prescritoire sur la sortie code> erreurs.

La réponse courte est: un symbole a été marqué extern code> mais aussi marqué caché (voir Visibilité (GCC Wiki) et Comment écrire des bibliothèques partagées ( Ulrich Drepper) ). Aucun objet ou archives n'a été lié pour satisfaire la dépendance, mais un objet partagé était lié à un symbole correspondant. P>

Vous avez probablement compilé avec -fvisbilibieux = caché , et s'il s'agissait d'une fonctionnalité de compilation ajoutée (comme un protecteur de pile) ou autre chose entièrement, le symbole émis dans votre code survolez la visibilité par défaut d'une référence de symbole non définie du même nom dans libc_nonshared.a qui serait normalement satisfait par libc.so code>. p>

Vous pouvez reproduire un problème similaire comme celui-ci: p> xxx pré>

... puis la compilant: P>

# 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


2 commentaires

Whoa ... la ressuscité est correcte, mais 6 ans après le fait? Je ne suis pas sûr que l'op est toujours la programmation ...


N'oubliez pas que longtemps après que vous soyez mort, en supposant que cela réponde à leur objectif, les gens utiliseront toujours tout ce qui est affiché ici et serait potentiellement intéressé par des problèmes que nous traitons maintenant.