Соберите и запустите программу i386 asm на Linux x86-64 с помощью as и ld - PullRequest
0 голосов
/ 02 ноября 2018

Итак, я новичок в asm и хочу скомпилировать небольшую программу, которая просто завершает работу с инструкциями i386 вместо инструкций x86-64. У меня есть x86-64 Ubuntu, которая отлично компилирует и запускает x86-64, но я не понимаю, как собрать и связать версию i386 на той же машине x86-64 (я установил i386 compat).

Я знаю, что на подобные вопросы уже даны ответы, но ни один из них не использует as и ld, чтобы сделать это, поэтому я не знаю точно, как я могу перевести эти решения для моей проблемы.

Для x86-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 в as и -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 Ответ

0 голосов
/ 02 ноября 2018

Это правильные команды для сборки и компоновки 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, или у вас есть собственное ядро.

...