4

我编写了一个小型 hello world 程序,并在其二进制文件上运行 strace,它列出了所有已作为我的 Hello_world 程序执行的一部分调用的系统调用。

strace ./a.out
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(NULL)                               = 0xb7d000

brk(NULL) 用于查找当前 DSS 的上限,但我的问题是,谁想知道这个,为什么?

edit1:我的程序中没有 malloc

4

2 回答 2

3

无论您是否使用,C 运行时库很可能会malloc()准备堆。为此,它会查询 DSS 的当前大小并适当地设置控制结构,以便能够在第一个malloc()被调用时立即采取行动。

于 2019-09-13T10:03:25.040 回答
2

我写这个作为答案,因为我没有足够的声誉来发表评论。也就是说,我建议你看看这个,尤其是这个答案。

简而言之,当您执行程序时,正在运行的进程(在您的情况下为 shell)需要调用 fork() 通过复制自身来创建新进程。这个重复的进程,一个“子”进程,然后调用 execve()(这是 strace 列出的第一个系统调用),它有效地覆盖了调用(“父”)进程的文本、数据、bss 和堆栈。重要的是,在调用 fork() 之前可能已动态分配给父进程的内存不会被保留。因此, brk(NULL) 返回的地址对于两者来说是不同的。你的程序如何以及为什么使用这些信息超出了我的理解。

于 2019-09-13T09:58:16.840 回答