中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

h5自適應(yīng)網(wǎng)站模板下載優(yōu)化推廣排名網(wǎng)站教程

h5自適應(yīng)網(wǎng)站模板下載,優(yōu)化推廣排名網(wǎng)站教程,網(wǎng)站虛擬主持人代碼,深圳網(wǎng)站建設(shè)公司服務(wù)商目錄 靜態(tài)庫 動態(tài)庫 目標(biāo)文件 ELF文件 ELF形成可執(zhí)行 ELF可執(zhí)行加載 ELF加載 全局偏移量表GOT(global offset table) 庫是寫好的,成熟的,可以復(fù)用的代碼 現(xiàn)實中每個程序都要依賴很多的基礎(chǔ)的底層庫,不可能都是從零開始的 庫有兩種…

目錄

靜態(tài)庫

動態(tài)庫

目標(biāo)文件

ELF文件?

ELF形成可執(zhí)行

ELF可執(zhí)行加載

?ELF加載

全局偏移量表GOT(global offset table)?


庫是寫好的,成熟的,可以復(fù)用的代碼

現(xiàn)實中每個程序都要依賴很多的基礎(chǔ)的底層庫,不可能都是從零開始的

庫有兩種:

  • 靜態(tài)庫 .a[Linux]、.lib[windows]
  • 動態(tài)庫 .so[Linux]、.dll[windows]

靜態(tài)庫

程序在編譯鏈接的時候把庫的代碼鏈接到可執(zhí)行文件中,程序運行的時候?qū)⒉辉傩枰o態(tài)庫

一個可執(zhí)行程序可能用到多個庫,這些庫可能有的是靜態(tài)庫,有的是動態(tài)庫,而我們編譯默認(rèn)鏈接為動態(tài)庫,只有在該庫下找不到動態(tài).so的時候才會采用同名靜態(tài)庫。

若是想使用靜態(tài)庫我們可以使用gcc的 -static 強轉(zhuǎn)設(shè)置鏈接靜態(tài)庫

?靜態(tài)庫的生成:

ar -rc libmylib.a mylib.o

?若我們有一個自己寫的庫叫mylib,那么我們該如何使用它呢?


若頭文件和庫文件都被我們安裝到系統(tǒng)的路徑下

/usr/lib、/usr/lib64、/usr/local/lib等等

gcc main.c -lmystdio

?頭文件和庫文件和我們自己的源文件在同一個路徑下

gcc main.c -L. -lmylib

頭文件和庫文件都有自己獨立的路徑

gcc main.c -I頭?件路徑 -L庫?件路徑 -lmylib
  • ?-L:指定庫路徑
  • -I:指定頭文件搜索路徑
  • -l:指定庫名

動態(tài)庫

程序在運行的時候才去鏈接動態(tài)庫,多個程序可以共享使用庫的代碼

一個與動態(tài)庫鏈接的可執(zhí)行程序僅僅包含它用到的函數(shù)入口地址的一個表,而不是外部函數(shù)所在目標(biāo)文件的整個機器碼

在可執(zhí)行文件開始運行以前,外部函數(shù)的機器碼由操作系統(tǒng)從磁盤上的該動態(tài)庫中復(fù)制到內(nèi)存中,這個過程稱為動態(tài)鏈接

動態(tài)庫可以在多個程序間共享,所以動態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤的空間。操作系統(tǒng)采用虛擬內(nèi)存機制允許物理內(nèi)存中的一份動態(tài)庫被要用到該庫的所有進程共用,節(jié)省了內(nèi)存和磁盤空間

動態(tài)庫的生成:

gcc -fPIC -c main.c -o mylib.o
gcc -o libmylib.so mylib.o -shared

動態(tài)庫需要使用位置無關(guān)碼PIC,因此需要加上 -fPIC選項

動態(tài)庫的命名約定通常以lib開頭,后綴為.so

  • shared:表示生成共享庫格式
  • fPIC:產(chǎn)生位置無關(guān)碼
  • 庫名規(guī)則:libxxx.so

動態(tài)庫使用:

若頭文件和庫文件都被我們安裝到系統(tǒng)的路徑下

gcc main.c -lmylib

頭文件和庫文件和我們自己的源文件在同一個路徑下

gcc main.c -L. -lmylib

頭文件和庫文件都有自己獨立的路徑

gcc main.c -I頭?件路徑 -L庫?件路徑 -lmylib

我們可以使用ldd命令來查看庫或者可執(zhí)行程序的依賴

ldd libmylib.so

目標(biāo)文件

在編譯之后會產(chǎn)生擴展名為.o的文件,它們被稱作目標(biāo)文件?

若是我們有多個源文件,需要修改其中一個,那么我們只需要編譯這一個為目標(biāo)文件再一起鏈接,這樣就不需要浪費時間重新編譯整個工程

目標(biāo)文件是一個二進制文件,文件的格式是ELF,是對二進制代碼的一種封裝?

ELF文件?

以下四種都是ELF文件

  • 可重定位文件:即xxx.o文件。包含適合于與其他?標(biāo)?件鏈接來創(chuàng)建可執(zhí)??件或者共享?標(biāo)?件的代碼和數(shù)據(jù)
  • 可執(zhí)行文件:即可執(zhí)行程序
  • 共享目標(biāo)文件:即 xxx.so?件
  • 內(nèi)核轉(zhuǎn)儲:存放當(dāng)前進程的執(zhí)?上下?,?于dump信號觸發(fā)

一個ELF文件由四個部分組成

  • ELF頭(ELF header):描述?件的主要特性。其位于?件的開始位置,它的主要?的是定位?件的其他部分
  • 程序頭表(Program header table):列舉了所有有效的段(segments)和他們的屬性。表?
    記著每個段的開始的位置和位移(offset)、?度,畢竟這些段,都是緊密的放在?進制?件中,需要段表的描述信息,才能把他們每個段分割開
  • 節(jié)頭表(Section header table):包含對節(jié)(sections)的描述
  • 節(jié)(Section):ELF?件中的基本組成單位,包含了特定類型的數(shù)據(jù)。ELF?件的各種信息和數(shù)據(jù)都存儲在不同的節(jié)中,如代碼節(jié)存儲了可執(zhí)?代碼,數(shù)據(jù)節(jié)存儲了全局變量和靜態(tài)數(shù)據(jù)等

常見的節(jié)有:

  • 代碼節(jié)(.text):?于保存機器指令,是程序的主要執(zhí)?部分
  • 數(shù)據(jù)節(jié)(.data):保存已初始化的全局變量和局部靜態(tài)變量

ELF形成可執(zhí)行

1. 首先將多份C/C++源代碼翻譯稱為目標(biāo).o文件

2. 將多份.o文件Section進行合并

ELF可執(zhí)行加載

?個ELF會有多種不同的Section,在加載到內(nèi)存的時候,也會進?Section合并,形成segment

合并原則:相同屬性,?如:可讀,可寫,可執(zhí)?,需要加載時申請空間等。這樣,即便是不同的Section,在加載到內(nèi)存中,可能會以segment的形式,加載到?起

很顯然,這個合并?作也已經(jīng)在形成ELF的時候,合并?式已經(jīng)確定了,具體合并原則被記錄在了
ELF的 程序頭表 (Program header table) 中

?

Section合并的主要原因是為了減少??碎?,提?內(nèi)存使?效率?

?ELF加載

?個ELF程序,在沒有被加載到內(nèi)存的時候,本來就有地址,當(dāng)代計算機?作的時候,都采?"平坦
模式"進??作。

?

用來初始化的數(shù)據(jù)也是從ELF的各個segment來,每個segment有自己的起始地址和長度,用來初始化內(nèi)核結(jié)構(gòu)中[start, end]等范圍的數(shù)據(jù)

?

程序調(diào)用庫方法:只需要知道庫的起始虛擬地址+方法偏移量即可定位庫中的?法

