Chinaunix
标题:
GCC 链接脚本这样写对吗?编译出来的bin 居然有700多M
[打印本页]
作者:
cjjnjust
时间:
2010-09-30 23:26
标题:
GCC 链接脚本这样写对吗?编译出来的bin 居然有700多M
本帖最后由 cjjnjust 于 2010-10-08 16:04 编辑
我的目的就是想用jlink直接加载到RAM中运行.
利用这个脚本编译出来的elf文件大概几百K,但是用objcopy生成bin 后照理说是变小,但是确是700多M.
补充:我想调用C库中的vsprintf函数.
SECTIONS{
. = 0x30000000;
. = ALIGN(4);
.text : {
nand_main.o (.text)
* (.text)
}
__libc_subinit : { * (__libc_subinit) }
__libc_atexit : { * (__libc_atexit) }
__libc_subfreeres : { * (__libc_subfreeres) }
. = ALIGN(4);
.rodata : { * (.rodata) }
. = ALIGN(4);
.data : { * (.data) }
. = ALIGN(4);
.bss : { * (.bss) }
}
目前我的办法是直接在脚本里面为这些段添加装载地址.这样弄了好像就可以了.不知道方法正确不.
作者:
linyunxian
时间:
2010-10-01 09:52
给出你的 objdump 命令的参数看看?
作者:
cjjnjust
时间:
2010-10-07 18:56
国庆哈哈..
下面是arm-linux-objdump -h nand_elf 的输出结果.
nand_elf: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00046f00 30000000 30000000 0000d090 2**4
CONTENTS, ALLOC, LOAD, CODE
1 .glue_7 00000000 30046f00 30046f00 00053f90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .glue_7t 00000000 30046f00 30046f00 00053f90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .data 000010c8 30046f00 30046f00 00053f90 2**2
CONTENTS, ALLOC, LOAD, DATA
4 .got 00000008 30047fc8 30047fc8 00055058 2**2
CONTENTS, ALLOC, LOAD, DATA
5 .got.plt 0000000c 30047fd0 30047fd0 00055060 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .bss 00000cb4 30047fe0 30047fe0 00055070 2**4
ALLOC
7 .rodata.str1.4 00000038 30048c94 30048c94 00055070 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .comment 0000236e 00000000 00000000 000550a8 2**0
CONTENTS, READONLY
9 __libc_atexit 00000004 00002370 00002370 00000094 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rodata 0000cfa8 00002374 00002374 00000098 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 __libc_subinit 0000000c 0000f31c 0000f31c 0000d040 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 __libc_subfreeres 0000003c 0000f328 0000f328 0000d04c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DAT
我想应该是我在代码里面调用C库的vsprintf函数的原因.然后它调用了这三个函数:
__lib_atexit __libc_subinit __libc_subfreeres
不过奇怪.当用ADS的时候.scat_ram.scf链接脚本里面也是这样.为什么它没有问题.
作者:
wwwlh
时间:
2010-10-08 10:50
__libc_subinit会预先初始化内存空间,你以jlink直接加载到RAM运行自然要初始化内存了,预分配的方式是生成巨大的空间了。
作者:
cjjnjust
时间:
2010-10-08 11:29
回复
4#
wwwlh
我的步骤是:
h
loadbin nand.bin 0x30000000
setpc 0x30000000
g
其实板子上有VIVI ,在我开板子的时候就应该初始化过了.
当我不调用C库的相关函数的时候,bin 文件就正常了.一调用到C库的文件,就会导致bin文件异常大.这个还真的比较晕.
是不是C库中的函数的地址采用虚拟地址,大概在0x0000**什么的.而我这边虚拟地址和物理地址相同,导致了bin文件要填充0x00000000-0x33fffffff之间的空间来给C库函数.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2