将外部静态库的片段放置到特定位置

时间:2017-02-17 10:19:40

标签: c gcc linker keil iar

我的应用程序调用一些放在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用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等)?

2 个答案:

答案 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部分。