2017-02-16 5 views
1

静的ライブラリ(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のシンボルを見つけることができません。どうやら、この醜いハック(正しいリンクを強制するダミー関数を呼び出す)なしでこれを行うことはできますか?

スタートアップファイルに触れずにライブラリコードのみを変更したいと思います。

答えて

1

私が知る限り、リンカはハンドラのシンボルが見つからない場合にのみリンカがライブラリを検索するので、簡単にはできません。それはそれを見つけることができるように(スタートアップの弱い定義)、それはそれ以上見えません。あなたがそのようなあなたのライブラリをリンクすることによってそれを解決することが

... -Wl,--whole-archive -l:path/to/our/library.a -Wl,--no-whole-archive ...

また、あなたは実際にモジュールの結合を引き起こすためにダミー関数を呼び出す必要はありません。

void ral_symbol_import(void); 
void (* const variable)() = &ral_symbol_import; 
+0

リンクフラグが非常によく動作しますが、それは非常に侵襲的である:必要なのは、そのようなたとえば、あなたがそれを必要とするリンカーを語っています。何らかの形でRADIO_IRQHandler(void)関数をライブラリ内でより見えるように宣言できますか(何らかの特別なステートメント)?あるいは、この特定のシンボルが正しくリンクされているようにライブラリを構築することができますか? – aldarel

+1

@aldarel - 申し訳ありませんが、私はライブラリの "内部"から機能する他のオプションについては考えていません...私が持っているすべてのソリューションは、ライブラリを使用するプロジェクト用です。また、リンカスクリプト(またはリンカコマンドライン)を使用して、いくつかのシンボルのリンクを強制することもできますが、これは同じことです。私は一度同様の問題を抱えていました。これらはすべて私がここから得たものです - https://sourceware.org/ml/binutils/2015-09/msg00272.html –

関連する問題