请教定义已初始化全局变量导致程序大小改变的问题

wzz24 2014-12-09 11:42:33
在ok6410环境下面的一个裸机程序,
现在遇到这样的问题:
在main.c里面定义一个已经初始化的全局变量,编译后程序有30多KB,去掉这个变量后只有10几个字节

------------------------------------------------------
makefile 如下:

objs := start.o main.o
uart.bin: $(objs)
arm-linux-ld -Ttext 0x50000000 -o uart.elf $^
arm-linux-objcopy -O binary -S uart.elf $@
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o -c -o $@ $<
------------------------------------------------------
start.S 如下:

.globl _start
_start:
reset:
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4
ldr sp, =8*1024
------------------------------------------------------
main.c 如下:

int i=3; //main.c 就一行代码
------------------------------------------------------

现在有2个问题不明白:
1.为什么一个全局变量导致编译后大小差这么多? 我知道已初始化的变量是放在数据段的,看bin文件,代码段和数据段中间是一堆0,为什么代码段和数据段不是挨着的呢?
2.我把makefile改了一下,改成:

objs := start.o main.o
uart.bin: $(objs)
# arm-linux-ld -Ttext 0x50000000 -o uart.elf $^ #去掉原来的这行
${LD} -Tuart.lds -o uart.elf $^ #改成用lds文件
arm-linux-objcopy -O binary -S uart.elf $@
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o -c -o $@ $<
------------------------------------------------------
uart.lds 如下:
SECTIONS {
. = 0x50000000;

.text : {
start.o
main.o
* (.text)
}

. = ALIGN(4);
.rodata : {
* (.rodata)
}

. = ALIGN(4);
.data : {
* (.data)
}

. = ALIGN(4);
bss_start = .;
.bss : { *(.bss) *(COMMON) }
bss_end = .;
}

编译后生成的程序大小是40个字节,感觉还算靠谱,看bin文件,代码段和数据段没有那一堆0了, 代码段和数据段是挨着的,那为什么这回代码段和数据段又是挨着的了呢?

谢谢!!!
...全文
257 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzz24 2014-12-10
  • 打赏
  • 举报
回复
谢谢了^_^ 不知道有没有遇到类似问题的同学
曹大夯 2014-12-09
  • 打赏
  • 举报
回复
这个看起来好像是编译器和Linker的行为问题。 你已经分析得很清楚了。 看起来,对编译器来说,数据段有数据和数据段为空相差很大。只要有,他就会默认分配一段足够大的空间。
曹大夯 2014-12-09
  • 打赏
  • 举报
回复
工程项目。以结果为导向。找到明确的文档说明很难。 也许你可以直接看arm-linux-ld的源码。
wzz24 2014-12-09
  • 打赏
  • 举报
回复
谢谢版主^^ 从结果来看,的确是这样的,请问有没有哪里明确说明问题的文档之类的,要不感觉一直在猜,还是稀里糊涂的^^
“小红书”——给你安利几个小程序的“坑”微信小程序写在前面  小程序发布至今已有一年多时间,很多人都已经在小程序道路上狂奔。最近我也开始了学习小程序,学了一段时间后,想看看这段时间的学习效果,于是边学习边开始了我的第一个小程序。相信很多人都用过小红书吧,我可是被它安利了很多好东西呢,所以想着就仿写一个小红书的微信小程序吧。下面我就给大家“安利”几个我在写的过程中的“坑”。  因为花的时间不多,功能有很多没有完善,页面写的不是很好看,请各位将就着看啦。╮(╯▽╰)╭   准备工作  1. 开发环境:WXML(HTML),WXSS(CSS),Javascript  2. 开发工具:vscode,微信开发者工具  3. 辅助工具:Markman:图标标注工具,可用于取色、测量。Easy-Mock:可以伪造假数据,在js中引用就好了。点这里可以查看我的项目数据。Markdown:在线编辑器GifCam:Gif录制工具 微信小程序开发文档Iconfont-阿里巴巴矢量图标库:各种需要的小图标都有哦遇到的几个问题1、首页导航栏左右滑动效果图:  这部分,是通过微信小程序的scroll-view组件来完成的。代码如下:改变效果图:  这部分,是通过微信小程序的swiper组件来完成的。代码如下:                                                                                                    {{notes.title}}                              <!-- 作者信息 -->                                              {{notes.writer}}                                                {{notes.like}}                                    使用swiper组件,将所有文章列表包起来,每个swiper-item表示不同的列表模块。之前在导航栏各列表项绑定了不同

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