2011-11-04 24 views
6

Linux programlamada yeniyim ve BFD kitaplığını kullanmaya çalışıyorum. derleme için aşağıdaki komut satırını kullanıyorumLinux'ta bfd.h kullanarak Hataları Derleme

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

bfd *abfd; 

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

:

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

Ve şu hataları alıyorum: Bu geçerli kod ben derlemek çalışıyorum edilir

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o): İşlev olarak 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: undefined başvuru _sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections ': /build/buildd/binutils-2.21.53.20110810/builddir- tek/bfd /../../ bfd/elflink.c: 6048: * [tüm] hata var 1

: ld 1 çıkış durum marka bulundu: tanımsız başvuru _sch_istable' collect2 lbasename' undefined reference to için here görüntüleyebileceğiniz çok daha fazla hata satırı vardır. Eminim bunun için basit bir açıklama var ama bir süredir beni şaşırttı.

şimdiye kadar yaptıklarını özetlemek gerekirse: Ubuntu

  • Yüklü temiz bir yapı
  • Yüklü binutils-dev paketi

cevap

3

Eğer statik olarak programınızı bağlamak gerekir mi?

hazırlar ve özdevimli bağlarsanız hatasız çalışır

: Ben yeni bir sorunla karşılaştık

gcc readInfo.c -o readInfo -lbfd 

statik olarak bağlantılı hale getirmek için çalışırken:

$ 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

yüklemek kullanırsam ne yaptığımı statik bağlama olduğunu fark etmedi. Statik olarak bağlantı kurmanın neden bu hatalara sebep olmasının bir nedeni var mı? –

+0

'/ usr/lib/libbfd.so', bazı işlevleri için diğer dinamik kitaplıklara bağlıdır. Bu nedenle, statik' .a 'sürümü, son yürütülebilir dosyanızı bağlarken diğer statik kitaplıkları da gerektirir. Gerçi statik olarak nasıl inşa edileceğini bulmakta zorlanıyorum. – sarnold

+0

Tamam. Anında sorunu çözdüğü için bu cevabı kabul etmek istiyorum ama eğer sonunda doğru şekilde statik olarak derlemeyi bulmuş olsaydınız çok minnettar olurdum. –

2

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

libbfd, libiberty, dl ve z'den özellikler gerektiriyor gibi görünüyor - this on opensuse 13.1 x86_64 bugün simi ile lar önemsiz test uygulaması.

1

Eğer ubuntu binutils-dev

sudo apt-get install binutils-dev 
İlgili konular