在链接描述文件中定义符号有什么用?

时间:2012-03-22 07:47:25

标签: linker linker-scripts

我想知道在链接描述文件中定义符号的用法是什么。使用链接描述文件来排列不同的部分是可以理解的,但在脚本中定义新符号对我来说并不清楚。我正在阅读一篇文章,该文章使用定义两个新符号的链接器脚本,但这些符号未在链接描述文件或文章中的任何其他位置引用。一个例子是在bss部分中使用sbss和ebss符号,如下所示:

ENTRY (loader)
SECTIONS
{    . = 0x00100000;
    .text ALIGN (0x1000) :
    {
        *(.text)
    }
    .rodata ALIGN (0x1000) :
    {
        *(.rodata*)
    }
    .data ALIGN (0x1000) :
    {
        *(.data)
    }

    .bss :
    {
        sbss = .;
        *(COMMON)
        *(.bss)
        ebss = .;
    }
}

还有其他经常使用的符号,例如etext,dataEnd等。请解释在脚本中没有引用它们时定义这些符号的用法。

2 个答案:

答案 0 :(得分:0)

vjain27,

我不知道为什么会像你的示例链接器脚本定义的那样定义符号。这主要是为了允许可执行文件知道节的开始和结束。如果需要复制数据或在内存中以其他方式操作数据,这将非常有用。

答案 1 :(得分:0)

编写x86引导加载程序时,我想通过使用以下内容将图像设置为512字节的倍数:

。 = ALIGN(512);

在链接描述文件中。

但是我需要一些方法来了解确切的大小,并将其传递给我的启动代码的overflow:hidden,这将进行int 13h BIOS调用,将数据从硬盘加载到内存。所以我写了类似的东西:

al

并在启动脚本上使用__stage2_size = .; BYTE((ALIGN(.) / 512) - 1); . = ALIGN(512);