链接描述文件中的 MEMORY 命令使二进制大小膨胀
MEMORY command in linker script bloat the binary size
我想要一个在 2 个不同内存位置加载的图像,并且所有地址链接都在 compile/link 时间完成。
总体objective我要达到
- 为文本和数据定义不同的加载区域
- 根据加载地址解决所有符号依赖关系
- 将文本和数据区域背靠背放在图像中(我的加载程序会在 运行 时将文本部分放到不同的地址)
所以我创建了以下脚本
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 时,二进制文件的大小增加了许多倍。
如果我 运行 阅读我的文件
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)。
你能帮我一下吗?
较大的文件大小无疑是为了满足 vma % pagesize == file_offset % pagesize 的需求分页要求。如果您的系统不是按需分页的,那么您可以 link 使用 -n。如果您的系统是按需分页的,那么 ld 默认页面大小可能不必要地大。 -z max-page-size 选项可以解决这个问题。
我想要一个在 2 个不同内存位置加载的图像,并且所有地址链接都在 compile/link 时间完成。
总体objective我要达到
- 为文本和数据定义不同的加载区域
- 根据加载地址解决所有符号依赖关系
- 将文本和数据区域背靠背放在图像中(我的加载程序会在 运行 时将文本部分放到不同的地址)
所以我创建了以下脚本
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 时,二进制文件的大小增加了许多倍。
如果我 运行 阅读我的文件
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)。
你能帮我一下吗?
较大的文件大小无疑是为了满足 vma % pagesize == file_offset % pagesize 的需求分页要求。如果您的系统不是按需分页的,那么您可以 link 使用 -n。如果您的系统是按需分页的,那么 ld 默认页面大小可能不必要地大。 -z max-page-size 选项可以解决这个问题。