静的ライブラリ(gccの場合は* .a、keilの場合は* .lib)を構築しました。ライブラリにコンパイルされたソースファイルの1つに、RADIO_IRQHandlerの定義が含まれています。 「ral_irq_handlers.c」と呼ばれるこのソースファイルからの抜粋は、以下の通りです:静的ライブラリで定義されたIRQシンボルは、ARM/GCC起動時の弱いIRQ定義を無効にしません。
...
void ral_symbol_import(void) //dummy function
{
return;
}
...
void RADIO_IRQHandler(void)
{
...
}
...
このIRQのシンボル定義は、起動ファイルで宣言されている弱い定義をオーバーライドする必要があります。スタートアップファイルはスタティックライブラリにはコンパイルされず、プロジェクト内の通常のファイルにすぎません。
arm_startup_xxx.sファイル(Keil社ツールチェーン)の抜粋は、以下である:
Default_Handler PROC
...
EXPORT RADIO_IRQHandler [WEAK]
...
...
RADIO_IRQHandler
...
B .
ENDP
ALIGN
類似gcc_startup_xxx.sファイル(GCCツールチェイン)の抜粋は、以下である:
.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 RADIO_IRQHandler
...
.end
それから観察しました奇妙な行動。プロジェクトソースファイルの中の "ral_irq_handlers.c"ソースファイル(ライブラリにコンパイル)のAPI関数を使用すると、リンクが正しく行われます。例:
...
int main(void)
{
ral_symbol_import();
...
}
...
私は「ral_irq_handlers.c」ソースファイルのいずれかのAPI関数を使用しない場合は、リンカは私のライブラリで定義されRADIO_IRQHandlerのシンボルを見つけることができません。どうやら、この醜いハック(正しいリンクを強制するダミー関数を呼び出す)なしでこれを行うことはできますか?
スタートアップファイルに触れずにライブラリコードのみを変更したいと思います。
リンクフラグが非常によく動作しますが、それは非常に侵襲的である:必要なのは、そのようなたとえば、あなたがそれを必要とするリンカーを語っています。何らかの形でRADIO_IRQHandler(void)関数をライブラリ内でより見えるように宣言できますか(何らかの特別なステートメント)?あるいは、この特定のシンボルが正しくリンクされているようにライブラリを構築することができますか? – aldarel
@aldarel - 申し訳ありませんが、私はライブラリの "内部"から機能する他のオプションについては考えていません...私が持っているすべてのソリューションは、ライブラリを使用するプロジェクト用です。また、リンカスクリプト(またはリンカコマンドライン)を使用して、いくつかのシンボルのリンクを強制することもできますが、これは同じことです。私は一度同様の問題を抱えていました。これらはすべて私がここから得たものです - https://sourceware.org/ml/binutils/2015-09/msg00272.html –