为什么 "data = .;" 在链接描述文件中要重复三次?
Why should "data = .;" be repeated three times in a linker script?
我在 link 中看到了这个脚本
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
和后面的都是一样的风格。他们有什么用?为什么要这样写?
语法<symbol> = .
只是在当前地址定义了一个符号。
您可以像这样使用这个符号:
extern int __code;
int foo()
{
cout << "Address of __code" << &__code << endl;
}
_code
和 __code
通常保存文本部分的起始地址。这是从您编译的系统的启动代码中使用的。
我认为没有前导下划线的定义符号并不常见。这可能会导致与代码中的正常定义发生冲突。但这只是一个惯例。从技术上讲,您可以定义您想要和需要的东西。规则与项目中的所有其他符号相同:永远不要定义符号两次 :-)
我在 link 中看到了这个脚本 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
和后面的都是一样的风格。他们有什么用?为什么要这样写?
语法<symbol> = .
只是在当前地址定义了一个符号。
您可以像这样使用这个符号:
extern int __code;
int foo()
{
cout << "Address of __code" << &__code << endl;
}
_code
和 __code
通常保存文本部分的起始地址。这是从您编译的系统的启动代码中使用的。
我认为没有前导下划线的定义符号并不常见。这可能会导致与代码中的正常定义发生冲突。但这只是一个惯例。从技术上讲,您可以定义您想要和需要的东西。规则与项目中的所有其他符号相同:永远不要定义符号两次 :-)