Соберите и запустите программу i386 asm на Linux x86-64 с помощью as и ld
Итак, я новичок в asm и хочу скомпилировать небольшую программу, которая просто завершает работу с инструкциями i386 вместо инструкций x86-64. У меня есть x86-64 Ubuntu, которая отлично компилирует и запускает x86-64, но я не понимаю, как собрать и связать версию i386 на той же машине x86-64 (я установил i386 compat).
Я знаю, что на подобные вопросы уже отвечали, но никто из них не использует as
а также ld
сделать это так, я не знаю точно, как я мог бы перевести эти решения для моей проблемы.
Для х86-64 я использую as
а также ld
следующее:
# Assemble: as exit.s -o exit.o
# Linking: ld exit.o -o exit
Версия программы x86-32:
.section .data
.section .text
.globl _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
Сейчас.. Я искал, как это сделать, и узнал о --32
как и -m {arg}
в ld
но каждый раз, когда я компилирую его без ошибок архива, он выдает ошибку "Файл в неправильном формате".
Я попытался сделать ld с elf_i386 и i386linux следующим образом:
as --32 exit.s -o exit.o
ld -m elf_i386 exit.o -o exit
#Error: -bash: ./exit: cannot execute binary file: File in wrong format
ld -m i386linux exit.o -o exit
#Error: -bash: ./exit: cannot execute binary file: File in wrong format
Я хочу добавить, что для совместимости я установил эти пакеты, перечисленные на справочном форуме Ubuntu:
sudo dpkg --add-architecture i386
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo apt-get install multiarch-support
1 ответ
Это правильные команды для сборки и компоновки 32-битного статического исполняемого файла. ( Сборка 32-разрядных двоичных файлов в 64-разрядной системе (набор инструментов GNU))
Похоже, ваше ядро было собрано без CONFIG_COMPAT_BINFMT_ELF
Список исполняемых форматов в Linux, поэтому он не распознает 32-битные статические исполняемые файлы ELF как исполняемые. (Я думаю, что это соответствующая опция конфигурации ядра Linux.)
Или вы используете подсистему Windows для Linux, которая также не поддерживает 32-битный исполняемый файл.
WSL не поддерживает 32-битные int 0x80
ABI из 64-битных процессов тоже не будет работать. ( Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде?). Это как ядро Linux без CONFIG_IA32_EMULATION.
Пакеты libc для этого не важны. Вы создаете статический исполняемый файл, который не зависит от запуска других файлов.
После запуска ваших команд сборки в моей системе Arch Linux я получаю:
$ as --32 exit.s -o exit.o
$ ld -m elf_i386 exit.o -o exit
$ file exit
exit: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
$ ./exit ; echo $?
0
Так что все работает нормально, ваша система просто как-то сломана. Это не настоящая Ubuntu, или у вас есть собственное ядро.