使用as和ld

时间:2018-11-02 11:38:09

标签: linux assembly x86 linker multiarch

所以我是新尝试asm的人,我想编译一个仅以i386指令而不是x86-64指令退出的小程序。我有一个x86-64 Ubuntu,可以完美地编译和运行x86-64,但我不知道如何在同一x86-64机器(我已安装i386 compat)上组装和链接i386版本。

我知道已经回答了类似的问题,但是没有一个人使用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 $1, %eax
    movl $0, %ebx
    int $0x80

现在..我一直在搜索操作方法,并在as中找到了--32,在-m {arg}中找到了ld,但是每次我编译它时都没有出现拱门错误它给我“文件格式错误”错误。

我尝试像这样用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

1 个答案:

答案 0 :(得分:0)

这些是用于汇编和链接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内核配置选项。)


或者您使用的是Windows Subsystem for Linux,该子系统也不支持32位可执行文件。

WSL也不支持64位进程中的32位int 0x80 ABI,因此也不起作用。 (What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?)。就像没有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,或者您有一个自定义内核。