3

我有一个用 GCC 编译的 Cortex-M3 项目。startup_LPC177x_8x.s 代码将初始化数据从闪存复制到 RAM,初始化bss,调用时钟初始化 SystemInit。在调用_main函数之前,代码还会调用函数_libc_init_array

__libc_init_array函数调用在 中定义的所有初始化例程,__preinit_array调用该_init函数,以及在 中定义的所有例程__init_array

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] ();
}

使用 GDB,我可以发现它__preinit_array是空的(start==end),并且第二次调用__init_array_start[i] ()崩溃。

我不知道这个数组中包含哪些函数。链接描述文件使所有.init.array.*部分都位于此处。但是如何找到对应的.o源文件呢?

.init_array :
{
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH
4

1 回答 1

1

也许我可以在这里帮助你-

objdump -D -j .init_array <your-application>

你会收到一个地址列表,比如

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>

获取相关函数的文件名和行号。

这有帮助吗?

于 2014-01-27T18:19:24.850 回答