免费注册 查看新帖 |

Chinaunix

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

GCC 链接脚本这样写对吗?编译出来的bin 居然有700多M [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-30 23:26 |只看该作者 |倒序浏览
本帖最后由 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) }
}

目前我的办法是直接在脚本里面为这些段添加装载地址.这样弄了好像就可以了.不知道方法正确不.

论坛徽章:
0
2 [报告]
发表于 2010-10-01 09:52 |只看该作者
给出你的 objdump 命令的参数看看?

论坛徽章:
0
3 [报告]
发表于 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链接脚本里面也是这样.为什么它没有问题.

论坛徽章:
0
4 [报告]
发表于 2010-10-08 10:50 |只看该作者
__libc_subinit会预先初始化内存空间,你以jlink直接加载到RAM运行自然要初始化内存了,预分配的方式是生成巨大的空间了。

论坛徽章:
0
5 [报告]
发表于 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库函数.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP