gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:31:43 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

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

关于c - 将外部静态库的段放置到特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42295298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com