2011-11-04 13 views
6

Sono nuovo alla programmazione Linux e sto tentando di utilizzare la libreria BFD. Questo è il codice corrente che sto cercando di compilazione:Errori di compilazione che utilizzano bfd.h su Linux

#include <bfd.h> 
#include <stdlib.h> 

bfd *abfd; 

int main() { 
    bfd_init(); 
    abfd = bfd_openr("/home/mike/Desktop/testFunc/testProg", NULL); 
    return 0; 
} 

Sto usando la seguente riga di comando per la compilazione:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo 

E sto ottenendo i seguenti errori:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o): nella funzione elf_link_add_object_symbols': /build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4605: undefined reference to objalloc_free_block ' /build/build d/binutils-2.21.53.20110810/builddir-single/bfd /../../ bfd/elflink.c: 4892: riferimento non definito a _sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections ': /build/buildd/binutils-2.21.53.20110810/builddir- singola/BFD /../../ BFD/elflink.c: 6048: undefined reference to lbasename' undefined reference to _sch_istable collect2': ld returned 1 exit stato make: * [tutto] Error 1

ci ci sono molte più righe di errori, che è possibile visualizzare here. Sono sicuro che c'è una spiegazione semplice per questo, ma mi ha costretto per un po '.

Per riassumere quello che ho fatto finora:

  • installata generazione pulita di Ubuntu
  • pacchetto installato binutils-dev

risposta

3

Avete bisogno di collegare in modo statico il vostro programma?

Si compila e viene eseguito senza errori se si dinamicamente collegarlo invece:

gcc readInfo.c -o readInfo -lbfd 

ho incontrato un nuovo problema quando si cerca di renderlo statico legato:

$ 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 
+0

non mi rendo conto che quello che stavo facendo era staticamente collegamento. C'è una ragione per cui il collegamento statico avrebbe causato questi errori? –

+0

'/ usr/lib/libbfd.so' dipende da altre librerie dinamiche per alcune delle sue funzionalità - quindi la versione statica' .a' richiederà anche quelle altre librerie statiche quando si collega il file eseguibile finale. Sto avendo problemi a capire come costruirlo staticamente però. – sarnold

+0

OK. Accettare questa risposta poiché risolve il problema immediato, ma se ti sarei molto grato se alla fine avessi trovato anche come compilarlo staticamente correttamente :) –

2

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

Sembra che libbfd richieda le funzionalità di libiberty, dl e z - questo su opensuse 13.1 x86_64 oggi con simi lar test banale app.

1

se si utilizza installazione di Ubuntu-dev binutils

sudo apt-get install binutils-dev 
Problemi correlati