C语言 将外部静态库的段放置到特定位置

oogrdqng  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(165)

我的应用程序调用了一些放在外部静态库中的函数。我把外部静态库链接到我的应用程序上,一切都正常了(在这个例子中我使用的是GCC)。
然而,库中的text、.data和.bss部分的位置(地址)是由链接器选择的。我可以通过修改链接器脚本来选择/更改它们的位置,但这很繁琐,因为我必须指定库中的所有函数、变量等。我的意思是:

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

另一种解决方案是通过为每个函数/变量放置一个 *section属性 * 来构建外部库,然后通过重新定位整个section来修改链接器。

/* 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等)?

ef1yzkbh

ef1yzkbh1#

您可以在ld中使用archive:filename语法。
首先把所有.o文件从你的外部库放到一个静态库.a文件中,如果它们还没有的话,这是静态库二进制文件的正常分发方式。
然后在链接器脚本中指定:

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

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

通配符将选择来自libspecial.a的所有文件并将它们放置在第一部分中。后面的通配符将选择剩下的任何文件。如果需要将.text.special部分放置在普通部分之后,您可以以类似的方式使用EXCLUDE_FILE指令。

nukf8bse

nukf8bse2#

你可以对你的库进行后处理来重命名节吗?

# 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

相关问题