硬汉嵌入式论坛

 找回密码
 立即注册
查看: 427|回复: 6
收起左侧

[技术讨论] 链接脚本文件ld语法

[复制链接]

55

主题

131

回帖

296

积分

高级会员

积分
296
发表于 2023-11-29 17:43:53 | 显示全部楼层 |阅读模式
下面是一个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.*)什么意思?



[C] 纯文本查看 复制代码
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
}




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-11-30 08:00:59 | 显示全部楼层
之前有个非常好的帖子介绍这个的,找不到了。

先看GCC文档熟悉下吧

GCC线上文档链接
https://www.armbbs.cn/forum.php? ... 3298&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

55

主题

131

回帖

296

积分

高级会员

积分
296
 楼主| 发表于 2023-11-30 09:19:27 | 显示全部楼层
eric2013 发表于 2023-11-30 08:00
之前有个非常好的帖子介绍这个的,找不到了。

先看GCC文档熟悉下吧

这个文档内容具体看哪一项能解答我的疑问?实在太多了,硬汉能指点一下吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-12-1 08:52:54 | 显示全部楼层
lindahnu 发表于 2023-11-30 09:19
这个文档内容具体看哪一项能解答我的疑问?实在太多了,硬汉能指点一下吗?

https://ftp.gnu.org/old-gnu/Manu ... l_chapter/ld_3.html
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2023-12-1 17:00:59 | 显示全部楼层
ctors一般是用于c++的构造函数;dtors用于c++析构函数;
init_array一般用于在main函数之前执行的函数表(  比如__attribute__((constructor))
void test(void){} 这个test函数将会在main之前执行)
init, fini表示c运行时的构造函数和c运行时的析构函数
最后5,6跟栈回溯有关,比如使用了cmbacktrace则必须配置最后这两个;

具体详细情况可能还是查看上面文档比较准确
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2023-12-1 17:13:41 | 显示全部楼层
https://blog.thea.codes/the-most ... nted-linker-script/  这个里面正对你上面的几个疑问描述的很详细了
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-12-1 17:47:02 | 显示全部楼层
看名称是C++构造与析构的编译输出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 08:57 , Processed in 0.174752 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表