有时会返回正确的argc
值,有时是0,有时(看起来)是随机数...都来自同一个可执行文件。
.section .text
.global _start
_start:
movq $1, %rax
popq %rdi
syscall
例如:
%as -o this.o this.s ; ld -o this this.o
%./this; echo $?
1
%./this 1; echo $?
0
%./this 1 2; echo $?
3
%./this 1 2 a; echo $?
4
%./this 1 2 a f; echo $?
0
%_
我对汇编有点陌生,但我很有信心,获得参数计数就像在Linux中从堆栈中弹出一样容易,在Linux中,System V ABI记录RSP在一个新的execve
进程中指向argc
。
是我做错了什么,还是真的搞砸了?
2条答案
按热度按时间krugob8w1#
我在FreeBSD 9.0/amd 64上遇到了同样的问题。我所做的是(我使用nasm作为汇编程序):
我期望argc在rsp,但它不是。
我猜内核(镜像激活器)设置了寄存器。我搜索了源代码树,在/usr/src/sys/amd 64/amd 64/machdep. c(exec_setregs)中找到了以下代码。
编辑:machdep.c已被拆分,现在可以在exec_machdep.c中找到此函数
这些行看起来像是说rsp是对齐的,实际数据在rdi。我修改了代码,得到了预期的结果。
你能试试rdi吗?
irlmq6kh2#
对于FreeBSD的标准调用约定,您需要:
最短的完整程序,其返回状态将等于它传递的参数的数量是: