- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译和汇编
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 例 题 5 cc是UNIX系统上C语言编译命令, ?l是连接 库函数的选择项。某程序员自己编写了两个函 数库libuser1.a和libuser2.a(库名必须以lib为前 缀),当用命令 cc test.c ?luser1.a ?luser2.a 编译时,报告有未定义的符号,而改用命令 cc test.c ?luser2.a ?luser1.a 时,能得到可执行程序。试分析原因 (备注:库名中的lib在命令中省略。该命令和命令cc test.c libuser1.a libuser2.a的效果一致) 例 题 5 cc test.c ?luser1.a ?luser2.a 解答 test.c libuser1.a libuser2.a 引用a 定义b 定义a 引用b 例 题 6 cc是UNIX系统上C语言编译命令,?l是连接 库函数的选择项。两个程序员分别编写了函数 库libuser1.a和libuser2.a,当用命令 cc test.c ?luser1.a ?luser2.a 编译时,报告有重复定义的符号。而改用命令 cc test.c ?luser2.a ?luser1.a 时,能得到可执行程序。试分析原因 例 题 6 cc test.c ?luser1.a ?luser2.a 一种情况 test.c libuser1.a libuser2.a 引用a 定义a 定义b 引用b 定义a 若干人一起开发软件时 有可能发生 a的使用局部于文件,应加static而未加 例 题 7 两个C文件link1.c和link2.c的内容分别如下 int buf[1] ={100}; 和 extern int ?buf; main() { printf(“%d\n”, ?buf); } 在X86/Linux经命令cc link1.c link2.c编译后, 运行时产生如下的出错信息 Segmentation fault (core dumped) 请说明原因 例 题 7 int buf[1] ={100}; 和 extern int ?buf; main() { printf(“%d\n”, ?buf); } 连接时不检查名字的类型 - 虽对buf的类型持不同观点,但能连接成目标程序 连接时让不同文件中同一名字的地址相同 - 运行时,在link2.c中,由于buf的内容是100,取?buf的值就是取地址为100的单元的内容。该地址不在程序数据区内,报错 若把这些代码放在一个文件中,编译时报错 习 题 * * * * * * * * * * * * * * * * * * * * * * * * * 11.1 C语言编译系统 这里描述的装入过程从概念上来说是正确的 若需要了解装入过程真正是怎样工作的,必须在理解了进程、虚拟内存和内存分页等概念以后 11.1 C语言编译系统 11.1.8 动态连接 静态库 周期性地被维护和更新 内存可能有多份printf和scanf的代码 共享库 在运行时可以装到任意的内存位置,被内存中的进程共享 11.1 C语言编译系统 共享库以两种不同的方式被共享 共享库的代码和数据被所有引用该库的可执行目标文件所共享 共享库的.text节在内存中的一个副本可以被正在运行的不同进程共享 11.1 C语言编译系统 可重定位文件 翻译器 (cpp,cc1,as) main.c 源文件 连接器(ld) main.o libc.so mylib.so 重定位和符号表信息 部分连接的可执行目标文件 swap2 加载器(execve) libc.so mylib.so 动态连接器(ld-linux.so) 代码和 数据 此时,动态连接器是内存中已完全连接的可执行代码 11.1 C语言编译系统 加载器通常装入和运行动态连接器 动态连接器接着完成连接任务 把libc.so的文本和数据装入内存并进行重定位 把m
文档评论(0)