- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
FreeBSD可执行程序格式.doc
FreeBSD可执行程序格式
在FreeBSD下的可执行程序通常可分为两类,一类为使用各种解释语言编写的脚本,如sh、ap;T最初设想的全部目的,但这种文件格式却成为最流行的执行文件格式。除此之外,实际使用的文件格式还有一种较老的COFF格式,这种格式是在Unix System V R3.2中使用的,当前只有老版本的SCO Unix中还在使用它,而 SCO也正逐渐转向ELF格式。
FreeBSD可以同时支持这两种执行文件的格式,FreeBSD 2.2.x之前的版本使用a.out格式作为缺省的执行文件格式,到FreeBSD 3.x之后ELF格式成为缺省的执行文件格式,并且以后会彻底转向ELF。事实上在FreeBSD 下的a.out格式具备了相当多的特性,如动态连接等ELF格式具备的特性,也有一些ELF格式不具备的特性,如压缩执行文件格式。但由于FreeBSD中使用的编译器gcc决定不再支持a.out格式的缘故,因此FreeBSD也必须转向 ELF格式。这也是当前还支持a.out格式的FreeBSD版本缺省使用较老版本编译器的原因之一。
在FreeBSD中,a.out格式的执行文件可以支持压缩执行格式,这使得使用gzip压缩过的a.out格式的执行文件也能立即执行,当前还不能对ELF 格式的文件提供这种支持。
FreeBSD的文件格式从aout到ELF的转变是渐变的,首先是在3.0-RELEASE 中将执行程序的缺省格式转变为ELF格式,内核文件还保持aout格式,直至 FreeBSD-3.1,全部执行文件格式才缺省设置为ELF格式。
转向ELF也造成很多相关程序的转变,如原有的Boot Loader不支持 ELF格式的内核,3.1-RELEASE就升级到新Boot Loader;而原有的可加载模块lkm为aout格式,也需要转向ELF格式的modules。新可加载模块的位置为 /modules目录,并使用kldload、klduload、kldstat来进行管理。(aout格式的模块管理命令为modload、modstat和modunload)。
a.out和ELF格式使用的库文件也是不同的,使用ELF执行文件格式的 FreeBSD 3.x中,/usr/lib下为ELF格式的函数库,而用一个子目录/usr/lib/aout 存放a.out格式的函数库,用于兼容2.2.x之前版本的FreeBSD程序。但这给一些使用包装技术的软件(一些中文外挂系统)造成了一些小麻烦。对不同格式的执行文件要使用不同的包装库,系统不会将与程序本身格式不同的连接库连接到程序上,对应的错误信息为 bad magic,指出文件格式的不同。
由于3.x之后的缺省格式为elf格式,为了生成a.out格式的文件,必须在编译和连接时使用 -aout参数,告诉编译器gcc和连接器ld使用不同的格式生成执行文件。
静态连接和动态连接 在操作系统发展的早期,除了内核提供的接口,所有的库函数都要连接到程序中,这样所有的程序都可以直接在系统内核下运行。然而事实上大部分程序都会使用一些相同的库函数,尤其是在使用高级语言编程的时候,通常都使用同样的库。例如,C语言编写的程序通常都使用printf函数进行输出,使用scanf读入用户输入内容。如果每个库函数都连接到用户程序中,这样每个程序都会包括这个函数的一个拷贝,就浪费了内存空间。
因此,现代操作系统使用动态连接的技术,不将常用的库直接编译进每个程序中,而是保留相应的接口,在内核载入程序时,再使用动态连接程序将库载入并和执行程序连接起来。这就是动态连接的技术,由于库和程序是分别载入的,因此多个程序可以共享一个库的同一个拷贝,节约了资源。
不论对于a.out格式还是ELF格式,FreeBSD均支持动
123下一页 ——感谢阅读这篇文章,..,态连接,因此应用程序缺省就使用动态连接的方式。如果想使用静态连接,可以在应用程序编译连接时,指定-static连接选项,将目标程序连接成静态连接的执行文件。由于库代码被连接进执行文件中,静态连接的执行文件要比动态连接的执行文件要大。
$ cc -static -o a1 hello.c
$ cc -o a2 hello.c
$ ls -l a1 a2
-rcap.so.2 =gt; /usr/lib/libtermcap.so.2 (0x2809a000)
libc.so.3 =gt; /usr/lib/libc.so.3 (0x2809f000) 其他系统的执行文件 很多其他Unix系统,例如BSD/OS和Linux,也是运行在Intel平台上的系统,那么执
您可能关注的文档
最近下载
- NB∕T 10342-2019 水电站调节保证设计导则.pdf
- 2025年中国碳化硼陶瓷项目创业投资方案.docx
- conval(康阀)画册.pdf VIP
- 污水波纹管工程施工方案(3篇).docx VIP
- 微观经济学知到智慧树期末考试答案题库2024年秋北方工业大学.docx VIP
- 2025年衢州常山县统计局公开招聘编外统计员13人笔试备考试题含答案详解(能力提升).docx
- 2024届高考英语二轮复习50分阅读理解提分练(五).docx VIP
- DB4211T 12-2022 医疗废物暂存间卫生管理规范.docx VIP
- 中国氯气项目创业计划书.docx
- 中国红磷阻燃剂项目商业计划书.docx
文档评论(0)