【问题标题】:Why should "data = .;" be repeated three times in a linker script?为什么要“data = .;”在链接描述文件中重复三次?
【发布时间】:2015-03-29 16:34:39
【问题描述】:

我在 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 和闲散的都以相同的样式出现。它们是干什么用的?为什么要这样写?

【问题讨论】:

    标签: linker ld elf


    【解决方案1】:

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

    你可以像这样使用这个符号:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 2017-04-08
      • 2015-12-23
      • 2014-04-07
      • 2012-04-06
      • 1970-01-01
      • 2022-06-25
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多