12
votes

Compiler des erreurs à l'aide de bfd.h sur Linux

Je suis nouveau à la programmation Linux et tente d'utiliser la bibliothèque BFD. C'est le code actuel que j'essaie de compiler: xxx

J'utilise la ligne de commande suivante pour la compilation: xxx

et am Obtenir les erreurs suivantes:

GCC Readinfo.c /usr/LIB/LIBBFD.A -O READINFO /USR/LIB/LIBBFD.A(FLINK.O): En fonction 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 à 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 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 à _sch_istable 'Collect2: LD retourné 1 sortie Etat de statut: * [toutes] erreur 1

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.

résumer ce que j'ai fait jusqu'à présent:

  • Installation de la construction propre d'Ubuntu
  • Installation de package BINUTILS-DEV

0 commentaires

3 Réponses :


3
votes

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


3 commentaires

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 dépend des autres bibliothèques dynamiques de certaines de ses fonctionnalités - de sorte que la version statique .a 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 :)



2
votes

gcc -v main.c -o bla /usr/lib64/libbfd.a /usr/lib64/libiberty.a -ldl -lz

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.


0 commentaires

21
votes

Si vous utilisez Ubuntu Installez BINUTILS-DEV

sudo apt-get install binutils-dev


0 commentaires