2017-02-17 39 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,。數據和外部靜態庫的.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

您可以在ld中使用archive:filename語法。

首先將您外部庫中的所有.o文件放入靜態庫.a文件中(如果它們尚未存在)。這是靜態庫二進制文件分發的正常方式。

然後在鏈接描述文件,指定:

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

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

通配符將選擇從libspecial.a來的所有文件,並把他們在首節。後來的通配符會選擇剩下的任何東西。如果需要將.text.special部分放在正常部分之後,則可以以類似的方式使用EXCLUDE_FILE指令。