- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GNU gcc的编译工具用法(转)
GNU gcc的编译工具用法(转)
分类: Linux 2011-09-28 16:56 37人阅读 评论(0) 收藏 举报
对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧。
一、GNU gcc的编译工具用法
我们先来写一个简单的C程序:hello.c
C代码
01 #include stdio.h 02 ?
03 void print_hello() { 04 ??printf(Hello World\n);
05 } 06 ?
07 int main(int argc, char argv[]) { 08 ??print_hello();
09 ??return 0; 10 } 定义了一个print_hello函数,调用main函数打印Hello World。
如何编译它呢?
C代码
1 gcc -o hello -O2 hello.c -o参数指定生成的可执行程序的文件名, -O2是优化级别。该命令会编译生成hello可执行程序,看看这个文件:ls -l hello
C代码
1 -rwxr-xr-x? 1 robbin users 11939 2008-11-02 13:48 hello 有11KB大小。 看看他链接了哪些系统动态链接库,用ldd命令:
C代码
1 ldd hello 输出信息为:
C代码
1 libc.so.6 = /lib64/tls/libc.so.6 (0x0000002a9566d000) 2 /lib64/ld-linux-x86-64.so.2 (0x0000002 libc是C语言标准函数库,ld是动态链接器。 接着我们看看hello这个程序里面有哪些符号,用nm命令:
C代码
1 nm hello 输出:
C代码
1 00000000005008f8 A __bss_start 2 000000000040043c t call_gmon_start
3 ...... 4 00000000004004f0 T main
5 0000000000500658 d p.0 6 00000000004004e0 T print_hello
7 ?????????????????U puts@@GLIBC_2.2.5 8 0000000000400410 T _start 中间省略了一些,不过我们还是可以在符号表里面找到函数定义。 hello有11KB,体积偏大,去处符号表可以给它瘦身,我们用strip命令:
C代码
1 strip hello 然后再ls -l hello,输出为:
C代码
1 -rwxr-xr-x? 1 webuser users 4464 2008-11-02 13:56 hello 只有4.4KB了,瘦身效果明显! 不过这次符号表再也看不到了,nm hello,输出为:nm: hello: no symbols。 最后如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令:
C代码
1 strings hello 输出信息为:
C代码
1 /lib64/ld-linux-x86-64.so.2 2 SuSE
3 libc.so.6 4 puts
5 __libc_start_main 6 __gmon_start__
7 GLIBC_2.2.5 8 t fff
9 Hello World 友情提醒一下,如果你用Java写一个HelloWorld.java,编译以后你也可以用strings窥探一番。
二、动态共享库怎么使用
这次我们把hello.c拆开成为两个文件:hello.c和main.c。hello.c的代码是:
C代码
1 #include stdio.h 2 ?
3 void print_hello() { 4 ??printf(Hello World\n);
5 } 而main.c的代码是:
C代码
1 int main(int argc, char argv[]) { 2 ??print_hello();
3 ??return 0; 4 } hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:
C代码
1 gcc -o libhello.so -O2 -fP
您可能关注的文档
最近下载
- 辽2015T402 民用建筑空调与供暖冷热计量设计与安装.docx
- 《学校绿化养护服务方案》.doc
- 河北建筑国企招聘笔试题库.pdf VIP
- 副高卫生职称《放射医学》(题库)模拟试卷三.docx VIP
- 第四章原产地规则.ppt VIP
- 《海南全景解析》课件.ppt VIP
- 2016年张掖市中考化学试卷及答案.doc VIP
- AP微观经济学 2019年真题 附答案和评分标准 AP Microeconomics 2019 Real Exam with Answers and Scoring Guidelines.pdf VIP
- 外研版八年级上册英语单词表(附自测单).doc
- 入职通知书模板 .doc VIP
文档评论(0)