Linker 确切地说,什么是";=0x7c00“;在链接器脚本中做什么?

Linker 确切地说,什么是";=0x7c00“;在链接器脚本中做什么?,linker,boot,bootloader,Linker,Boot,Bootloader,链接器脚本中的“..=0x7c00”具体做什么 更具体地说,当我放置=0x7c00在链接器脚本的开头,为什么生成的输出文件不以0x7c00=31744零开头 我知道当PC启动时,BIOS会将512字节的MBR放在内存地址0x7c00处。然而,对于链接器的位置计数器究竟如何影响输出文件的布局,我感到困惑 (对于上下文,我试图彻底理解“x86裸机”项目中的示例代码。我已经在下面的上下文中包含了整个链接器脚本。) 看起来,“=0x7c00”不是指长度,而是指绝对地址。在我看来,它是“将特殊变量的当前值

链接器脚本中的“..=0x7c00”具体做什么

更具体地说,当我放置
=0x7c00
在链接器脚本的开头,为什么生成的输出文件不以0x7c00=31744零开头

我知道当PC启动时,BIOS会将512字节的MBR放在内存地址0x7c00处。然而,对于链接器的位置计数器究竟如何影响输出文件的布局,我感到困惑

(对于上下文,我试图彻底理解“x86裸机”项目中的示例代码。我已经在下面的上下文中包含了整个链接器脚本。)

看起来,
“=0x7c00”
不是指长度,而是指绝对地址。在我看来,它是“将特殊变量的当前值设置为”十六进制值0x7c00,然后它计划稍后在脚本中将该地址用作偏移量,如
=ALIGN(512)
这也是它将该地址保存为
\u start
的原因,这样它就可以对生成的图像进行计算。如果在脚本期间操纵
,使其指向添加到图像的最后一块内存,则可以使用它来确定总大小:

\uuuu stage2\u nsectors=绝对值((.-\uuu start)/512)

用英语就可以了


开始位置和结束位置之间的差异除以扇区大小。

但要小心这样的事情:我仍在努力让C语言的hello world正常工作:-(我讨厌链接器脚本:-)
SECTIONS
{
    /*
    We could also pass the -Ttext 0x7C00 to as instead of doing this.

    If your program does not have any memory accesses, you can omit this.
    */
    . = 0x7c00;
    .text :
    {
        __start = .;

        /*
        We are going to stuff everything
        into a text segment for now, including data.
        Who cares? Other segments only exist to appease C compilers.
         */
        *(.text)

        /*
        Magic bytes. 0x1FE == 510.

        We could add this on each Gas file separately with `.word`,
        but this is the perfect place to DRY that out.
        */
        . = 0x1FE;
        SHORT(0xAA55)

        *(.stage2)

        __stage2_nsectors = ABSOLUTE((. - __start) / 512);

        . = ALIGN(512);
        __end = .;
        __end_align_4k = ALIGN(4k);
    }
}