void* curbrk;
__asm__ __volatile__(
"mov .curbrk, %%rax;"
"mov %%rax, %0"
: "=r" (curbrk)
:: "%rax"
);
有人能解释一下这个简单的汇编代码是做什么的吗?谢谢。
.curbrk
的值复制到C变量curbrk
中,可能在汇编或链接器脚本中定义,在此过程中破坏了RAX
寄存器。
.curbrk
可能指向数据段的当前末尾。Glibc似乎定义了一个类似的符号__curbrk
,您可能正在使用其他libc(BSD?)。无论如何,sbrk(0)
是访问该值的更可移植的方式。
brk()
和sbrk()
两者使用,并使用HIDENAME宏来添加一个.
,并且它出现在amd64的System.map中(在当前版本的FreeBSD上不再是这样)。brk()
和sbrk()
已被重新实现,不再依赖于.curbrk
,它是从_end
初始化的,后者应该来自可执行文件,但在混合LLVM的ld和GNU ld时会出现问题。因此,brk()
和sbrk()
现在使用内核来初始化其内部的curbrk
,不再依赖于_end
。有关详细信息,请参见FreeBSD PR228754。sbrk(0)
。 - ninjalj.value
的值”时,你是指.curbrk
? - Michael Petch%%rax
中
.curbrk
不是指寄存器、标签或其他有意义的符号。 - Michael Foukarakis