喜欢1次
我发现芯片启动时并没有在源码中调用_init函数,却在反汇编文件中发现它被调用了,这是如何实现的呢。下面是我的分析过程:
1、在start.S文件中有这样的语句
/* Call global constructors */
la a0, __libc_fini_array
call atexit
call __libc_init_array
2、在lds文件中并没有这两个标签的链接地址
3、在_init()函数实现的地方并没有为它打上链接到这个段(__libc_fini_array)的标签。
void _init()
{
SystemInit();
//ECLIC init
eclic_init(ECLIC_NUM_INTERRUPTS);
eclic_mode_enable();
disable_mcycle_minstret();
}
4、在生成的反汇编文件中找到了这个标签并在这段代码中调用了_init函数
0800233c <__libc_init_array>:
800233c: ff010113 addi sp,sp,-16
.....
8002350: 6c440793 addi a5,s0,1732 # 80026c4 <__init_array_start>
8002354: 6c490913 addi s2,s2,1732 # 80026c4 <__init_array_start>
....
8002368: 02090063 beqz s2,8002388 <__libc_init_array+0x4c>
800236c: 6c440413 addi s0,s0,1732
8002370: 00000493 li s1,0
....
8002384: fe9918e3 bne s2,s1,8002374 <__libc_init_array+0x38>
8002388: ad5fe0ef jal ra,8000e5c <_init>
800238c: 08002437 lui s0,0x8002
8002390: 08002937 lui s2,0x8002
...
80023a4: 02090063 beqz s2,80023c4 <__libc_init_array+0x88>
80023a8: 6c440413 addi s0,s0,1732
...
80023d8: 00008067 ret
我想知道实际上_init函数是如何实现调用的,谢谢