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

8
我的应用程序调用了一些在外部静态库中的函数。我将外部静态库链接到我的应用程序中,并且一切正常(在这种情况下,我使用的是GCC)。
然而,文本、.data 和 .bss 部分的地址由链接器选择。我可以通过修改链接器脚本来选择/更改它们的位置,但这很繁琐,因为我必须指定库中的所有函数、变量等等。我的意思是类似于以下内容:
. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]

一种替代方案是通过为每个函数/变量放置一个“section属性”,然后通过重新定位整个部分来修改链接器。类似以下代码所示: ```c #pragma GCC push_options #pragma GCC target("section-start") #pragma GCC section(".my_section_name") /* your code here */ #pragma GCC pop_options ```
/* 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个回答

10

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

如果外部库中没有将所有的 .o 文件放入静态库 .a 文件中,那么首先需要将它们放入其中。这是分发静态库二进制文件的常规方式。

然后,在链接器脚本中指定:

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

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

通配符将挑选来自 libspecial.a 的所有文件并将它们放置在第一节中。然后,后面的通配符会挑选剩余的任何内容。如果需要将 .text.special 节放置在正常节之后,则可以类似地使用 EXCLUDE_FILE 指令。

2
你能否对你的库进行后处理以重命名部分?
# 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接