- 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参数声明编
您可能关注的文档
- 第九章 核酸代谢.doc
- 第三章 酶化学.doc
- 第十章 蛋白质的生物合成及基因调控.doc
- 计算机数控系统(CNC).ppt
- 吸附与离子交换.ppt
- 信号处理基础.doc
- %%¥管道焊口无损探伤.doc
- (四)试点省血防工程经验交流.pdf
- 《华夏龙图》JPG扫描版.doc
- 《教育教学技能》(初中版)考试大纲.doc
- POWERPOINT 演示文稿 - 韶关学院计算机科学学院.pdf
- 仓管员的自我总结.pdf
- 初中美术教师个人工作总结.pdf
- 【化学】化学反应速率的影响因素课件 2023-2024学年高一下学期化学人教版(2019)必修第二册.pptx
- 【化学】共价晶体教学课件 2023-2024学年高二下学期人教版(2019)选择性必修2.pptx
- 【化学】过渡晶体和混合晶体及四类典型的晶体比较课件 2023-2024学年高二下人教版(2019)选择性必修2.pptx
- 【化学】化学反应速率课件 2023-2024学年高一下学期化学人教版(2019)必修第二册.pptx
- 【历年真题】:2022年江西省九江市中考数学历年真题汇总 (A)卷(含答案及解析).pdf
- 【历年真题】2022年北京市平谷区中考数学历年真题汇总 卷(Ⅲ).pdf
- 【历年真题】2022年中考数学历年高频真题专项攻克 B卷(含答案详解).pdf
文档评论(0)