0
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

谢谢阅读。

4

2 回答 2

1

实际上,这个链接器描述语言是在我上次检查的 ld 的文档中定义的。它并不像看起来那么糟糕。基本上,“。” 运算符指的是“当前位置指针”。所以,线

. = 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 文件包含的部分的摘要。然后你可以从那里探索。快乐阅读!

于 2012-10-30T20:42:11.723 回答
1
    . = 0xA0008000;

我认为,但我不是 100% 确定,arm 将在哪里开始执行二进制文件

    . = ALIGN(4);

定义如何对齐以下指令。

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

    .text : { *(.text) }

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

于 2012-10-30T13:22:54.190 回答