链接脚本文件ld语法
下面是一个ld文件的内容,以下6个地方不明白代表什么意思,求解答!1、KEEP (*(.ctors))ctors代表什么意思?
2、KEEP (*(.dtors)) dtors代表什么意思?
3、KEEP (*(.init_array*)) init_array代表什么意思?
4、*(.init),*(.fini*)代表什么意思?
5、*(.ARM.exidx* .gnu.linkonce.armexidx.*)什么意思?
6、*(.ARM.extab* .gnu.linkonce.armextab.*)什么意思?
MEMORY
{
FLASH (RX) : ORIGIN = 0x00000000, LENGTH = 0x00040000
SRAM (WX): ORIGIN = 0x20000000, LENGTH = 0x00008000
}
REGION_ALIAS("REGION_TEXT", FLASH);
REGION_ALIAS("REGION_BSS", SRAM);
REGION_ALIAS("REGION_DATA", SRAM);
REGION_ALIAS("REGION_STACK", SRAM);
REGION_ALIAS("REGION_HEAP", SRAM);
REGION_ALIAS("REGION_ARM_EXIDX", FLASH);
REGION_ALIAS("REGION_ARM_EXTAB", FLASH);
SECTIONS {
PROVIDE (_intvecs_base_address =
DEFINED(_intvecs_base_address) ? _intvecs_base_address : 0x0);
.intvecs (_intvecs_base_address) : AT (_intvecs_base_address) {
KEEP (*(.intvecs))
} > REGION_TEXT
PROVIDE (_vtable_base_address =
DEFINED(_vtable_base_address) ? _vtable_base_address : 0x20000000);
.vtable (_vtable_base_address) (NOLOAD) : {
KEEP (*(.vtable))
} > REGION_DATA
.text : {
CREATE_OBJECT_SYMBOLS
*(.text)
*(.text.*)
. = ALIGN(0x4);
KEEP (*(.ctors))
. = ALIGN(0x4);
KEEP (*(.dtors))
. = ALIGN(0x4);
__init_array_start = .;
KEEP (*(.init_array*))
__init_array_end = .;
*(.init)
*(.fini*)
} > REGION_TEXT AT> REGION_TEXT
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : {
*(.rodata)
*(.rodata*)
} > REGION_TEXT AT> REGION_TEXT
.data : ALIGN (4) {
__data_load__ = LOADADDR (.data);
__data_start__ = .;
*(.data)
*(.data*)
. = ALIGN (4);
__data_end__ = .;
} > REGION_DATA AT> REGION_TEXT
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} > REGION_ARM_EXIDX AT> REGION_ARM_EXIDX
.ARM.extab : {
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > REGION_ARM_EXTAB AT> REGION_ARM_EXTAB
.bss : {
__bss_start__ = .;
*(.shbss)
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN (4);
__bss_end__ = .;
} > REGION_BSS AT> REGION_BSS
.heap : {
__heap_start__ = .;
end = __heap_start__;
_end = end;
__end = end;
KEEP(*(.heap))
__heap_end__ = .;
__HeapLimit = __heap_end__;
} > REGION_HEAP AT> REGION_HEAP
.stack (NOLOAD) : ALIGN(0x8) {
_stack = .;
__stack = .;
KEEP(*(.stack))
} > REGION_STACK AT> REGION_STACK
}
之前有个非常好的帖子介绍这个的,找不到了。
先看GCC文档熟悉下吧
GCC线上文档链接
https://www.armbbs.cn/forum.php?mod=viewthread&tid=113298&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2023-11-30 08:00
之前有个非常好的帖子介绍这个的,找不到了。
先看GCC文档熟悉下吧
这个文档内容具体看哪一项能解答我的疑问?实在太多了,硬汉能指点一下吗? lindahnu 发表于 2023-11-30 09:19
这个文档内容具体看哪一项能解答我的疑问?实在太多了,硬汉能指点一下吗?
https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/ld_3.html ctors一般是用于c++的构造函数;dtors用于c++析构函数;
init_array一般用于在main函数之前执行的函数表(比如__attribute__((constructor))
void test(void){} 这个test函数将会在main之前执行)
init, fini表示c运行时的构造函数和c运行时的析构函数
最后5,6跟栈回溯有关,比如使用了cmbacktrace则必须配置最后这两个;
具体详细情况可能还是查看上面文档比较准确 https://blog.thea.codes/the-most-thoroughly-commented-linker-script/这个里面正对你上面的几个疑问描述的很详细了 看名称是C++构造与析构的编译输出
页:
[1]