我首先注意到它,而與GDB的rbreak .
玩,然後做了一個小例子:爲什麼在_start之前調用glibc的csu/init-first.c中的_init,即使_start是ELF入口點?
(gdb) file hello_world.out
Reading symbols from hello_world.out...done.
(gdb) b _init
Breakpoint 1 at 0x4003e0
(gdb) b _start
Breakpoint 2 at 0x400440
(gdb) run
Starting program: /home/ciro/bak/git/cpp/cheat/gdb/hello_world.out
Breakpoint 1, _init (argc=1, argv=0x7fffffffd698, envp=0x7fffffffd6a8) at ../csu/init-first.c:52
52 ../csu/init-first.c: No such file or directory.
(gdb) continue
Continuing.
Breakpoint 2, 0x0000000000400440 in _start()
(gdb) continue
Continuing.
Breakpoint 1, 0x00000000004003e0 in _init()
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
breakpoint already hit 2 times
1.1 y 0x00000000004003e0 <_init>
1.2 y 0x00007ffff7a36c20 in _init at ../csu/init-first.c:52
2 breakpoint keep y 0x0000000000400440 <_start>
breakpoint already hit 1 time
注意,有2 _init
:在csu/init-first.c
之一,而其他似乎來自sysdeps/x86_64/crti.S
。我正在談論csu
之一。
是不是_start
應該是鏈接器設置的入口點,並存儲在ELF頭?什麼機制使_init
先運行?它的目的是什麼?
測試GCC 4.8,glibc 2.19,GDB 7.7.1和Ubuntu 14.04。
沒有真正的動態加載程序的入口點。 ELF中定義了init部分。看看[THIS](http://l4u-00.jinr.ru/usoft/WWW/www_debian.org/Documentation/elf/node3.html)你也可以試試'readelf -d yourelf'來檢查INIT和FINI部分。無論如何,如果你用-nostdlib編譯那些部分是可以避免的。 – LPs