Linker armloader脚本的意义

Linker armloader脚本的意义,linker,arm,embedded-linux,linker-scripts,Linker,Arm,Embedded Linux,Linker Scripts,我得到了输出格式,输出拱门,输入。。。可能意味着输出将是elf32 littlearm等等 但是部分是我不明白的 这是“=”这是一个开始 和‘=对齐(4)'和.text:{*(.text)} 有人能帮我吗 谢谢你的阅读 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_ram_entry) SECTIONS { . = 0xA0008000;

我得到了输出格式,输出拱门,输入。。。可能意味着输出将是elf32 littlearm等等

但是部分是我不明白的

这是“=”这是一个开始

和‘=对齐(4)'和.text:{*(.text)}

有人能帮我吗

谢谢你的阅读

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_ram_entry)
SECTIONS
{
    . = 0xA0008000;

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

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

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

    . = ALIGN(4);
    .got : { *(.got) }

    . = ALIGN(4);
    .bss : { *(.bss) }
}
我想,但我不是100%确定arm将从哪里开始执行二进制文件

    . = 0xA0008000;
定义如何对齐以下指令

.text
.data
.rodata
.got
和.
bss
是程序的部分。文本用于初始化数据节的指令、数据和rodata,用于未初始化数据节的bss。got是全局偏移表

    . = ALIGN(4);

这复制了所有指令,类似的命令用于数据和全局偏移表。

实际上,此链接器描述语言在上次检查的ld文档中定义。事情并不像看上去那么糟。基本上,“.”运算符指的是“当前位置指针”。那么,线路呢

    . = ALIGN(4);
    .text : { *(.text) }
表示将位置指针移动到该值。下一个条目,.text基本上是说将所有文本对象放在最终ELF文件的.text部分,从位置指针开始(也调整为具有4字节(32位)对齐方式)。请注意,第一次使用对齐方式可能是多余的,因为0xA0008000已经是32位对齐的

接下来的部分只是指示链接器按照顺序将所有输入对象的所有.rodata、.data、.get和.bss部分的集合发送到ELF二进制文件的最终相应部分,从32位对齐的地址开始


因此链接器生成的最终ELF二进制文件将分别按顺序包含这五个部分。您可以使用readelf实用程序查看最终ELF二进制文件的结构。它非常有用,有助于理解所有这些东西。通常有readelf的交叉版本,类似于arm linux gnueabi readelf,或者任何用于生成您正在使用的编译器/链接器的前缀。从readelf-S开始获取ELF文件包含的部分的摘要。然后你可以从那里探索。快乐阅读

你说的“这本书复制了所有的说明”是什么意思?它就像,它对齐了所有的数据(指令+数据)??我的意思是它把指令从一个4字节对齐的地址开始,它把所有的数据等等。。。