2017-02-17 35 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指令。