|
|
|
|
 请问怎样连接,才能让bss段不占空间 - dswei [ 2005-06-16 11:58 | 450 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - BNN [ 2005-06-17 01:31 | 140 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - dswei [ 2005-06-17 11:27 | 860 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - dswei [ 2005-06-17 11:38 | 284 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - teawater [ 2005-06-17 11:59 | 39 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - dswei [ 2005-06-17 17:55 | 1,856 byte(s)]
 Re: 请问怎样连接,才能让bss段不占空间 - BNN [ 2005-06-17 11:54 | 126 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
我的lds文件为:
SECTIONS {
. = 0x30004000;
.init : TA(0) { head.o main.o }
}
在main.c中定义了一个数组:
long test[500];
这样连接出来的binary文件比较大,我看其反汇编,发现代码是比较少的,只是文件的后面被扩展了500*4字节的空间。
请问怎样设置连接参数把这500*4去掉,代码是写到flash中去的。
谢谢
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
bss section should by default not occupy space at all. Your linker script must have some defects.
Please post out all your scripts.
|
|
|
----
天若有情天亦老,人间正道是沧桑。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
1.Makefile如下:
leds : head.S main.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -o main.o main.c
arm-linux-ld -Ttest.lds head.o main.o -o leds_tmp.o
arm-linux-objcopy -O binary -S leds_tmp.o leds
arm-linux-objdump -D -b binary -m arm leds >disassemble.s
clean:
rm -f leds *.o
2、test.lds如下:
SECTIONS {
. = 0x30004000;
.init : AT(0) { head.o main.o}
}
3、head.S如下:
.text
.global _start
_start:
ldr sp, =1024*4
bl main
halt_loop:
b halt_loop
4、main.c如下:
long data[500];
int main()
{
while(1);
return 0;
}
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
谢谢BNN!
lds改为:
SECTIONS {
. = 0x30004000;
.text : AT(0) { *(.text) }
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
难道前面那个lds文件不能分辨bss段吗?
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
很高兴问题解决了。
Please try to read something about linker scripts tutorial and so on. It is very useful.
|
|
----
天若有情天亦老,人间正道是沧桑。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
碰都一个奇怪的问题,查“Using LD, the GNU linker - Table of Contents.htm”也没发现答案:
1、我的程序有一个unsigned long const val[ ]数组(这个称为A),还有一些直接使用字符串做参数的函数,比如strcpy(pstr,"hello")("hello"这类字符串称为B)。编译后,A、B都属于rodata段吧?暂且这么认为
2、使用如下lds文件连接:
SECTIONS {
. = 0x30004000;
.text : { *(.text) }
/* .rodata ALIGN(4) : { *(.rodata) } */
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
结果很奇怪:
lds文件中是否使用“.rodata ALIGN(4) : { *(.rodata) }” A是否为const 生成文件大小
1、 YES NO 5K
2、 YES YES 5K
3、 NO YES 11K
4、 NO NO 800多M
查看反汇编码,
(1) 3与1、2不同是因为:3的rodata段被放在bss段后面,所以多了bss段的6K数据(我定义了一个比较大的全局数组)。
(2) 1、2没分别是因为:bss都是在最后面。
(3) 我不明白的是4,怎么来的800多M?0x30004000大约等于800M,这之间有什么关系呢?
(4) 我对rodata段存放的位置很困惑,有时候发现它放在文件的开头,有时候在末尾:请原谅我不能把代码帖出来,我试图找到最小集合,但文件实在太多了。
(5) ld手册说rodata默认为text段,但从上面看来并非如此
请各位给点建议,我看的资料只有对ld命令进行介绍的,但它们都未涉及“段”的介绍。如果太麻烦,推荐点资料也行!谢谢
|
|
|
[Original]
[Print]
[Top]
|
|
|