ELF介绍
一?點睛
ELF是一種用于二進制文件、可執行文件、目標代碼、共享庫和核心轉儲的標準文件格式。
ELF標準的目的是為軟件開發人員提供一組二進制接口定義,這些接口可延伸到多種操作系統中,從而減少重新編碼、編譯程序的需要。
ELF指的是一種文件格式,常用的擴展名為:o,so,elf,prx
二?ELF文件組成部分
ELF文件由4部分組成:
-
ELF頭(ELF header)
-
程序頭表(Program header table)
-
節(Section)
-
節頭表(Section header table)
實際上,一個文件中不一定包含全部內容,而且他們的位置也未必如同所示這樣安排,只有ELF頭的位置是固定的,其余各部分的位置、大小等信息由ELF頭中的各項值來決定。
三?ELF文件類型
有三種文件類型
1?可重定位的目標文件
由匯編器匯編生成的.o文件。
參考:https://www.cnblogs.com/pacoson/p/4893172.html
2?可執行文件
鏈接器拿一個或多個可定位的目標文件作為輸入,經鏈接處理后,生成一個可執行的目標文件。
3?可被共享的目標文件
就是所謂的動態庫文件,也即.so文件。
動態庫發揮作用的過程必須經過兩個步驟:
步驟一:鏈接器拿動態庫和其他可重定位的文件(.o文件)以及其他.so文件作為輸入,經過鏈接后,生成另外的可共享的目標文件(.so)或者可執行的目標文件。
步驟二:在運行時,動態鏈接器拿它和一個可執行的目標文件以及另外一些可共享的目標文件一起處理,在Linux系統中創建一個進程映像。
四?ELF對象文件組成
有兩種視圖來說明ELF的組成格式
| 鏈接視圖 | 執行視圖 |
| ELF頭部 | ELF頭部 |
| 程序頭部表(可選) | 程序頭部表 |
| 節區1 | 節區1 |
| ... | ... |
| 節區n | 節區n |
| ... | ... |
| ... | ... |
| 節區頭部表 | 節區頭部表(可選) |
表中展示了左右兩個很類似的部分來說明ELF的組成格式。為什么需要兩種格式呢?這是因為ELF格式需要使用在兩種場景:
場合一:組成不同的重定位文件,以參與可執行文件或者可被共享的對象文件的鏈接構建。
場合二:組成可執行文件或者可被共享對象文件,以在運行時內存中進程映像的構建。
所以,基本上,表中左邊部分表示的是可重定位文件的格式,而右邊是可執行文件以及可被共享的對象文件的格式。ELF文件頭被固定地放在不同類對象文件的最前面。因此,可以用file命令來看文件是屬于哪種ELF文件
五?實戰
1?生成各類文件
# 生成add.o和sub.o g++ -c add.cpp g++ -c sub.cpp ar cr libmymath.a sub.o add.o # 生成main g++ -o main main.cpp -L.lmymath # 生成libmymath.so g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp2?查看add.o、sub.o、main、libmymath.so屬于哪種ELF
[root@localhost 0401]# ll total 52 -rw-r--r--. 1 root root 62 May 11 11:35 add.cpp -rw-r--r--. 1 root root 66 May 11 11:34 add.h -rw-r--r--. 1 root root 1248 May 11 11:26 add.o -rw-r--r--. 1 root root 2714 May 11 11:42 libmymath.a -rwxr-xr-x. 1 root root 7928 May 11 11:50 libmymath.so -rwxr-xr-x. 1 root root 9312 May 11 11:48 main -rw-r--r--. 1 root root 230 May 11 11:40 main.cpp -rw-r--r--. 1 root root 61 May 1 08:52 sub.cpp -rw-r--r--. 1 root root 67 May 1 08:52 sub.h -rw-r--r--. 1 root root 1248 May 11 11:26 sub.o # 查看add.o、sub.o、main、libmymath.so的內容 [root@localhost 0401]# file add.o sub.o libmymath.so main add.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped sub.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped libmymath.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ce377dde3db662656e8c82c87bb205a883fac582, not stripped main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=7983836b44944a18e597635b8088d2926167e671, not strippedadd.o sub.o是可重定位文件。
libmymath.so是可被共享文件。
main是可執行文件。
總結
- 上一篇: “燕云十六将”之Lion李哲
- 下一篇: 详解ELF重定向原理