博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
目标文件
阅读量:5946 次
发布时间:2019-06-19

本文共 1358 字,大约阅读时间需要 4 分钟。

目标文件种类

有三种

①可重定位目标文件

被用于静态链接的文件,都是可重定位目标文件。根据这个概念,静态库文件(.a/.lib)和.o文件都是“可重定位目标文件”,因为它们都是静态链接的。

疑问:为什么称为“可重定位”?

因为静态连接时,逻辑地址需要被重定位为运行地址,所以就被称为可重定位目标文件。

②可执行目标文件

可以被执行的文件就是“可执行目标文件”,其实就是我们常说的“可执行文件/可执行程序”。

③共享目标文件

被动态链接的文件其实就是共享目标文件,其实就是动态库,因为动态库是动态链接的。因为动态库被共享使用的特性,因此也被称为共享库,所以动态库文件也被称为了共享目标文件。

 

目标文件格式

各不同运行环境之间(OS),目标文件的格式是不同的,所以针对不同环境的目标文件,格式是不一样的。这就好比不同公司的规章制度肯定有区别。

疑问:目标文件格式有什么用?

格式规定了目标文件中指令和数据的组成结构,每个环境(OS)只认自己的格式。虽然不同的格式之间有区别,但是大体上都是类似的。

裸机目标文件

如果你的程序最终是运行在裸机上的话,裸机目标文件的格式为.bin格式。arm裸机,程序就是裸机运行的,所以那时编译出的目标文件都是.bin格式的。

unix系统的目标文件格式

早期unix

使用的a.out格式,因为这个历史遗留,现在再unix下编译时,如果不指定可执行文件的名字的话,默认起名为a.out,这个名字就来自于a.out这个格式名。Linux的父亲是Unix,因此对于Linux来说,编译时如果不指定可执行文件名的话,默认也起名为a.out,要注意,尽管起名为a.out,但是Linux系统目标文件的格式并不是a.out格式,仅仅只是沿用了a.out这个名字而已。

system V unix

unix升级到第5版本时,a.out格式变为了COFF格式(Common Object File Format:一般目标文件格式)。

现代Unix

已经改用ELF格式(Excutable and Linkable Format:可执行可链接格式)。

windows

windows是PE格式(Portable Excutable:可移植、可执行格式),由Unix COFF格式格式演变而来。

Linux

与现代的Unix一样的,使用的也是ELF格式,虽然在Linux下,编译时默认的可执行文件的名字是a.out,但是其实目标文件的格式是ELF(可执行可链接格式)。

如何理解ELF(可执行可链接格式)的含义?

可重定位目标文件、共享目标文件:可以被链接

可执行目标文件:可以被执行

 

可重定位目标文件

如何得到.o文件

.o文件即可重定位目标文件

o中放的都是机器指令。在没有链接之前,.o中的机器指令是无法执行的。

如何得到.a文件

.a文件即静态库文件

①先从各.c得到各个.o文件

②将各.o文件打包成静态库

对应ELF格式的文件结构

参考:

可执行目标文件

 如何得到可执行目标文件

链接程序collect2/ld,将所有的可重定位目标文件静态链接在一起,就得到了可执行目标文件。

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/9413279.html

你可能感兴趣的文章
pthread_mutex_t
查看>>
LR11.0 下载及破解
查看>>
Java基础-绘图技术
查看>>
又转出61.8万个ETH,EOS不疯狂不成魔
查看>>
程序员面试IT公司的33个小贴士
查看>>
多款C系列手机亮相三星中国论坛,更加注重中国用户体验
查看>>
云南中医学院更名为云南中医药大学
查看>>
人社部:突出就业优先政策主线 全力确保就业局势稳定
查看>>
关键时刻还是要看阿里,达摩院发布自主研发AI芯片
查看>>
「百年育才」计划启动港股IPO,新高考改革下的“志愿填报辅导”市场迎来窗口期?...
查看>>
浅谈高性能数据库集群——读写分离
查看>>
HenCoder Android 开发进阶:自定义 View 1-4 Canvas 对绘制的辅助
查看>>
angular ui-router:简单的单页面嵌套路由的实现过程
查看>>
Poi导出产生OOM解决方案
查看>>
YYImage源码剖析与学习
查看>>
闭包和一部电影的关系
查看>>
小程序【二】
查看>>
使用Intellij创建springboot项目Spring Initializr Error 403
查看>>
0617 - 只做核心业务
查看>>
使用MVVM尝试开发Github客户端及对编程的一些思考
查看>>