2011-11-04 13 views
6

Soy nuevo en la programación de Linux y estoy tratando de usar la biblioteca BFD. Este es el código actual estoy tratando de compilar:Errores de compilación utilizando bfd.h en Linux

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

bfd *abfd; 

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

estoy usando la siguiente línea de comandos para compilar:

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

Y estoy consiguiendo los errores siguientes:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o): en la función 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: referencia indefinida a _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: referencia indefinida a lbasename' undefined reference to _sch_istable' collect2: ld devolvió 1 salida estado de maquillaje: * [todos] Error 1

Hay hay muchas más líneas de errores, que puede ver here. Estoy seguro de que hay una explicación simple para esto, pero me ha dejado perplejo por un tiempo.

Para resumir lo que he hecho hasta ahora:

  • Instalado generación limpia de Ubuntu
  • paquete instalado binutils-dev

Respuesta

3

¿Es necesario enlazar estáticamente su programa?

Se compila y se ejecuta sin errores si se vincula dinámicamente en su lugar:

gcc readInfo.c -o readInfo -lbfd 

me he encontrado un nuevo problema cuando se trata de hacer que sea enlazado estáticamente:

$ 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

no me daba cuenta de que lo que estaba haciendo estaba enlazado estático. ¿Hay alguna razón por la que el enlace estático hubiera causado estos errores? –

+0

El '/ usr/lib/libbfd.so' depende de otras bibliotecas dinámicas para algunas de sus funciones, por lo que la versión estática' .a' también requerirá esas otras bibliotecas estáticas al vincular el ejecutable final. Sin embargo, estoy teniendo problemas para averiguar cómo construirlo estáticamente. – sarnold

+0

De acuerdo. Voy a aceptar esta respuesta, ya que soluciona el problema inmediato, pero si te lo agradecería mucho, finalmente encontraras cómo compilarlo estáticamente correctamente :) –

2

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

Parece que libbfd requiere características de libiberty, dl y z - esto en openSUSE 13.1 x86_64 hoy con simi aplicación de prueba trivial lar

1

si utiliza ubuntu instalar binutils-dev

sudo apt-get install binutils-dev 
Cuestiones relacionadas