Ошибки компиляции с использованием bfd.h в Linux - PullRequest
9 голосов
/ 04 ноября 2011

Я новичок в программировании на Linux и пытаюсь использовать библиотеку BFD.Это текущий код, который я пытаюсь скомпилировать:

#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): в функции 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/buildd/binutils-2.21.53.20110810 / builddir-single / 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-single/bfd/./../bfd/elflink.c:6048: неопределенная ссылка на lbasename' undefined reference to _sch_istable 'collect2: ld вернул 1 состояние выхода make: * [все] Ошибка 1

Есть намного больше строк ошибок, которые вы можете просмотреть здесь .Я уверен, что этому есть простое объяснение, но это на некоторое время поставило меня в тупик.

Подводя итог тому, что я сделал до сих пор:

  • Установлена ​​чистая сборка Ubuntu
  • Установленный пакет binutils-dev

Ответы [ 3 ]

11 голосов
/ 30 ноября 2015

если вы используете Ubuntu, установите binutils-dev

sudo apt-get install binutils-dev
3 голосов
/ 04 ноября 2011

Вам нужно статически связать вашу программу?

Она компилируется и запускается без ошибок, если вместо этого вы динамически связываете ее:

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
2 голосов
/ 04 мая 2015

gcc -v main.c -o бла /usr/lib64/libbfd.a /usr/lib64/libiberty.a -ldl -lz

Похоже, что для libbfd требуются функции из libiberty, dl и z - сегодня это на opensuse 13.1 x86_64 с похожим тривиальным тестовым приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...