3579|14

419

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

如何在link文件中给某个C文件的bss分配单独的段? [复制链接]

 

我想把某个C文件的bbs放在一个单独的段。这样在程序运行中,把这一段RAM全部清零,使某个模块回复到初始状态。我使用的编译器是GCC。我修改链接脚本,添加了如下这段。

.keyscan_bss :
{
            . = (((. + 3) / 4)*4);
            PROVIDE(_keyscan_bss_start_ = .);
            ./proj/drivers/keyboard.o(.sbss)
            ./proj/drivers/keyboard.o(.sbss.*)
            ./proj/drivers/keyboard.o(.bss)
            ./proj/drivers/keyboard.o(.bss.*)
}
PROVIDE(_keyscan_bss_end_ = .);

但是发现只有static变量放到这个段里。全局变量还是在原来的BSS段。难道全局变量不属于keyboard.o吗?请大家指点?

此帖出自编程基础论坛

最新回复

可能是被优化掉了,应该加KEEP命令。   详情 回复 发表于 2023-11-4 16:18
点赞 关注
 

回复
举报

661

帖子

18

TA的资源

纯净的硅(初级)

沙发
 

@辛昕 @chenzhufly ,他们两个都是这方面的专家了。

此帖出自编程基础论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 

模式匹配的吧,看看 keyboard.o 和 * 通配符的顺序是不是有问题。

此帖出自编程基础论坛

点评

我是照猫画虎。原来的BSS段是这样的。 .bss : { . = (((. + 3) / 4)*4); PROVIDE(_start_bss_ = .); *(.sbss) *(.sbss.*) *(.bss) *(.bss.*) } PROVIDE(_e  详情 回复 发表于 2020-3-4 10:03
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

4
 
freebsder 发表于 2020-3-3 22:45 模式匹配的吧,看看 keyboard.o 和 * 通配符的顺序是不是有问题。

我是照猫画虎。原来的BSS段是这样的。

.bss :
{
	    . = (((. + 3) / 4)*4);
	    PROVIDE(_start_bss_ = .);
        *(.sbss)
        *(.sbss.*)
        *(.bss)
        *(.bss.*)
}
PROVIDE(_end_bss_ = .);

我就把*替换成keyboard.o

此帖出自编程基础论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

5
 
.keyscan_bss :
{
            . = (((. + 3) / 4)*4);
            PROVIDE(_keyscan_bss_start_ = .);
            ./proj/drivers/keyboard.o(.sbss)
            ./proj/drivers/keyboard.o(.sbss.*)
            ./proj/drivers/keyboard.o(.bss)
            ./proj/drivers/keyboard.o(.bss.*)
}
PROVIDE(_keyscan_bss_end_ = .);

.bss :
{
	    . = (((. + 3) / 4)*4);
	    PROVIDE(_start_bss_ = .);
        *(.sbss)
        *(.sbss.*)
        *(.bss)
        *(.bss.*)
}
PROVIDE(_end_bss_ = .);

试试。

此帖出自编程基础论坛

点评

我就是这样子写的。可是keyboard.o里的全局变量都被分配到下面的bss里去了。只有静态变量在keyscan_bss里。  详情 回复 发表于 2020-3-4 12:39
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

6
 
freebsder 发表于 2020-3-4 10:18 .keyscan_bss : { . = (((. + 3) / 4)*4); PROVIDE(_keyscan_bss_start_ = . ...

我就是这样子写的。可是keyboard.o里的全局变量都被分配到下面的bss里去了。只有静态变量在keyscan_bss里。

此帖出自编程基础论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

7
 

那就提供完整的script文件吧,没精力猜什么写法。

此帖出自编程基础论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

295

帖子

1

TA的资源

版主

8
 

你的是gcc编译器,直接在代码里使用 __attribute__ (section)  属性,具体看一下gcc的手册,

此帖出自编程基础论坛

点评

这样也可以就是稍微麻烦一点。要在每个变量前加这段属性。  详情 回复 发表于 2020-3-6 10:00
 
 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

9
 
hotsauce1861 发表于 2020-3-4 22:13 你的是gcc编译器,直接在代码里使用 __attribute__ (section)  属性,具体看一下gcc的手册,

这样也可以就是稍微麻烦一点。要在每个变量前加这段属性。

此帖出自编程基础论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

10
 

1. 原因:默认情况下,对于GCC,没有static修饰的静态变量属于common section,而不属于BSS section。GCC这样做是为了做一些优化(具体哪些优化,可以查看GCC文档对-fno-common的描述)。  另一方面,多数链接文件会把common section放在BSS section中。

2. 一个解决方法:编译选项添加 -fno-common

 

此帖出自编程基础论坛

点评

大神!谢谢你的解释。我试一下。 1. 没有static修饰的静态变量属于common section 2. 多数链接文件会把common section放在BSS section中 这不是脱裤子放屁,多此一举吗?  详情 回复 发表于 2020-4-13 10:42
 
 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

11
 
成风 发表于 2020-4-10 17:49 1. 原因:默认情况下,对于GCC,没有static修饰的静态变量属于common section,而不属于BSS section。GCC这 ...

大神!谢谢你的解释。我试一下。

1. 没有static修饰的静态变量属于common section

2. 多数链接文件会把common section放在BSS section中

这不是脱裤子放屁,多此一举吗?

此帖出自编程基础论坛

点评

一:全局变量只是静态变量的一种,但为了方便描述,下面用“全局变量”代替“静态变量”。   二:不好意思,“没有static修饰的静态变量属于common section”这描述有误,  详情 回复 发表于 2020-4-13 21:45
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

12
 
本帖最后由 成风 于 2020-4-13 21:49 编辑
woody_chen 发表于 2020-4-13 10:42 大神!谢谢你的解释。我试一下。 1. 没有static修饰的静态变量属于common section 2. 多数链 ...

一:全局变量只是静态变量的一种,但为了方便描述,下面用“全局变量”代替“静态变量”。

 

二:不好意思,“没有static修饰的静态变量属于common section”这描述有误,应该是 没有static修饰的并且未初始化(或者初始化为0)全局变量属于common section。如

1. int a;

2. int b = 0;

下面的则不属于common section

1. static int c;

2. int d = 1;

3. static int e = 0;

4. static int f = 2;

 

三:把那些全局变量放在common section是为了做优化,把common section放在bss section里面是为了把common section清零。

1. 假设那些全局变量不放在common section,而是直接放在bss section,那么它们很可能零散分布在bss section,没办法做优化。

2. 假设common section不放在bss section里面,难道先写一段代码把bss section清零,然后再写段代码把common section清零?把common section放在bss section里面一起清零难道它不香么?

 

 

 

 

 

 

 

 

 

此帖出自编程基础论坛

点评

亲测可用。 加了-fno-common后,重复定义的变量会报错。没有这个选项不会报错。  详情 回复 发表于 2020-4-14 11:21
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

13
 

要是使用-fno-common还不行的话,可以在链接文件试试使用KEEP关键字。

此帖出自编程基础论坛
 
 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

14
 
成风 发表于 2020-4-13 21:45 woody_chen 发表于 2020-4-13 10:42 大神!谢谢你的解释。我试一下。 1. 没有static修饰的静态变量属于co ...

亲测可用。

加了-fno-common后,重复定义的变量会报错。没有这个选项不会报错。

此帖出自编程基础论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

15
 

可能是被优化掉了,应该加KEEP命令。

此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表