在链接器脚本中定义符号有什么用处?

问题描述:

我想知道在链接脚本中定义符号有什么用处。使用链接脚本来安排不同的部分是可以理解的,但在脚本中定义新的符号对我来说并不清楚。我正在阅读一篇使用链接器脚本的文章,该脚本定义了两个新的符号,但这些符号在链接器脚本或文章中的其他地方未被引用。一个例子是使用在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等请解释使用时定义这样的符号的它们在脚本中的任何地方都没有引用。

vjain27,

我不知道为什么作为例子链接脚本定义了一个将定义符号。这主要是为了让可执行文件知道某个部分的开始和结束。如果需要复制数据或以其他方式在内存中操作数据,这非常有用。

当写一个x86引导程序,我想要的图像,通过使用为512个字节的倍数:

。 = ALIGN(512);

在链接描述文件中。

但是后来我需要一些方法来知道确切的大小,并将其传递给我的启动代码的al,这将启动一个int 13h BIOS调用,将数据从硬盘加载到内存。所以我写了类似于:

__stage2_size = .; 
BYTE((ALIGN(.)/512) - 1); 
. = ALIGN(512); 

并在引导脚本上使用__stage2_size