#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':
objalloc_free_block’ /build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4892:неопределенная ссылка на
/build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4605:
undefined reference to_sch_istable' /usr/lib/libbfd.a(elflink.o): In
bfd_elf_size_dynamic_sections’: /build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c: 6048: неопределенная ссылка на
functionlbasename'
_sch_istable’ collect2: ld вернул 1 статус выхода make: * [все] Ошибка 1
undefined reference to
Есть еще много строк ошибок, которые вы можете просмотреть здесь. Я уверен, что этому есть простое объяснение, но это на некоторое время поставило меня в тупик.
Подводя итог тому, что я сделал до сих пор:
- Установлена чистая сборка 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 сегодня с аналогичным тривиальным тестовым приложением.