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_array
GDB を使用すると、が空 (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