我的应用程序调用了一些放在外部静态库中的函数。我把外部静态库链接到我的应用程序上,一切都正常了(在这个例子中我使用的是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等)?
2条答案
按热度按时间ef1yzkbh1#
您可以在ld中使用
archive:filename
语法。首先把所有
.o
文件从你的外部库放到一个静态库.a
文件中,如果它们还没有的话,这是静态库二进制文件的正常分发方式。然后在链接器脚本中指定:
通配符将选择来自
libspecial.a
的所有文件并将它们放置在第一部分中。后面的通配符将选择剩下的任何文件。如果需要将.text.special
部分放置在普通部分之后,您可以以类似的方式使用EXCLUDE_FILE
指令。nukf8bse2#
你可以对你的库进行后处理来重命名节吗?