GCC でコンパイルされた ARM アセンブリ コードを次に示します。
からのスニペットstartup.s
:
.globl Default_Handler
.type Default_Handler, %function
Default_Handler:
B .
.size Default_Handler, . - Default_Handler
.macro IRQ handler
.weak \handler
.set \handler, Default_Handler
.endm
IRQ POWER_CLOCK_IRQHandler
のfile1.c
void POWER_CLOCK_IRQHandler(void)
{
//Do some things...
}
このコードでPOWER_CLOCK_IRQHandler
は、 は弱いシンボルです。コードが実行されると、コード fromfile1
が実行されます。
ここDefault_Handler
で、別のファイルで定義し、その定義を .xml でコメントアウトしますstartup.s
。
.globl Default_Handler
.type Default_Handler, %function
//Default_Handler:
// B .
.size Default_Handler, . - Default_Handler
.macro IRQ handler
.weak \handler
.set \handler, Default_Handler
.endm
IRQ POWER_CLOCK_IRQHandler
ファイル 3:
void Default_Handler(void)
{
//Do some other things
}
の定義をDefault_Handler
別のファイルに記述したりDefault_Handler
、weak として宣言したりすると、POWER_CLOCK_IRQHandler
は に対してリンクされDefault_Handler
ます。POWER_CLOCK_IRQHandler
リンカは弱い属性を見逃しており、 でそれをリンクしません。file1.c
で指定された式を解決しようとしました.set
。
誰かが正確に何が起こるか説明できますか? 実装が 以外のファイルにPOWER_CLOCK_IRQHandler
ある場合に弱い属性を有効に保つための適切な解決策は何ですか?Default_Handler
startup.s