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 他们使用 asld 来做,所以我不知道我该如何翻译这些解决方案我的问题。

对于 x86-64,我使用 asld 如下:

#       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 中的 --32ld 中的 -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,要么你有一个自定义内核。