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

HBv*_*Bv6 7 c linker gcc iar keil

我的应用程序调用了一些放置在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用的是 GCC)。

然而,库的文本、.data 和 .bss 部分的位置(地址)由链接器选择。我可以通过修改链接器脚本来选择/更改它们的位置,但是这很乏味,因为我必须指定库的所有函数、变量等。我的意思是这样的:

. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]
Run Code Online (Sandbox Code Playgroud)

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

/* C source file */
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10];
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10];

/* Linker script */
. = 0x1000;
KEEP(*(.myLibrarySection))
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够重新定位外部静态库的整个 .text、.data 和 .bss 段,而无需使用这些技巧。

我想要这样的东西(在链接脚本中):

. = 0x1000;
KEEP(*(.text.library_file_name))
Run Code Online (Sandbox Code Playgroud)

是否可以使用 GCC 工具链?

是否可以使用其他工具链(IAR、Keil 等)?

jpa*_*jpa 6

您可以使用archive:filenameld 中的语法。

首先将.o外部库中的所有文件放入静态库.a文件中(如果还没有的话)。这是分发静态库二进制文件的正常方式。

然后在链接描述文件中,指定:

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

.text {
    *(.text .text.*)
}
Run Code Online (Sandbox Code Playgroud)

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