Linu平台g和动态共享库的基础知识.doc

Linu平台g和动态共享库的基础知识.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux平台gcc和动态共享库的基础知识 关键字: gcc 对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧。 一、GNU gcc的编译工具用法 我们先来写一个简单的C程序:hello.c C代码 #include?<stdio.h> ?? ?? void?print_hello()?{ ?? ??printf("Hello?World\n"); ?? } ?? ?? int?main(int?argc,?char?argv[])?{ ?? ??print_hello(); ?? ??return?0; ?? }?? 定义了一个print_hello函数,调用main函数打印Hello World。 如何编译它呢? C代码 gcc?-o?hello?-O2?hello.c?? -o参数指定生成的可执行程序的文件名, -O2是优化级别。该命令会编译生成hello可执行程序,看看这个文件:ls -l hello C代码 -rwxr-xr-x??1?robbin?users?11939?2008-11-02?13:48?hello?? 有11KB大小。 看看他链接了哪些系统动态链接库,用ldd命令: C代码 ldd?hello?? 输出信息为: C代码 libc.so.6?=>?/lib64/tls/libc.so.6?(0x0000002a9566d000) ?? /lib64/ld-linux-x86-64.so.2?(0x0000002?? libc是C语言标准函数库,ld是动态链接器。 接着我们看看hello这个程序里面有哪些符号,用nm命令: C代码 nm?hello?? 输出: C代码 00000000005008f8?A?__bss_start ?? 000000000040043c?t?call_gmon_start ?? ...... ?? 00000000004004f0?T?main ?? 0000000000500658?d?p.0 ?? 00000000004004e0?T?print_hello ?? ?????????????????U?puts@@GLIBC_2.2.5 ?? 0000000000400410?T?_start?? 中间省略了一些,不过我们还是可以在符号表里面找到函数定义。 hello有11KB,体积偏大,去处符号表可以给它瘦身,我们用strip命令: C代码 strip?hello?? 然后再ls -l hello,输出为: C代码 -rwxr-xr-x??1?webuser?users?4464?2008-11-02?13:56?hello?? 只有4.4KB了,瘦身效果明显! 不过这次符号表再也看不到了,nm hello,输出为:nm: hello: no symbols。 最后如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令: C代码 strings?hello?? 输出信息为: C代码 /lib64/ld-linux-x86-64.so.2 ?? SuSE ?? libc.so.6 ?? puts ?? __libc_start_main ?? __gmon_start__ ?? GLIBC_2.2.5 ?? t?fff ?? Hello?World?? 友情提醒一下,如果你用Java写一个HelloWorld.java,编译以后你也可以用strings窥探一番。 二、动态共享库怎么使用 这次我们把hello.c拆开成为两个文件:hello.c和main.c。hello.c的代码是: C代码 #include?<stdio.h> ?? ?? void?print_hello()?{ ?? ??printf("Hello?World\n"); ?? }?? 而main.c的代码是: C代码 int?main(int?argc,?char?argv[])?{ ?? ??print_hello(); ?? ??return?0; ?? }?? hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库: C代码 gcc?-o?libhello.so?-O2?-fPIC?-shared?hello.c??? -fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编

文档评论(0)

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

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

1亿VIP精品文档

相关文档