注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Allen小笔记

有时会忘记努力...

 
 
 

日志

 
 

如何写一个“最小”的C程序  

2010-03-30 18:14:09|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
                                                                        keywords:C 程序 链接

   最近一直在搞编译方面的东西,赶紧写下来记录,怕忘记了。
   原来,我读大学的时候,一直认为当程序员,最多和数据结构,编译原理之类的底层打交道,不会关心什么链接,库之类的东西。(之前一直使用的visual studio等系列工具,确实好用,确实人也呆头呆脑,离开了那个IDE什么都不会。我没鄙视VS,他确实很好用,快速方便。可惜不能在linux上用,不然我会把它当成一个强大的文本编辑器,而不是编译器)
   废话不多少,这个最简单的程序就是:退出,返回退出码。不要问我为什么只有退出功能?只是个好玩而已。

void exit()

{

asm("movl $42, %ebx \n\t"

                "movl $1,%eax \n\t"

  "int $0x80  \n\t"

);

}

void notmain()

{

exit();

}

   好了,代码写完了。简单解释一下。EXIT系统调用号为1,即eax=1. ebx表示进程退出码,这里为42.系统调用通过int 0x80来实现。

我们使用命令行的方式来编译它吧:

gcc  -c -fno-builtin XXXX.c

 ld -static -e notmain -o XXX  XXX.c

   好啦,编译通过我们看一下大小,理论上来说应该在几百bytes,大小不一定。再简单的解释一下,-c 表示只编译不链接。 -fno-builtin表示不采用gcc内置的函数,因为gcc会自作聪明的帮你优化。当然,你也可以不用这个参数。-e 表示入口函数是notmain,细心的话早就发现我们没有main函数。
   编译出来的东西还可以再小一点,我们写一个ld script

ENTRY(notmain)

SECTIONS

{

.=0x08048000+SIZEOF_HEADERS;

mytext : {*(.text)*(.data)*(.rodata)}

/DISCARD/ :{*(.comment)}

}

把上面的链接改成:ld -static -T XXX.lds -o XXXX XXXX.o

 编译出来是不是更小了一点呢?哈哈。再简单的解释一下,mytext : {*(.text)*(.data)*(.rodata)}表示把text,data,rodata段合并。/DISCARD/ :{*(.comment)}表示吧comment段删除掉。
  评论这张
 
阅读(560)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017