Итак, я новичок в 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