Ошибка компиляции с использованием кодов libopcodes

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

OP говорит, что вы можете связать с -lbfd -lopcodes.

Однако для OpenSuSE я обнаружил, что для libbfd мне нужно -lbfd -liberty -lz -ldl

При попытке скомпилировать вот мои результаты:

make

gcc ./main.c -lbfd -liberty -lz -ldl -lopcodes -g -o bfd_se

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/libopcodes.a(arm-dis.o): In function `print_insn_neon':
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/arm-dis.c:2927: undefined reference to `floatformat_ieee_single_little'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/arm-dis.c:2927: undefined reference to `floatformat_to_double'
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/libopcodes.a(m68k-dis.o): In function `print_insn_arg':
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1103: undefined reference to `floatformat_m68881_ext'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1103: undefined reference to `floatformat_to_double'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1099: undefined reference to `floatformat_ieee_double_big'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1099: undefined reference to `floatformat_to_double'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1095: undefined reference to `floatformat_ieee_single_big'
/home/abuild/rpmbuild/BUILD/binutils-2.24/build-dir/opcodes/../../opcodes/m68k-dis.c:1095: undefined reference to `floatformat_to_double'
collect2: error: ld returned 1 exit status
Makefile:4: recipe for target 'bfd_se' failed
make: *** [bfd_se] Error 1

Какие еще флаги мне нужно добавить, чтобы эта программа скомпилировалась? Я вижу, что ошибка связана с разными архитектурами, но я не пытаюсь выполнить кросс-компиляцию.

Спасибо!

полезная информация: uname -a

Linux node 4.0.5-THS_on #1 SMP PREEMPT Thu Jun 18 16:37:06 CDT 2015 x86_64 x86_64 x86_64 GNU/Linux

gcc --version

gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064]
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

objdump --version (использует libbfd и libopcodes)

GNU objdump (GNU Binutils; openSUSE 13.2) 2.24.0.20140403-6.1
Copyright 2013 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

person SailorCire    schedule 22.01.2016    source источник


Ответы (1)


В большинстве случаев libbfd и libopcodes не входят в качестве разделяемых библиотек в стандартные дистрибутивы (потому что они не предназначены для связывания). Вы должны либо установить ссылку на статические библиотеки (libbfd.a и libopcodes.a), либо перекомпилировать свой дистрибутив и включить в него разделяемые библиотеки (.so файлы).

Итак, чтобы было понятно, попробуйте:

gcc ./main.c -liberty -lz -ldl -g -o bfd_se /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/libopcodes.a /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/libbfd.a 
person perror    schedule 22.01.2016
comment
Я установил binutils-dev, но позвольте мне попробовать это очень быстро - person SailorCire; 22.01.2016
comment
Не работает с .a, но работает с .so, и находится в том же каталоге, что и libbfd.so. Любые идеи? - person SailorCire; 22.01.2016
comment
Я имел в виду, что вы должны попробовать сделать следующее: gcc ./main.c -liberty -lz -ldl -g -o bfd_se /usr/lib/libopcodes.a /usr/lib/libbdf.a (или как там путь к обеим библиотекам). - person perror; 22.01.2016
comment
Проблема в том, что это было бы не очень удобно. : - / - person SailorCire; 22.01.2016
comment
Напротив, но будет больше, чем нужно. В любом случае попробуйте поискать libbfd*.so и libopcodes*.so в вашем дистрибутиве, если вы их не найдете, значит, в этом проблема. Я знаю, что в Debian (нестабильный) пакет binutils-dev есть .so файлы, но во многих дистрибутивах это не так. - person perror; 22.01.2016
comment
Однако у меня есть .so для обеих библиотек. Я не думаю, что это переносимо, потому что в моем случае они находятся в / usr / lib64; однако кто-то может скомпилировать binutils из исходного кода, и тогда файлы будут располагаться в / usr / local / lib. - person SailorCire; 22.01.2016
comment
Итак, решение простое. Вы можете решить вашу проблему, используя эту строку компиляции: gcc ./main.c -lbfd -liberty -lz -ldl -lopcodes -g -o bfd_se -L/usr/lib64. И теперь, когда я думаю об этом, вам может также понадобиться получить пакет multiarch (похоже, он застрял на архитектурах ARM). - person perror; 22.01.2016
comment
Хм ... похоже, это часть более серьезной проблемы, связанной со ссылками. Я приму этот ответ, но вскоре опубликую еще один вопрос. - person SailorCire; 29.01.2016
comment
На самом деле, я точно знаю вашу проблему, потому что она у меня тоже была. Пока не нашел хорошего решения, чтобы от него избавиться. Итак, я полностью понимаю, что мой ответ вас не удовлетворяет. Я не буду винить вас за это, поверьте мне. :-) - person perror; 29.01.2016
comment
Ну, я использую отдельную программу, я могу использовать libopcodes; однако при интеграции в более крупный проект он создаст файл .o, но не сможет связать все с основным. - person SailorCire; 29.01.2016
comment
Правильное решение (для части моей программы) - использовать foo_LDADD вместо foo_LDFLAGS. При объединении всех объектных файлов вместе библиотеки должны идти после, а не до. - person SailorCire; 10.02.2016