我写了一个小的hello world程序,并在其二进制上运行strace,它列出了作为执行我的Hello_world程序的一部分而调用的所有系统调用。
strace ./a.out
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(NULL) = 0xb7d000
brk(NULL( 用于查找 DSS 的当前上限,但我的问题是,谁想知道这个,为什么?
编辑1:我的程序中没有malloc
无论您是否使用malloc()
,C 运行时库都很可能准备堆。为此,它会查询 DSS 的当前大小并适当地设置控制结构,以便能够在调用第一个malloc()
时立即采取行动。
我写这个作为答案,因为我没有足够的声誉来评论。也就是说,我建议你看看这个,尤其是这个答案。
简而言之,当你执行一个程序时,一个正在运行的进程(在你的例子中是shell(需要调用fork((通过复制自身来创建一个新进程。这个重复的进程,一个"子"进程,然后调用execve(((这是你看到的第一个系统调用由strace列出(,它有效地覆盖了调用("父"(进程的文本,数据,bss和堆栈。重要的是,在调用 fork(( 之前可能已动态分配给父进程的内存不会保留。因此,brk(NULL( 返回的地址对于两者将是不同的。您的程序如何使用这些信息以及为什么使用这些信息超出了我的理解范围。