Связывание библиотеки функций C с программой сборки x86 в современном 64-битном Linux

Я просматриваю книгу, посвященную программированию x86 (профессиональный язык ассемблера, WROX 2005). У меня были некоторые проблемы прошлой ночью, и я надеялся разобраться с этим, прежде чем вернуться домой сегодня, чтобы я мог начать работу и продолжить текст. Моя машина работает под управлением x64 Ubuntu (11.04, если я не ошибаюсь), поэтому текст, посвященный 32-битной x86, немного «устарел» (мне нужно добавить --32 при сборке и т. д.).

Я пытаюсь динамически связать функции C-библиотеки с моей программой сборки, но мне это не удалось (приведенные ниже команды взяты из памяти).

ld -dynamic-linking /lib/ld-linux.so.2 -o complex -lc complex.o -m elf_i386

Выполнение вышеуказанной команды в Linux дает мне сообщение о том, что она не может понять -lc. Хорошо, поэтому я удалил его.

ld -dynamic-linking /lib/ld-linux.so.2 -o complex complex.o -m elf_i386

Затем я получаю уведомление о том, что «printf» не распознан. Надеялись, что динамический компоновщик свяжется с библиотекой, но, похоже, этого не произошло. Перейдя в \lib\, я не смог найти ld-linux.so.2 (как ни странно, это не выдало мне ошибку), но я нашел ld-linux-86-64.so.2. Мой код 32-битный, но я подумал, какого черта, давайте попробуем это:

ld -dynamic-linking /lib/ld-linux-86-64.so.2 -o complex complex.o -m elf_i386

Тем не менее это дало ту же ошибку, что «вызов printf» не был распознан.

Нужна помощь в динамическом связывании функций библиотеки C с моей 32-битной программой сборки с использованием 64-битного Linux и стандартных инструментов GNU.


person Wollan    schedule 31.10.2011    source источник


Ответы (3)


Похоже, вам нужно установить 32-битную среду выполнения C. В Fedora это:

yum install glibc-devel.i686

Но я не знаю названия эквивалентного пакета Ubunutu; возможно:

apt-get install libc6-dev-i386
person trojanfoe    schedule 31.10.2011
comment
Сделал трюк. ld-linker.so.2 появился в каталоге /lib. Рабочая команда была такой: ld -dynamic-linker /lib/ld-linker.so.2 -lc -o complexcomplex.o -melf_i386 - person Wollan; 01.11.2011

Попытки создать ld командную строку самостоятельно почти всегда плохая идея. Позвольте GCC сделать это за вас; он автоматически обрабатывает всевозможные тонкости, о которых вам не нужно беспокоиться. Для 32-битной программы вам нужен один специальный переключатель командной строки, -m32:

gcc -m32 -o complex complex.o

Если у вас есть больше .o файлов, просто сложите их стопкой в ​​конце. Если вам нужно связать какие-либо системные библиотеки, отличные от libc, поместите соответствующие -lwhatever опции после всех объектных файлов.

trojanfoe тоже правильно; 32-битная цепочка инструментов является необязательным компонентом. Но вам нужно больше, чем просто 32-битная библиотека C. Сначала попробуйте это:

apt-get install gcc-multilib

он должен тянуть большую часть того, что вам нужно.

person zwol    schedule 31.10.2011
comment
Спасибо за это. Запустите это, чтобы предотвратить подобные проблемы в других областях. Мне пришлось использовать -lc, чтобы заставить команду компоновщика работать, но я не уверен, почему. У ld не было '32' в качестве опции эмуляции (в ассемблере было что-то похожее, хотя и с --32), поэтому использовался elf_i386. - person Wollan; 01.11.2011
comment
Все, что вы упомянули, — это тонкости, о которых вы не хотите беспокоиться, и есть еще несколько других, о которые вы еще не споткнулись, но скоро споткнетесь. Серьезно, используйте драйвер компилятора для компоновки. Однако я не могу помочь вам с ассемблером (если вы на самом деле не используете GAS, но, похоже, он никому не нравится, я не знаю почему). - person zwol; 01.11.2011
comment
Конечно, это работает. _start нужно поменять местами с main, но это работает. gcc -m32 -o complexmain комплекс main.s - person Wollan; 01.11.2011
comment
gcc - лучший способ сделать эту работу. Не элегантно, но работает. - person Antonio Rizzo; 11.01.2015

Пожалуйста, попробуйте следующий порядок (предположим, что ваш файл кода - это try.s):

as  --32 -g -o try.o   try.s
ld -m elf_i386  -dynamic-linker /lib/ld-linux.so.2 -lc  -o try try.o

Для исполняемого файла формата x86-64:

as   -g -o try.o   try.s
ld  -dynamic-linker  /lib64/ld-linux-x86-64.so.2 -lc  -o try try.o
person GB Zheng    schedule 27.06.2017