x86_32 Linux 上 ELF 的初始堆栈布局是什么?
What's the initial stack layout in ELF on x86_32 Linux?
我用最小的 argv 和 envp 启动了一个 32 位进程,并制作了一个从 esp 开始到 0xffffe000 结束的 hexdump,得到了这个:
00000000: 0100 0000 7adf ffff 0000 0000 a8df ffff ....z...........
00000010: c2df ffff 0000 0000 2000 0000 80cc fff7 ........ .......
00000020: 2100 0000 00c0 fff7 1000 0000 fffb ab0f !...............
00000030: 0600 0000 0010 0000 1100 0000 6400 0000 ............d...
00000040: 0300 0000 3480 0408 0400 0000 2000 0000 ....4....... ...
00000050: 0500 0000 0600 0000 0700 0000 0000 0000 ................
00000060: 0800 0000 0000 0000 0900 0000 6f88 0408 ............o...
00000070: 0b00 0000 e803 0000 0c00 0000 e803 0000 ................
00000080: 0d00 0000 e803 0000 0e00 0000 e803 0000 ................
00000090: 1700 0000 0000 0000 1900 0000 5bdf ffff ............[...
000000a0: 1f00 0000 cadf ffff 0f00 0000 6bdf ffff ............k...
000000b0: 0000 0000 0000 0000 0000 0039 9456 fb71 ...........9.V.q
000000c0: 5e17 6993 cf5f 001c 893a 4469 3638 3600 ^.i.._...:Di686.
000000d0: 0000 0000 0000 0000 0000 2f68 6f6d 652f ........../home/
000000e0: 7462 6f64 742f 6973 682f 6275 696c 642f tbodt/ish/build/
000000f0: 7465 7374 732f 6865 6c6c 6f2d 636c 6962 tests/hello-clib
00000100: 2d73 7461 7469 6300 5057 443d 2f68 6f6d -static.PWD=/hom
00000110: 652f 7462 6f64 742f 6973 682f 6275 696c e/tbodt/ish/buil
00000120: 6400 5348 4c56 4c3d 3000 2f68 6f6d 652f d.SHLVL=0./home/
00000130: 7462 6f64 742f 6973 682f 6275 696c 642f tbodt/ish/build/
00000140: 7465 7374 732f 6865 6c6c 6f2d 636c 6962 tests/hello-clib
00000150: 2d73 7461 7469 6300 0000 0000 0000 0000 -static.........
我可以确定的前几件事是 argc
、argv[0]
、argv[1]
(就是 NULL
)、envp[0]
、envp[1]
和 envp[2]
(也就是 NULL
),最后我可以看到 argv 和 envp 指向的字符串。剩下的东西是什么? (从 0x18 到 0xd9)
What's all the rest of the stuff?
AUX
向量。内核使用它来传递对动态链接器和 C 库有用的各种启动信息。详情 here. For an up-to-date list of components of the auxiliary vector, see the getauxval
man page.
我用最小的 argv 和 envp 启动了一个 32 位进程,并制作了一个从 esp 开始到 0xffffe000 结束的 hexdump,得到了这个:
00000000: 0100 0000 7adf ffff 0000 0000 a8df ffff ....z...........
00000010: c2df ffff 0000 0000 2000 0000 80cc fff7 ........ .......
00000020: 2100 0000 00c0 fff7 1000 0000 fffb ab0f !...............
00000030: 0600 0000 0010 0000 1100 0000 6400 0000 ............d...
00000040: 0300 0000 3480 0408 0400 0000 2000 0000 ....4....... ...
00000050: 0500 0000 0600 0000 0700 0000 0000 0000 ................
00000060: 0800 0000 0000 0000 0900 0000 6f88 0408 ............o...
00000070: 0b00 0000 e803 0000 0c00 0000 e803 0000 ................
00000080: 0d00 0000 e803 0000 0e00 0000 e803 0000 ................
00000090: 1700 0000 0000 0000 1900 0000 5bdf ffff ............[...
000000a0: 1f00 0000 cadf ffff 0f00 0000 6bdf ffff ............k...
000000b0: 0000 0000 0000 0000 0000 0039 9456 fb71 ...........9.V.q
000000c0: 5e17 6993 cf5f 001c 893a 4469 3638 3600 ^.i.._...:Di686.
000000d0: 0000 0000 0000 0000 0000 2f68 6f6d 652f ........../home/
000000e0: 7462 6f64 742f 6973 682f 6275 696c 642f tbodt/ish/build/
000000f0: 7465 7374 732f 6865 6c6c 6f2d 636c 6962 tests/hello-clib
00000100: 2d73 7461 7469 6300 5057 443d 2f68 6f6d -static.PWD=/hom
00000110: 652f 7462 6f64 742f 6973 682f 6275 696c e/tbodt/ish/buil
00000120: 6400 5348 4c56 4c3d 3000 2f68 6f6d 652f d.SHLVL=0./home/
00000130: 7462 6f64 742f 6973 682f 6275 696c 642f tbodt/ish/build/
00000140: 7465 7374 732f 6865 6c6c 6f2d 636c 6962 tests/hello-clib
00000150: 2d73 7461 7469 6300 0000 0000 0000 0000 -static.........
我可以确定的前几件事是 argc
、argv[0]
、argv[1]
(就是 NULL
)、envp[0]
、envp[1]
和 envp[2]
(也就是 NULL
),最后我可以看到 argv 和 envp 指向的字符串。剩下的东西是什么? (从 0x18 到 0xd9)
What's all the rest of the stuff?
AUX
向量。内核使用它来传递对动态链接器和 C 库有用的各种启动信息。详情 here. For an up-to-date list of components of the auxiliary vector, see the getauxval
man page.