网站大量收购独家精品文档,联系QQ:2885784924

GNU gcc的编译工具用法(转).doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档