Ошибки компиляции с использованием bfd.h в Linux

#linux #gcc

#linux #gcc

Вопрос:

Я новичок в программировании на 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

Ответ №1:

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

 sudo apt-get install binutils-dev
  

Комментарии:

1. И в Fedora это sudo dnf install binutils-devel .

Ответ №2:

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

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

 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
  

Комментарии:

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

2. /usr/lib/libbfd.so Некоторые функции зависят от других динамических библиотек, поэтому статическая .a версия также потребует этих других статических библиотек при связывании вашего конечного исполняемого файла. Однако мне не удается понять, как его статически построить.

3. Хорошо. Собираюсь принять этот ответ, поскольку он устраняет непосредственную проблему, но если вы, я был бы очень признателен, если бы вы в конце концов нашли, как правильно статически скомпилировать его тоже 🙂

Ответ №3:

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

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