今天是做练习,从大会调用fget。为了将文件*传递给文件流,我编写了mov rdx, [stdin]。
,但为什么它应该放在方括号内,?因为我不需要指针的值,只需要指针本身。值得一提的是,lea,stdin也不起作用。我记得,它导致SIGSEGV被发送到程序。
正如我所理解的,mov指令操作数中的方括号与C中的取消引用指针相同。我还知道libc在运行时动态地链接到我的可执行文件,并映射到程序虚拟内存地址空间的堆栈和堆之间。
x64,Linux,Linux。
发布于 2016-09-03 19:58:22
FILE *stdin;是指针类型的全局变量。这意味着存储在静态位置的值是您想要的指针。由于我们要传递的值是存储在标记为stdin的位置的指针,所以我们需要从[stdin]加载,而不是传递stdin符号的地址。
如果将stdin的地址(与lea rdx, [rel stdin]一起传递)声明为FILE stdin,并在C中使用为fgets(buf, size, &stdin),则该地址将起作用。
libc对FILE *stdin;的定义相当于此asm。
section .data
stdin: dq stdin_FILE_struct ; This is a pointer stored in memory
section .bss
...
stdin_FILE_struct: ;; TOTALLY MADE UP, it's not actually like this
resq 1 ; something
resd 1 ; something_else
resb 4096 ; bufferstdin实际上可能在BSS中,它所指向的数据很可能是由glibc函数动态分配的。
stdin是一个不透明的指针。您不需要关心它指向什么,只需要它持有一个指向实际FILE对象的指针,这就是您需要传递给fget的内容。
https://stackoverflow.com/questions/39310748
复制相似问题