【发布时间】:2015-07-21 14:50:10
【问题描述】:
我想要一个在 2 个不同的内存位置加载的图像,并且所有地址链接都在编译/链接时完成。
我想要实现的总体目标
- 为文本和数据定义不同的加载区域
- 根据加载地址解析所有符号依赖项
- 将文本和数据区域背靠背放置在图像中(我的加载器将在运行时将文本部分放置到不同的地址)
所以我创建了以下脚本
MEMORY
{
mem1 : ORIGIN = 0xfff00000, LENGTH = 100K
mem2 : ORIGIN = 0xfff80000, LENGTH = 100K
}
SECTIONS
{
. = 0xfff00000;
_image_base_origin = . - 0;
////////////////////////////////
// TEXT
////////////////////////////////
.text : {
_text_origin = .;
. = ALIGN(4); _text_offset = . - _image_base_origin; *(.vectors) *(.text) *(.eh_frame)
} > mem2
_text_size = . - _text_origin;
////////////////////////////////
// DATA
////////////////////////////////
.data : {
_data_origin = .;
. = ALIGN(8); _data_offset = . - _image_base_origin; *(.data) *(.comment) *(.rodata*) *(.bss*)
} > mem1
_data_size = . - _data_origin;
}
当我将图像的文本部分放入 mem2 时,我面临的问题是二进制的大小增加了很多倍。
如果我在我的文件上运行 readelf
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 5] .text PROGBITS fff80000 020000 0017a8 00 AX 0 0 32
[ 6] .data PROGBITS fff00398 010398 0004f8 00 WA 0 0 8
所以图像大小变为 80000 + 17a8 。它在图像中添加 mem2 的偏移量并创建二进制文件。它用零填充所有额外的内存。
如果我只将文本部分放在 mem1 中,那我的图像尺寸非常小(它不会为我的图像添加偏移 80000)。
你能帮帮我吗?
【问题讨论】:
标签: gcc linker linker-scripts