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