Linux 为什么strace报告我的x64 FASM程序以32位模式运行?

Linux 为什么strace报告我的x64 FASM程序以32位模式运行?,linux,assembly,64-bit,fasm,Linux,Assembly,64 Bit,Fasm,我的源文件顶部有格式化ELF64可执行文件3 我使用fasm main.asm 输出: flat assembler version 1.73.13 (16384 kilobytes memory, x64) 3 passes, 319 bytes. 然后我尝试使用strace./main运行它,因为它没有按预期工作,并且在输出中有strace:[进程PID=3012310以32位模式运行。] file main:main:ELF 64位LSB可执行文件,x86-64,版本1(GNU/Li

我的源文件顶部有
格式化ELF64可执行文件3

我使用
fasm main.asm

输出:

flat assembler  version 1.73.13  (16384 kilobytes memory, x64)
3 passes, 319 bytes.
然后我尝试使用
strace./main运行它,因为它没有按预期工作,并且在输出中有
strace:[进程PID=3012310以32位模式运行。]

file main
main:ELF 64位LSB可执行文件,x86-64,版本1(GNU/Linux),静态链接,无节头


uname-m
x86_64
使用
syscall
而不是
int 0x80
strace
是错误的,您的进程实际上不是在32位模式下运行,只是使用32位
int 0x80
系统调用ABI。

您可以使用
gdb./main检查并使用
starti
<代码>信息寄存器
将显示寄存器状态为64位,包括16x 64位寄存器,而不是8x 32位寄存器。或者更简单地说,
layout reg


我在使用NASM构建程序时看到了相同的strace错误(?),该程序在64位模式下使用32位
int 0x80
ABI进行
exit
系统调用

我在第一次系统调用之前添加了一个延迟循环,我看到
strace
在进行系统调用之前不会打印目标进程的比特数。因此显然
strace
推断它是使用64位
syscall
ABI还是32位
int0x80
/
sysenter
ABI

也许这与试图找出如何解码系统调用的
strace
有关:
strace
使用的Linux
ptrace
API没有简单可靠的机制来判断进程调用了哪个系统调用ABI

使用32位系统调用的64位进程,用于根据64位调用号进行解码。但现在看来现代的
strace
检查:

我使用
eax=1
/
syscall
调用
write
,使用
eax=1
/
int 0x80
调用
exit
,并且
strace
正确地解码了它们

execve("./nasm-test", ["./nasm-test"], 0x7ffdb8da5890 /* 52 vars */) = 0
write(0, NULL, 0)                       = 0
strace: [ Process PID=5219 runs in 32 bit mode. ]
exit(0)                                 = ?
+++ exited with 0 +++

这是在Linux 5.3.1-arch1-1-ARCH上的
strace 5.3
中发生的。

除非您的程序本身正在执行其他程序,而这正是在32位模式下运行的程序,否则不应该发生这种情况。当然,从strace输出中应该可以清楚地看到这一点。您并没有显示任何代码,但我测试的代码是有效的。我的程序并没有执行任何其他程序。只有基本的系统调用,即
读取
写入
打开
关闭
退出
。是在strace输出的开始处显示32位消息,还是在此之前记录了一些系统调用?在此消息下只有
重新启动系统调用
退出(1)
。显示您的代码,它是否包括
任何位置?