2011-11-04 20 views
6

Jestem nowy w programowaniu Linuksa i próbuję użyć biblioteki BFD. Jest to aktualny kod Próbuję skompilować:Błędy kompilacji przy użyciu bfd.h w systemie Linux

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

bfd *abfd; 

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

Używam następujący wiersz polecenia do kompilacji:

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

I otrzymuję następujące błędy:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o): W funkcji 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: niezdefiniowane odniesienie do _sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections ': /build/buildd/binutils-2.21.53.20110810/builddir- single/BFD /../../ BFD/elflink.c: 6048: niezdefiniowana odniesienia do lbasename' undefined reference to _sch_istable”collect2: ld zwróconym 1 Zakończ markę Status: * [ALL] błąd 1

Nie to o wiele więcej linii błędów, które można zobaczyć here. Jestem pewien, że jest to proste wyjaśnienie, ale przez pewien czas mnie to zaskoczyło.

Podsumowując to, co zrobiłem do tej pory:

  • Zainstalowane czystą kompilację Ubuntu
  • Zainstalowany pakiet binutils-dev

Odpowiedz

3

Czy trzeba statycznie powiązać program?

To kompiluje i działa bez błędu, jeśli dynamicznie połączyć go zamiast:

gcc readInfo.c -o readInfo -lbfd 

jakie napotkasz nowy problem, gdy próbuje zrobić to statycznie powiązane:

$ 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

nie zdawałem sobie sprawy, że to co robię było statycznie łączenie. Czy istnieje powód, dla którego statyczne połączenie spowodowałoby te błędy? –

+0

'/ usr/lib/libbfd.so' zależy od innych bibliotek dynamicznych dla niektórych jego funkcji - więc statyczna wersja' .a' będzie wymagać również innych bibliotek statycznych podczas łączenia końcowego pliku wykonywalnego. Mam jednak problem ze statycznym budowaniem go. – sarnold

+0

W porządku. Przyjmę tę odpowiedź, ponieważ rozwiązuje ona natychmiastowy problem, ale jeśli byłbym bardzo wdzięczny, gdyby w końcu udało się jej poprawnie skompilować statycznie :) –

2

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

Wygląda na to, że libbfd wymaga funkcji od libiberty, dl iz - to na opensuse 13.1 x86_64 dzisiaj z simi wielka, trywialna aplikacja testowa.

1

jeśli używasz ubuntu zainstalować binutils-dev

sudo apt-get install binutils-dev 
Powiązane problemy