記号はプラットフォームと何が関係していますか? 1つのプラットフォームで gccによって生成され、別のプラットフォームではinit_()ですか?
はい起動とエピローグルーチンは実装に残されており、実際にはgcc
は生成しません。初期化は、完全に異なる方法で行うことができるターゲットハードウェアに応じて、https://github.com/bminor/newlib/blob/e0f24404b3fcfa2c332ae14c3934546c91be3f42/newlib/libc/misc/init.c
-
libcのは、これらのsysmbolsを提供します。
例STM32Fxxxの起動。
.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr sp, =_estack /* Atollic update: set stack pointer */
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
/* Call the clock system intitialization function.*/
bl SystemInit
/* Call static constructors */
bl __libc_init_array
/* Call the application's entry point.*/
bl main
あなたはこの実装で見るように、2つの関数が呼び出される - 1つの非常に低いレバーのハードウェアの初期化のためのSystemInit
と__libc_init_array
それが(最近で最も一般的なベアメタルで使用newlibのライブラリの内部初期化ですプロジェクト)
問題は、標準ライブラリを使用せず、標準ライブラリをリンクしたくない場合です。いくつかのチェーンチェーンは、リターンステートメントだけで弱い機能を提供します。リンカーに問題がある場合は、スタートアップファイルでこの呼び出しをコメントするか、空の関数を自分で指定してください。
良いリソースには、プラットフォーム文書と 'objdump'が含まれています。 – spectras
シンボルはプラットフォームと何が関係していますか?あるプラットフォームでgccによって生成され、別のプラットフォームではinit_()は生成されません:) –
すべてのプロセスはプラットフォーム固有です。たとえば、AVRでは、初期化コードに割り込みベクタテーブルをスキップするためのパディングが含まれている必要があります。そして、コンテンツそのものは、Cプログラムが実行される環境を設定するためのものです:固定レジスタの初期化、スタックポインタの設定、トラップハンドラのインストールなどです。 – spectras