将外部静态库的段放置到特定位置
Place segments of external static library to specific locations
我的应用程序调用了一些放在外部静态库中的函数。我 link 我的应用程序的外部静态库,一切正常(在这种情况下,我使用的是 GCC)。
然而,库的 text、.data 和 .bss 部分的位置(地址)由 linker 选择。我可以通过修改 linker 脚本来 choose/change 它们的位置,但这很乏味,因为我必须指定库的所有函数、变量等。我的意思是:
. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]
另一种解决方案是通过为每个 function/variable 放置一个 部分属性 来构建外部库,然后通过重新修改 linker定位整个部分。类似于:
/* 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 段,而无需使用这些技巧。
我想要这样的东西(在 linker 脚本中):
. = 0x1000;
KEEP(*(.text.library_file_name))
是否可以使用 GCC 工具链?
是否可以使用其他工具链(IAR、Keil等)?
您能否对您的库进行后处理以重命名部分?
# 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
您可以在 ld.
中使用 archive:filename
语法
首先将外部库中的所有 .o
文件放入静态库 .a
文件(如果尚未存在)。这是静态库二进制文件的正常分发方式。
然后在链接描述文件中指定:
.text.special : {
. = 0x1000;
*libspecial.a:*(.text .text.*)
}
.text {
*(.text .text.*)
}
通配符将选择来自 libspecial.a
的所有文件并将它们放在第一部分。后面的通配符将选择剩下的任何东西。如果需要将 .text.special
部分放在普通部分之后,可以类似地使用 EXCLUDE_FILE
指令。
我的应用程序调用了一些放在外部静态库中的函数。我 link 我的应用程序的外部静态库,一切正常(在这种情况下,我使用的是 GCC)。
然而,库的 text、.data 和 .bss 部分的位置(地址)由 linker 选择。我可以通过修改 linker 脚本来 choose/change 它们的位置,但这很乏味,因为我必须指定库的所有函数、变量等。我的意思是:
. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]
另一种解决方案是通过为每个 function/variable 放置一个 部分属性 来构建外部库,然后通过重新修改 linker定位整个部分。类似于:
/* 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 段,而无需使用这些技巧。
我想要这样的东西(在 linker 脚本中):
. = 0x1000;
KEEP(*(.text.library_file_name))
是否可以使用 GCC 工具链?
是否可以使用其他工具链(IAR、Keil等)?
您能否对您的库进行后处理以重命名部分?
# 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
您可以在 ld.
中使用archive:filename
语法
首先将外部库中的所有 .o
文件放入静态库 .a
文件(如果尚未存在)。这是静态库二进制文件的正常分发方式。
然后在链接描述文件中指定:
.text.special : {
. = 0x1000;
*libspecial.a:*(.text .text.*)
}
.text {
*(.text .text.*)
}
通配符将选择来自 libspecial.a
的所有文件并将它们放在第一部分。后面的通配符将选择剩下的任何东西。如果需要将 .text.special
部分放在普通部分之后,可以类似地使用 EXCLUDE_FILE
指令。