ARMCC和ARM-GCC创建自定义输入段

以下仅仅是本人的学习笔记,可能存在错误,欢迎指正

ARMCC

  • 使用__attribute__((section("section name")))例如:

    /*当“testvar”存在时,变量var会被添加到段,若不存在,则会创建段“testvar”,并添加变量var*/
    int var __attribute__((section("testvar"))) = 0;
    int var __attribute__((section("testvar"))) = 0;
    

    如果不使用sct文件指定输出段,则变量会根据const修饰符来决定最终的输出段

  • sct文件指定输入段的输出段

    LR_ROM1 0x80000000 0x000C0000
    {
    	 ADDER 0x80000000 
    	 {
    		 file.o (testvar) 
    	 }
    }
    

    如果指定了输出段,则文件内的所有使用__attribute__((section(“testvar”)))修饰的变量都将添加到该输出段,这个操作是强制的,即使没有const修饰,变量依然会被添加到RO段

    更加详细的信息可以看keil_armlink_user_guide的7.2.5节,keil_armlink_user_guide文档keil自带。

  • 如果想获得段起始地址则可以这样操作。

    /*链接器链接时会为段生成几种符号,符号不占物理空间,仅仅代表地址*/
    extern const int testvar$$Base;/*符号section_name$$Base在段起始地址*/
    extern const int testvar$$Limit;/*符号section_name$$Limit在段结束地址*/
    printf("%p",&testvar$$Base);
    printf("%p",&testvar$$Limit);
    

ARM-GCC

  • 与ARMCC相同,使用__attribute__((section("section name")))指定输入段,但不同的是,链接器不会自动将自定义段添加到输出段,因此,如果不在lds文件中指定输出段,则该输入段和指向该段的变量都将被弃用。
  • 标明自定义输入段的输入段方式如下:
    SECTIONS
    {
        .text :
        {
            __ftability_start = .;
            KEEP(*(section name))
            __ftability_end = .;
    	}
    }
    

    __ftability_start与__ftability_end是符号声明,与section_name$$Basesection_name$$Limit作用相同,因为ARM-GCC的链接器不会自己生成,所以需要在链接文件中声明

小结

  • 对于ARMCC,仅仅在代码中声明符号却不引用的话,map文件中不会记录该符号,更有可能将该输入段与指定到该段的变量丢弃(与是否使用used修饰有关),但是ARM-GCC直接将符号定义在链接文件中,无论文件中是否引用该符号都会被map文件记录。
  • rtthread中大量使用了这种方式来实现他们的初始化机制。
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值