Assemble 和 运行 x86-64 上的 i386 asm 程序 Linux 使用 as 和 ld
Assemble and run i386 asm program on x86-64 Linux with as and ld
所以我是 asm 的新手,我想编译一个只使用 i386 指令而不是 x86-64 指令退出的小程序。我有一个可以完美编译的 x86-64 Ubuntu 和 运行 x86-64 一个,但我不明白如何 assemble 和 link i386 版本相同x86-64机器(我已经安装了i386 compat)。
我知道已经回答了类似的问题,但是 none 他们使用 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 , %eax
movl [=14=], %ebx
int [=14=]x80
现在..我一直在寻找如何做到这一点,并找到了 as 中的 --32
和 ld
中的 -m {arg}
但是每次我编译它时都没有arch errors 它给了我 "File in wrong format" 错误。
我试过像这样用 elf_i386 和 i386linux 做 ld:
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
这些是组装和链接 32 位静态可执行文件的正确命令。 (Assembling 32-bit binaries on a 64-bit system (GNU toolchain))
看起来您的内核是在没有 CONFIG_COMPAT_BINFMT_ELF
List of executable formats on Linux 的情况下构建的,因此它无法将 32 位 ELF 静态可执行文件识别为可执行文件。 (我认为这是相关的 Linux 内核配置选项。)
或者您正在为 Linux 使用 Windows 子系统,它也不支持 32 位可执行文件。
WSL 也不支持来自 64 位进程的 32 位 int 0x80
ABI,因此这也行不通。 ()。就像没有 CONFIG_IA32_EMULATION.
的 Linux 内核
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,要么你有一个自定义内核。
所以我是 asm 的新手,我想编译一个只使用 i386 指令而不是 x86-64 指令退出的小程序。我有一个可以完美编译的 x86-64 Ubuntu 和 运行 x86-64 一个,但我不明白如何 assemble 和 link i386 版本相同x86-64机器(我已经安装了i386 compat)。
我知道已经回答了类似的问题,但是 none 他们使用 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 , %eax
movl [=14=], %ebx
int [=14=]x80
现在..我一直在寻找如何做到这一点,并找到了 as 中的 --32
和 ld
中的 -m {arg}
但是每次我编译它时都没有arch errors 它给了我 "File in wrong format" 错误。
我试过像这样用 elf_i386 和 i386linux 做 ld:
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
这些是组装和链接 32 位静态可执行文件的正确命令。 (Assembling 32-bit binaries on a 64-bit system (GNU toolchain))
看起来您的内核是在没有 CONFIG_COMPAT_BINFMT_ELF
List of executable formats on Linux 的情况下构建的,因此它无法将 32 位 ELF 静态可执行文件识别为可执行文件。 (我认为这是相关的 Linux 内核配置选项。)
或者您正在为 Linux 使用 Windows 子系统,它也不支持 32 位可执行文件。
WSL 也不支持来自 64 位进程的 32 位 int 0x80
ABI,因此这也行不通。 (
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,要么你有一个自定义内核。