2017-02-17 5 views
2

私のアプリケーションは、外部スタティックライブラリに配置されたいくつかの関数を呼び出します。私は外部スタティックライブラリを自分のアプリケーションにリンクし、すべてのものが動作します(この場合、私はGCCを使用しています)。外部スタティックライブラリのセグメントを特定の場所に配置します

しかし、ライブラリのテキスト、.data、および.bssセクションの場所(アドレス)は、リンカーによって選択されます。私はリンカスクリプトを変更して場所を選択/変更することができますが、ライブラリのすべての関数、変数などを指定する必要があるので面倒です。私はそれはのようなものです意味:

. = 0x1000; /* new location */ 
KEEP(*(.text.library_function1)); 
KEEP(*(.text.library_function2)); 
[...] 

代替ソリューションは、各関数/変数のセクション属性を配置した後、再配置するセクション全体でリンカを変更することで、外部ライブラリを構築することです。ような何か:

/* C source file */ 
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10]; 
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10]; 

/* Linker script */ 
. = 0x1000; 
KEEP(*(.myLibrarySection)) 

しかし、私はこれらのトリックを使用する必要がなく、全体の.text、.dataセクションおよび外部静的ライブラリの.bssのセグメントを再配置できるようにしたいと思います。

私は(リンカスクリプトで)このような何か希望:

. = 0x1000; 
KEEP(*(.text.library_file_name)) 

はGCCツールチェーンを使用して、それは可能ですか?

他のツールチェーン(IAR、Keilなど)を使用することは可能ですか?

答えて

1

セクションの名前を変更するためにlibを後処理できますか?

# Untested! 
TMP=`mktemp -d` 
trap "rm -rf $TMP" EXIT 
cd $TMP 
ar x path/to/your/lib.a 
for o in *.o; do 
    for s in text data bss; do 
    objcopy --rename-section .$s=.mynew$s $o 
    done 
done 
ar rcs path/to/your/lib.a *.o 
1

archive:filenameの構文をldに使用できます。

最初に、外部ライブラリのすべての.oファイルを静的ライブラリ.aファイルに置きます(存在しない場合)。これは、静的ライブラリバイナリが配布される通常の方法です。リンカスクリプトで次に

、指定:

.text.special : { 
    . = 0x1000; 
    *libspecial.a:*(.text .text.*) 
} 

.text { 
    *(.text .text.*) 
} 

ワイルドカードがlibspecial.aから来るすべてのファイルを選択し、最初のセクションに配置します。後のワイルドカードは残ったものをすべて選択します。通常セクションの後に.text.specialセクションを配置する必要がある場合は、EXCLUDE_FILEディレクティブを同様の方法で使用できます。

関連する問題