gpt4 book ai didi

linker - 没有用于 LOAD 的初始化数据的 GNU 链接器标记部分 - 原始二进制文件巨大

转载 作者:行者123 更新时间:2023-12-02 00:00:05 24 4
gpt4 key购买 nike

我正在编写裸机 ARM 引导加载程序,并尝试使用一些内部 SRAM 作为暂存器来与应用程序代码通信。根据我的需要,我不需要初始化或清零内存。使用此脚本,我可以将所需的变量放入内存中。

/**
* Linker script for secondary bootloader.
*
* Allocatest the first 1Mb of DRAM for its use.
* Scratchpad in internal SRAM.
*/

MEMORY
{
SRAM : o = 0x402F0400, l = 0x0000FC00 /* 63kB available internal SRAM */
DDR0 : o = 0x80000000, l = 1M /* 1Mb external DDR Bank 0 */
}

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)

SECTIONS
{
.startcode :
{
__AppBase = .;
. = ALIGN(4);
*init.o (.text)
} >DDR0

.text :
{
. = ALIGN(4);
*(.text*)
*(.rodata*)
} >DDR0

.data :
{
. = ALIGN(4);
*(.data*)
} >DDR0

.bss :
{
. = ALIGN(4);
_bss_start = .;
*(.bss*)
*(COMMON)
_bss_end = .;
} >DDR0

.stack :
{
. = ALIGN(4);
__StackLimit = . ;
*(.stack*)
. = __AppBase + 1M;
__StackTop = .;
} >DDR0
_stack = __StackTop;

.internal_ram :
{
. = ALIGN(4);
*(.internal_ram*)
} >SRAM
}

当使用 objcopy 创建原始二进制文件时,我得到了巨大的文件。我假设这是因为原始二进制文件的第一个字节实际上是内部存储器,在 .text 部分的开头有数兆字节的填充。 Objdump -h 显示 internal_ram 部分标有 CONTENTS、LOAD 和 DATA 标志,即使放置在那里的变量没有初始化。

我可以使用 --remove-section=.internal_ram 在 objcopy 中清理它,但似乎应该有一种方法让链接器识别数据未初始化。

有没有办法适本地标记该部分?

最佳答案

正确的部分声明是:

.internal_ram (NOLOAD) :
{
. = ALIGN(4);
*(.internal_ram*)
} >SRAM

NOLOAD 部分属性已记录在案,但它是根据程序加载器在加载时处理该部分来说明的。起初这似乎不适用于裸机图像,但出于该目的,objcopy 充当程序加载器并遵循目标文件中的标志设置,省略原始图像中的部分。

关于linker - 没有用于 LOAD 的初始化数据的 GNU 链接器标记部分 - 原始二进制文件巨大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927818/

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