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
使用的Linuxptrace
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)
。显示您的代码,它是否包括位
任何位置?