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

__preinit_arrayGDB を使用すると、が空 (start==end) であり、2 番目の呼び出しが__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 に答える