免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8060 | 回复: 10
打印 上一主题 下一主题

如何让gcc把全局未初始化变量、结构体、数组的数据放在.data段中,谢谢老师了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-13 16:23 |只看该作者 |倒序浏览
我们知道 编译器在编译程序时 最终把程序的二进制文件最少分成三个段:
.text (放代码)

.data (放已初始化不为0的数据,占用二进制文件的大小 即使初始为0的数据扔然放在.bss只少在gcc上是如此)

.bss(放未初始化的数据,不占用二进制文件的大小,而是在加载程序运行时由系统为这个段分配内存空间,并把这片内存初始化为0)

现在我想如何让gcc把全局未初始化变量、结构体、数组的数据放在.data段中,分配空间 不是把它们放在.bss段中,而是直接在二进制文件中
除了在每个定义全局未初始化变量、结构体、数组的前面加上__attribute__((section(".data"))),还有没有全局的方法让gcc把所有全局未初始化
变量、结构体、数组的数据放在.data段中
先谢谢各位老师了!!这个问题很重要 在次真诚谢谢各位了!!

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
2 [报告]
发表于 2011-12-13 16:52 |只看该作者
gcc把全局未初始化变量、结构体、数组的数据放在.data段中

偶从来没这么多新奇的想法, 我不知道你哪里来的这种想法...

你能告诉我们你想做什么么??

论坛徽章:
0
3 [报告]
发表于 2011-12-13 18:18 |只看该作者
回复 2# hanzhenlll


    首先谢谢您的回复 我说了放在.bss段的数据是在程序被加载运行时由操作系统为其分配内存空间并初始化为0  可是如果这个程序不是应用软件的化 而是直接放在裸机上运行的,那么当代码访问.bss段的数据时 就会得到一个随机值。因为你的二进制文件中没为.bss段分配空间……更危险的是,当你把这个二进制文件写入到内存时,比如写入到内存物理地址0时(假如这个程序的二进制文件大小只有512字节,由于它还包含.bss段,假设这个.bss段要512字节的内存空间 由于.bss段没有占用这个程序二进制文件的大小,所以就可能在内存物理地址512到1024包含另一个程序的二进制代码,所以第一个程序访问的不是它本身的数据 而是第二个程序的数据)

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2011-12-13 20:03 |只看该作者
回复 3# pdlenovo


    你這個估計得自己定制 linker script 了。

论坛徽章:
0
5 [报告]
发表于 2011-12-13 20:54 |只看该作者
回复 4# MMMIX


    谢谢您 说的有道理,可是如何定制呢

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
6 [报告]
发表于 2011-12-13 23:43 |只看该作者
除了gcc那个,没有了吧,你觉得还能想到更灵活合适的方法吗?

论坛徽章:
0
7 [报告]
发表于 2011-12-14 01:06 |只看该作者
除了gcc那个,没有了吧,你觉得还能想到更灵活合适的方法吗?
crazyhadoop 发表于 2011-12-13 23:43



    我也不知道有没有另外的方法

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2011-12-14 09:30 |只看该作者
回复 3# pdlenovo


    另外,你也可以看看 objcopy

论坛徽章:
0
9 [报告]
发表于 2011-12-14 10:30 |只看该作者
回复  pdlenovo


    另外,你也可以看看 objcopy
MMMIX 发表于 2011-12-14 09:30



    谢谢

论坛徽章:
0
10 [报告]
发表于 2012-05-25 13:49 |只看该作者
section ("section-name")通常,编译器将生成的代码存放在 .text 段中。
但有时可能需要其他的段,或者需要将某些函数存放在特殊的段中。
Section 属性指定将一个函数存放在特定的段中。
例如下面的声明:extern void foobar (void) __attribute__ ((section (".libtext")));上述语句将函数 foobar 存放在 .libtext 段中。
section 属性与 address 属性有冲突。忽略段名会导致警告。

给你一个地址
http://1632bit.com/UploadFile/2009110433832501.pdf
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP