日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ELF介绍

發布時間:2023/12/14 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.cpp

2?查看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 stripped

add.o sub.o是可重定位文件。

libmymath.so是可被共享文件。

main是可執行文件。

總結

以上是生活随笔為你收集整理的ELF介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。