我想执行 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$
我正在为一位朋友做这个项目,她正在修汇编语言课程,这是她的计算机科学学位的一部分。