请教定义已初始化全局变量导致程序大小改变的问题
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了, 代码段和数据段是挨着的,那为什么这回代码段和数据段又是挨着的了呢?
谢谢!!!