无法执行二进制文件:执行格式错误:(在 64 位机器上编译 32 位代码)

无法执行二进制文件:执行格式错误:(在 64 位机器上编译 32 位代码)

我想执行 32 位汇编代码,并且我使用 gcc 将我的目标文件(由 NASM 创建)链接到可执行文件。

我已经尝试过帖子中提到的方法链接汇编程序:错误“对‘printf’未定义的引用”

可执行文件已创建,但每当我尝试运行它时,都会出现以下错误:

-bash: ./asmTest: cannot execute binary file: Exec format error

我使用了以下命令:

nasm -f elf -g asmTest.asm
gcc -m32 asmTest.o -o asmTest

我已经安装了 Multilib 版本的 gcc,以便可以在 64 位机器上运行 32 位代码。

我正在使用 NASM 版本 2.13.02 和 Ubuntu 应用程序(适用于 Windows、Ubuntu 18.04.1 LTS)。

GCC版本:gcc(Ubuntu 7.5.0-3ubuntu1~18.04)7.5.0

请帮忙。

编辑

strace ./asmTest

输出结果如下:

execve("./asmTest", ["./asmTest"],  0x7fffd49a5000 /* 19 vars */) = -1 ENOEXEC (Exec format error)
fstat(2, {st_mode=S_IFCHR|0660, st_rdev=makedev(4, 1), ...}) = 0
ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "strace: exec: Exec format error\n", 32strace: exec: Exec format error
) = 32
getpid()                                = 1110
exit_group(1)                           = ?
+++ exited with 1 +++

答案1

我在 Ubuntu 20.04 64 位操作系统上运行为 32 位机器编译的 hello_world.c 时遇到问题。本地运行时没有问题。以下是我创建可执行文件的过程:

gcc -march=i386 -m32 hello_world.c -S -o hello_world.s as --32 hello_world.s

as 调用链接器并生成 32 位可执行映像。

jeffs@jeffs-desktop:~/VarsityTutors$ file a.out
a.out: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
jeffs@jeffs-desktop:~/VarsityTutors$ 
jeffs@jeffs-desktop:~/VarsityTutors$ ./a.out
bash: ./a.out: cannot execute binary file: Exec format error
jeffs@jeffs-desktop:~/VarsityTutors$ ls -l ./a.out
-rwxrwxrwx 1 jeffs jeffs 1476 Oct 28 15:24 ./a.out
jeffs@jeffs-desktop:~/VarsityTutors$ 

我读了几篇文章,大部分都显得过时了。所以我尝试了:

jeffs@jeffs-desktop:~/VarsityTutors$ arch
x86_64
jeffs@jeffs-desktop:~/VarsityTutors$ sudo apt-get install multiarch-support
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package multiarch-support is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'multiarch-support' has no installation candidate
jeffs@jeffs-desktop:~/VarsityTutors$ 
jeffs@jeffs-desktop:~/VarsityTutors$ 

我正在为一位朋友做这个项目,她正在修汇编语言课程,这是她的计算机科学学位的一部分。

相关内容