C 什么会进入_init_数组?

C 什么会进入_init_数组?,c,gcc,ld,libc,newlib,C,Gcc,Ld,Libc,Newlib,我有一个用GCC编译的Cortex-M3项目。启动代码将初始化数据从闪存复制到RAM,初始化bss,调用时钟初始化SystemInit。在调用\u main函数之前,代码还会调用函数\u libc\u init\u array 该函数调用在\uuu preinit\u数组中定义的所有初始化例程,调用\u init函数,以及在\uu init\u数组中定义的所有例程: void __libc_init_array (void) { size_t count; size_t i;

我有一个用GCC编译的Cortex-M3项目。启动代码将初始化数据从闪存复制到RAM,初始化bss,调用时钟初始化
SystemInit
。在调用
\u main
函数之前,代码还会调用函数
\u libc\u init\u array

该函数调用在
\uuu preinit\u数组
中定义的所有初始化例程,调用
\u init
函数,以及在
\uu init\u数组
中定义的所有例程:

void __libc_init_array (void)
{
    size_t count;
    size_t i;

    count = __preinit_array_end - __preinit_array_start;
    for (i = 0; i < count; i++)
        __preinit_array_start[i] ();

    _init ();

    count = __init_array_end - __init_array_start;
    for (i = 0; i < count; i++)
        __init_array_start[i] ();
}

也许我可以帮你-

objdump-D-j.init_数组
你会收到一个地址列表,比如

Disassembly of section .init_array:

c1008db4 <.init_array>:
c1008db4:   c1000000    .word   0xc1000000
c1008db8:   c1000a68    .word   0xc1000a68
c1008dbc:   c1000b64    .word   0xc1000b64
c1008dc0:   c1000c04    .word   0xc1000c04
c1008dc4:   c1000c68    .word   0xc1000c68
节初始化数组的反汇编:
c1008db4:
c1008db4:c1000000。字0xc1000000
c1008db8:c1000a68.字0xc1000a68
c1008dbc:c1000b64。字0xc1000b64
c1008dc0:c1000c04.字0xc1000c04
c1008dc4:c1000c68。字0xc1000c68
现在,如果您自己编译了这个东西,您现在可以运行了

addr2line 0xc1000a68 -e <your-application>
addr2line 0xc1000a68-e
获取相关函数的文件名和行号


这有帮助吗?

请不要引用我的话,但话说回来,gcc将使用_属性_((构造函数))调用的函数放入_init_数组中。这是一个普通的C项目。没有C++构造函数。我确信我从未使用过这个属性。如何识别此类构造的起源和含义。请阅读gcc手册;)gcc使用
\uuuuuuuuu属性(*)
构造来启用函数和变量等的属性。这些属性中的一个是“代码>构造器< /代码>,这与C++构造函数无关。在程序启动和共享库加载时,使用该属性声明的所有函数都以未定义的顺序执行。顺便问一下,您是否如我在下面的回答中所建议的那样成功地使用了objdump?@AndreasGrapentin RTFM总是正确的。但是我正在寻找已被放到数组中的源文件或库文件。手册描述了找到位置时可以阅读的内容。但我仍在查找包含
.init_array*
部分的对象文件的位置和原因。objdump 2.22.0.20121207不显示
.word
,但尝试反汇编字节。但是我可以使用第二列中的原始字节作为地址。我的GCC安装中没有addr2行。但是我可以手动使用映射文件并找到相应的函数
register\u fini
。此函数读取一个值,检查条件并返回。不幸的是,
\uu libc\u init\u数组中的代码在返回后会进入涅磐。@harper-weird-听起来像是读取了init数组的边界,并试图跳入随机地址(UB)。你能找出
\uuuu init\u array\u end-\uuu init\u array\u start
的值吗?也许你的工具链出了问题。
Disassembly of section .init_array:

c1008db4 <.init_array>:
c1008db4:   c1000000    .word   0xc1000000
c1008db8:   c1000a68    .word   0xc1000a68
c1008dbc:   c1000b64    .word   0xc1000b64
c1008dc0:   c1000c04    .word   0xc1000c04
c1008dc4:   c1000c68    .word   0xc1000c68
addr2line 0xc1000a68 -e <your-application>