2011-11-04 44 views
6

Tôi mới sử dụng chương trình Linux và đang cố gắng sử dụng thư viện BFD. Đây là mã hiện tại tôi đang cố gắng để biên dịch:Lỗi biên dịch bằng bfd.h trên Linux

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

bfd *abfd; 

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

Tôi đang sử dụng dòng lệnh sau đây để soạn thảo:

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

Và đang nhận được các lỗi sau đây:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o): Trong hàm 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: tham chiếu không xác định đến _sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections ': /build/buildd/binutils-2.21.53.20110810/builddir- đơn/BFD /../../ BFD/elflink.c: 6048: tài liệu tham khảo không xác định để lbasename' undefined reference to _sch_istable' collect2: ld trở về 1 lối tình trạng thực hiện: * [tất cả] Lỗi 1

Có có nhiều dòng lỗi hơn, bạn có thể xem here. Tôi chắc rằng có một lời giải thích đơn giản cho điều này nhưng nó đã khiến tôi bối rối trong một thời gian.

Để tóm tắt những gì tôi đã làm cho đến nay:

  • cài đặt sạch sẽ xây dựng của Ubuntu
  • gói cài đặt binutils-dev

Trả lời

3

Bạn cần phải tĩnh liên kết chương trình của bạn?

Nó biên dịch và chạy mà không có lỗi nếu bạn tự động liên kết nó thay vì:

gcc readInfo.c -o readInfo -lbfd 

tôi đã chạy vào một vấn đề mới khi cố gắng để làm cho nó liên kết tĩnh:

$ 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

Tôi đã không nhận ra rằng những gì tôi đã làm được liên kết tĩnh. Có một lý do tại sao liên kết tĩnh sẽ gây ra những lỗi này mặc dù? –

+0

'/ usr/lib/libbfd.so' phụ thuộc vào các thư viện động khác cho một số chức năng của nó - vì vậy phiên bản' .a' tĩnh cũng sẽ yêu cầu các thư viện tĩnh khác khi liên kết tệp thực thi cuối cùng của bạn. Tôi đang gặp khó khăn trong việc tìm ra cách để xây dựng nó tĩnh mặc dù. – sarnold

+0

Được rồi. Sẽ chấp nhận câu trả lời này vì nó sửa chữa vấn đề ngay lập tức nhưng nếu bạn sẽ rất biết ơn nếu cuối cùng bạn tìm thấy cách biên dịch tĩnh một cách chính xác quá :) –

2

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

Có vẻ như libbfd yêu cầu các tính năng từ libiberty, dl và z - điều này trên opensuse 13.1 x86_64 hôm nay với simi ứng dụng thử nghiệm nhỏ tầm thường.

1

nếu bạn sử dụng ubuntu cài đặt binutils-dev

sudo apt-get install binutils-dev 
Các vấn đề liên quan