• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

程序不是很大,编译出来却很大,这是什么情况?

@曲终人散@ 2018-04-21 浏览量:1948

我写的程序大概也就是几KB的样子,然后通过反汇编查看也确实是1.2KB左右,可是为什么生成的bin文件却33KB还多,而且在正常的机器码之后全是00,这是如何造成的?我是在linux下用arm-linux-gcc编译的

TIM截图20180421220852.png

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 在真正烧写的时候,这些00是不会烧写的,只有有用的数据程序才会被烧写。
    • 发布于 2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:20
  • 因为生成的bin文件是根据芯片容量来定的呀,看下你选的芯片是不是flash容量36k,那么出来的结果就和你现在生成的33k多很接近了。

    生成bin文件时,会将没有用到的区域填0或者1,出来的容量和芯片flash一致。

    如果生成hex文件,还会稍微再大一些。

    • 发布于2018-04-21
    • 举报
    • 评论 1
    • 0
    • 0
@曲终人散@ 回复了 赤心木zqw :我的flash是2M的,芯片上arm920t核的s3c2440 回复

  • 空的地方也是占字节的,不必理会就好

    如果介意的话,不同的平台表示空的指令字不同,有的是00 有的是FF,你可以参考手册查看,更改成默认的空指令字可以加快烧写速度。

    • 发布于2018-04-22
    • 举报
    • 评论 1
    • 0
    • 0
@曲终人散@ 回复了 dwwzl :其他程序就没有这情况,我是想知道为什么,而且这样每次都要下载33KB左右,怎么可能不理会 回复

  • 这是由于生成二进制与芯片容量,平台架构有关,后的00不用管,主要是前面一段二进制
    • 发布于2018-04-22
    • 举报
    • 评论 1
    • 0
    • 0
@曲终人散@ 回复了 ickey_LYL :。。。。。。。。 回复

  • bin文件地址是连续的,所以当数据连续为0xff或者0x00都会占用文件,hex文件会根据地址判断是否需要写入数据
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 用作烧写的部分,后面无关的部分其实都是站位数据。程序运行不到,不必理会。

    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 编译出来的程序与真正烧写在芯片上的程序的大小是不一样的。不知道你编译出来的是out文件,还是hex文件。
    你编译时,使用的gcc都使用了哪些参数,是不是包括了debug的信息等等。

    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 跟你的编译器还有编译环境有很大关系,在win的环境下一般不会这样
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • GCC会增加一些平台相关的东西。也许这些占用了不少地址吧
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 应该是产生补充填0了,根据flash大小
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • bin 里面没有烧录位置的信息,需要用 0x00 或者 0xff 填充,去掉填充还是那么多有效代码
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 空的地方占字节的,存储区1:1镜像一样的东西,如果想文件小一些,用rar压缩一下,这些占位0都会被压掉
    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 后面的00是根据flash容量自动补,和编译器有关
    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 1. C语言翻译成汇编本身就会多出很多指令。一条C可能是几条指令 

    2.全局变量等,也就是ZI段会直接占用BIN很多空间。这段数据段被初始化为0。

    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 一个是程序效率问题,然后是芯片容量大,补了0
    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 是c语言的编译效率问题,还有flash中的00不用管他就行
    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 有些是编译器多编译出来的内容,会占用不少空间
    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 编译器是将高级语言的代码转为机器码,如果高级语言中有些功能需要开辟很多的空间,最常见的函数堆栈占用,那么生成出来的程序自然就大。

    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 编译是个很复杂的过程.其实涉及到库函数的调用.
    • 发布于2018-04-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 一个是需要加入你引入的各种类库,这些可能会占用空间,另外一种是为了补齐内存
    • 发布于2018-04-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 除了你的程序还有很多库需要链接,虽然那些代码不是你写的,但是是你需要用的
    • 发布于2018-04-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

程序不是很大,编译出来却很大,这是什么情况?