我的应用程序调用一些放在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用GCC)。
然而,链接器选择了库的text,.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等)?
答案 0 :(得分: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 :(得分:1)
您可以在ld。
中使用archive:filename
语法
首先将外部库中的所有.o
文件放入静态库.a
文件中(如果尚未存在)。这是静态库二进制文件的正常分发方式。
然后在链接描述文件中指定:
.text.special : {
. = 0x1000;
*libspecial.a:*(.text .text.*)
}
.text {
*(.text .text.*)
}
通配符将选择来自libspecial.a
的所有文件并将它们放在第一部分中。然后,后面的通配符将选择剩下的任何内容。如果需要在正常部分之后放置.text.special
部分,则可以以类似的方式使用EXCLUDE_FILE
部分。