装载机脚本的含义

时间:2012-10-30 11:51:26

标签: linker arm embedded-linux linker-scripts

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) }
}

我得到了output_format,output_arch,entry ...也许意味着输出将是elf32-littlearm等等。

但是Sections部分是我没有得到的。

这个'。 ='是开始。

和'。 = ALIGN(4)'和.text:{*(。text)} ....

任何人都可以帮我这个T_T

感谢阅读。

2 个答案:

答案 0 :(得分:1)

    . = 0xA0008000;

我想,但我不是100%肯定,是手臂将开始执行二进制文件的地方

    . = ALIGN(4);

定义如何对齐以下指令。

.text.data.rodata.got和。bss是该计划的各个部分。 text用于初始化数据部分的指令,数据和rodata,以及未初始化数据部分的bss。得到的是全球抵消表。

    .text : { *(.text) }

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

答案 1 :(得分:1)

实际上,这个链接器描述语言是在我检查过的ld文档中定义的。它没有它看起来那么糟糕。基本上,'。' operator指的是“当前位置指针”。那么,行

. = 0xA0008000 

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

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

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