2011-11-04 133 views
6

我是Linux编程新手,试图使用BFD库。这是当前代码我试图编译:在Linux上使用bfd.h编译错误

#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 

而且正在以下错误:

GCC readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o):In function 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单/ BFD /../../ BFD/elflink.c:4892: 未定义参照_sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections': /build/buildd/binutils-2.21.53.20110810/builddir-单/ BFD /../../ BFD/elflink.c:6048: 未定义参照lbasename' undefined reference to _sch_istable” collect2:LD返回1退出 状态化妆:* [全部]错误1

有是更多的错误线,您可以查看here。我确信这有一个简单的解释,但它让我陷入了一段时间。

要总结一下我迄今所做的:

  • 安装干净的构建的Ubuntu
  • 安装的binutils-dev软件包

回答

3

你需要静态链接程序?

它编译无误的运行,如果动态地进行链接,而不是:试图使其静态链接时

gcc readInfo.c -o readInfo -lbfd 

我碰到了新的问题:

$ 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

我不知道,我在做什么是静态链接。是否有静态链接会导致这些错误的原因? –

+0

'/ usr/lib/libbfd.so'依赖于其他动态库的一些功能 - 所以静态'.a'版本在链接最终可执行文件时还需要其他静态库。我无法弄清楚如何静态构建它。 – sarnold

+0

好的。去接受这个答案,因为它解决了眼前的问题,但如果你最终发现如何正确静态编译它,我会非常感激:) –

2

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

看起来像libbfd需要来自libiberty,dl和z的功能 - openuseuse 13.1 x86_64今天带有simi lar琐碎的测试应用程序。

1

,如果你使用Ubuntu安装的binutils-dev的

sudo apt-get install binutils-dev