Je suis nouveau à la programmation Linux et tente d'utiliser la bibliothèque BFD. C'est le code actuel que j'essaie de compiler: J'utilise la ligne de commande suivante pour la compilation: p> et am Obtenir les erreurs suivantes: P> GCC Readinfo.c /usr/LIB/LIBBFD.A -O READINFO
/USR/LIB/LIBBFD.A(FLINK.O): En fonction
Il y a beaucoup plus de lignes d'erreurs, que vous pouvez afficher ici . Je suis sûr qu'il y a une explication simple pour cela, mais cela m'a pris de temps pendant un moment. P> résumer ce que j'ai fait jusqu'à présent: p>
elf_link_add_Object_symbols ':
/build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4605:
Référence non définie à code> objalloc_free_block '
/build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4892:
Référence non définie à
_sch_istable '/usr/lib/libbfd.a(Flink.o):
fonction code> bfd_elf_size_dynamic_sections ':
/build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:6048:
Référence non définie à
lbasename '
Référence non définie à code> _sch_istable 'Collect2: LD retourné 1 sortie
Etat de statut: * em> [toutes] erreur 1 p>
BlockQuote>
3 Réponses :
Avez-vous besoin de relier statiquement votre programme?
Il compile et fonctionne sans erreur si vous le liez dynamiquement à la place: P>
$ gcc readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a -o readInfo /usr/bin/ld.bfd.real: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/x86_64-linux-gnu/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie collect2: ld returned 1 exit status $ gcc -fPIE readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a \ -o readInfo /usr/bin/ld.bfd.real: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/x86_64-linux-gnu/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie collect2: ld returned 1 exit status $ gcc -fPIE -pie readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a \ -o readInfo /usr/bin/ld.bfd.real: /usr/lib/libbfd.a(opncls.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/lib/libbfd.a: could not read symbols: Bad value collect2: ld returned 1 exit status $ gcc -fPIC -fPIE -pie readInfo.c /usr/lib/libbfd.a \ /usr/lib/x86_64-linux-gnu/libc.a -o readInfo /usr/bin/ld.bfd.real: /usr/lib/libbfd.a(opncls.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/lib/libbfd.a: could not read symbols: Bad value collect2: ld returned 1 exit status
Je n'ai pas réalisé que ce que je faisais était de manière statique. Y a-t-il une raison pour laquelle la liaison statique aurait causé ces erreurs?
Le /usr/lib/libbfd.so code> dépend des autres bibliothèques dynamiques de certaines de ses fonctionnalités - de sorte que la version statique
.a code> nécessitera également ces autres bibliothèques statiques lors de la liaison votre exécutable final. J'ai du mal à comprendre comment le construire statiquement cependant.
Bien. Aller accepter cette réponse puisqu'il corrige le problème immédiat, mais si vous je serais très reconnaissant si vous avez finalement trouvé comment correctement la compiler statiquement statiquement :)
gcc -v main.c -o bla /usr/lib64/libbfd.a /usr/lib64/libiberty.a -ldl -lz p>
On dirait que libbfd nécessite des fonctionnalités de Libiberty, DL et Z - Ceci sur OpenSUSE 13.1 x86_64 Aujourd'hui avec une application de test triviale similaire. P>
Si vous utilisez Ubuntu Installez BINUTILS-DEV
sudo apt-get install binutils-dev