我发现芯片启动时并没有在源码中调用_init函数,却在反汇编文件中发现它被调用了,这是如何实现的呢。下面是我的分析过程:
1、在start.S文件中有这样的语句
/* Call global constructors */ la a0, __libc_fini_array call atexit call __libc_init_array2、在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函数是如何实现调用的,谢谢