我們的程序運?之前,先把所有庫加載并映射,所有庫的起始虛擬地址都應(yīng)該提前知道?
對我們加載到內(nèi)存中的程序的庫函數(shù)調(diào)?進?地址修改,在內(nèi)存中?次完成地址設(shè)置(這個叫做加載地址重定位)
但是代碼區(qū)是可讀的,怎么能修改呢?

全局偏移量表GOT(global offset table)?

動態(tài)鏈接采?的做法是在 .data (可執(zhí)?程序或者庫??)中專?預(yù)留??區(qū)域?來存放函數(shù)的跳轉(zhuǎn)地址,它也被叫做全局偏移表GOT,表中每?項都是本運?模塊要引?的?個全局變量或函數(shù)的地址

因為.data區(qū)域是可讀寫的,所以可以?持動態(tài)進?修改?

有了GOT表,代碼便可以被所有進程共享。但在不同進程的地址空間中,各動態(tài)庫的絕對地址、相對位置都不同。每個動態(tài)庫都有獨?的GOT表,所以進程間不能共享GOT表

?

?


完?

http://www.risenshineclean.com/news/6045.html

相關(guān)文章:

  • asp.net開發(fā)移動網(wǎng)站模板下載網(wǎng)絡(luò)營銷顧問
  • 填空秒懂網(wǎng)站行業(yè)關(guān)鍵詞一覽表
  • 做網(wǎng)站的公司哪些靠譜中國新冠疫情最新消息
  • 蘇州網(wǎng)站開發(fā)公司興田德潤放心經(jīng)典軟文案例200字
  • 影視網(wǎng)站模板怎么做企業(yè)網(wǎng)站推廣有哪些方式
  • 墊江做網(wǎng)站bing搜索引擎下載
  • 蘭州做網(wǎng)站哪家好網(wǎng)站制作公司有哪些
  • 凡科網(wǎng)建網(wǎng)站付費鏈接怎么做線上宣傳方式
  • 域名解析到網(wǎng)站互聯(lián)網(wǎng)推廣是什么工作內(nèi)容
  • 安能建設(shè)總公司網(wǎng)站打不開it培訓(xùn)機構(gòu)口碑排名
  • 軟件開發(fā)培訓(xùn)學(xué)校的三大特色寧波seo軟件免費課程
  • 哈爾濱住房城鄉(xiāng)建設(shè)局網(wǎng)站首頁做外貿(mào)網(wǎng)站哪家公司好
  • wordpress不能mp4百度首頁排名優(yōu)化平臺
  • 怎樣在自己的網(wǎng)站上家程序電商網(wǎng)站建設(shè)開發(fā)
  • 東莞做網(wǎng)站公司有哪些抖音優(yōu)化
  • 銅陵高端網(wǎng)站建設(shè)百度直播平臺
  • wordpress防注冊插件優(yōu)化營商環(huán)境的意義
  • 網(wǎng)易那個自己做游戲的網(wǎng)站是什么濮陽市網(wǎng)站建設(shè)
  • .net做的網(wǎng)站怎么做一個免費的網(wǎng)站
  • 做空運貨代常用網(wǎng)站seo優(yōu)化技術(shù)培訓(xùn)
  • wordpress 的論壇模板南京seo網(wǎng)站優(yōu)化推廣
  • 部門子網(wǎng)站建設(shè)方案現(xiàn)在百度推廣有用嗎
  • 個人網(wǎng)站 創(chuàng)意網(wǎng)站代運營推廣
  • 前端做任務(wù)的網(wǎng)站西安企業(yè)網(wǎng)站seo
  • 統(tǒng)一管理網(wǎng)站系統(tǒng)百度免費推廣網(wǎng)站
  • html5作業(yè) 建設(shè)網(wǎng)站蜜雪冰城網(wǎng)絡(luò)營銷案例分析
  • 做網(wǎng)站需要了解哪些知識如何優(yōu)化標(biāo)題關(guān)鍵詞
  • 常州網(wǎng)架公司安康seo
  • 網(wǎng)站建設(shè)qq群磁力島
  • 杭州拱墅區(qū)做網(wǎng)站公眾號運營