<div dir="ltr">Hi, and thanks for your reply. I totally forgot to take the dynamic loader into consideration, which is my bad.<div><br></div><div>But another problem is that the peak value cannot align with the max_rss getting from `getrusage` function, which</div><div>is ~1000KiB. I guess that it has some connection with max_rss inheriting, but I'm not sure about that. Do you have</div><div>any opinion about it?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">杨贺然 <<a href="mailto:herany1999@gmail.com">herany1999@gmail.com</a>> 于2024年6月4日周二 21:37写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi, and thanks for your reply. I totally forgot to take the dynamic loader into consideration, which is my bad.<div><br></div><div>But another problem is that the peak value cannot align with the max_rss getting from `getrusage` function, which</div><div>is ~1000KiB. I guess that it has some connection with max_rss inheriting, but I'm not sure about that. Do you have</div><div>any opinion about it?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Valdis Klētnieks <<a href="mailto:valdis.kletnieks@vt.edu" target="_blank">valdis.kletnieks@vt.edu</a>> 于2024年6月4日周二 01:44写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sat, 01 Jun 2024 15:01:32 +0800, 杨贺然 said:<br>
<br>
> // a.c<br>
> int main() {}<br>
><br>
> It shows that `memory.peak` of this program is ~500KiB, which does not make<br>
> sense to me.<br>
<br>
Makes sense to me...<br>
<br>
[~] cat > testnull.c<br>
int main() {}<br>
[~] gcc testnull.c<br>
[~] ldd a.out<br>
linux-vdso.so.1 (0x00007efc6a650000)<br>
libc.so.6 => /lib64/libc.so.6 (0x00007efc6a43d000)<br>
/lib64/ld-linux-x86-64.so.2 (0x00007efc6a652000)<br>
[~] objdump -d a.out<br>
<br>
a.out: file format elf64-x86-64<br>
<br>
<br>
Disassembly of section .init:<br>
<br>
0000000000401000 <_init>:<br>
401000: f3 0f 1e fa endbr64<br>
401004: 48 83 ec 08 sub $0x8,%rsp<br>
401008: 48 8b 05 d1 2f 00 00 mov 0x2fd1(%rip),%rax # 403fe0 <__gmon_start__@Base><br>
40100f: 48 85 c0 test %rax,%rax<br>
401012: 74 02 je 401016 <_init+0x16><br>
401014: ff d0 call *%rax<br>
401016: 48 83 c4 08 add $0x8,%rsp<br>
40101a: c3 ret<br>
<br>
Disassembly of section .text:<br>
<br>
0000000000401020 <_start>:<br>
401020: f3 0f 1e fa endbr64<br>
401024: 31 ed xor %ebp,%ebp<br>
401026: 49 89 d1 mov %rdx,%r9<br>
401029: 5e pop %rsi<br>
40102a: 48 89 e2 mov %rsp,%rdx<br>
40102d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp<br>
401031: 50 push %rax<br>
401032: 54 push %rsp<br>
401033: 45 31 c0 xor %r8d,%r8d<br>
401036: 31 c9 xor %ecx,%ecx<br>
401038: 48 c7 c7 06 11 40 00 mov $0x401106,%rdi<br>
40103f: ff 15 93 2f 00 00 call *0x2f93(%rip) # 403fd8 <__libc_start_main@GLIBC_2.34><br>
401045: f4 hlt<br>
401046: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)<br>
40104d: 00 00 00<br>
(.....)<br>
<br>
Basically, its not *really* a totally null program. You've got the dynamic<br>
loader ld-linux running first, which then *doesn't* run main() directly, but<br>
rather invokes _start, which needs to happen so that __libc_start_main can get<br>
called and initialize stuff lie stdio, malloc, and other such t hings, before<br>
it finally calls main().<br>
<br>
Personally, I'm surprised that ld-linux and glibc initialization can finish<br>
without going over 500k - even more so if shared library text pages are<br>
included in memory.peak. Somebody else can wade into that mess, I admit<br>
having been around since kernel 2.5.47 or so, and I never did understand the<br>
memory accounting for shared text pages....<br>
<br>
</blockquote></div>
</blockquote></div>