为什么"数据=。;"在链接描述文件中重复三次?

时间:2015-01-30 08:21:18

标签: linker ld elf

我看到了这个链接脚本 http://www.jamesmolloy.co.uk/tutorial_html/1.-Environment%20setup.html

SECTIONS
{

    .text 0x100000 :
    {
        code = .; _code = .; __code = .;    // What is this line for?
        *(.text)
        . = ALIGN(4096);
    }

    .data :
    {
        data = .; _data = .; __data = .;
        *(.data)
        *(.rodata)
        . = ALIGN(4096);
    }

    .bss :
    {
        bss = .; _bss = .; __bss = .;
        *(.bss)
        . = ALIGN(4096);
    }

    end = .; _end = .; __end = .;
}

你可以看到,code, _code, __code和那些不幸出现在同一风格中的人。它们适用于什么?他们为什么要以这样的方式写作?

1 个答案:

答案 0 :(得分:4)

语法<symbol> = .只是在当前地址定义一个符号。

您可以使用以下符号:

extern int __code;

int foo()  
{
    cout << "Address of __code" << &__code << endl;
}

_code__code通常包含文本部分的起始地址。这是从您编译的系统的启动代码中使用的。

我认为没有前导下划线的Definig符号并不常见。这可能会导致与代码中的正常定义冲突。但这只是一个惯例。从技术上讲,您可以定义您想要和需要的东西。规则与项目中的所有其他符号相同:永远不要定义符号两次: - )