第七章-鏈接(2)

可執(zhí)行目標文件

image.png

可執(zhí)行目標文件還包括了程序的入口點,即第一條指令的地址赁豆。
各個段會被映射到連續(xù)的內(nèi)存區(qū)域椎镣,段頭部表描述了這種映射關(guān)系。

加載可執(zhí)行目標文件

將程序復(fù)制到內(nèi)存并運行的過程叫加載庶艾。


image.png

堆是從低地址向高地址分配空間袁余,而棧是從高地址向低地址分配空間。
從地址2^48開始落竹,是為內(nèi)核中的代碼和數(shù)據(jù)保留的(操作系統(tǒng)駐留在內(nèi)存的部分)泌霍。

動態(tài)鏈接共享庫

靜態(tài)庫是在鏈接的時候合并到可執(zhí)行目標文件里面,這樣有一些缺點:

  • 每次更新了目標文件都需要重新鏈接
  • 多個程序都需要使用標準庫函數(shù),都需要進行鏈接并載入內(nèi)存朱转,是對內(nèi)存空間的浪費
    共享庫就是為了解決這部分問題而產(chǎn)生的蟹地。共享庫可以在運行或加載時,加載到任意的內(nèi)存地址藤为,并和一個內(nèi)存中的程序鏈接起來怪与。這個過程稱為動態(tài)鏈接,由動態(tài)鏈接器來執(zhí)行缅疟。
    共享庫也叫共享目標分别,Linux中通常用.so后綴表示,Windows被稱為DLL存淫。
    編譯共享目標文件:
    gcc -shared -fpic -o libvector.so addvec.c multvec.c
    這樣生成的libvector.so就是共享目標文件耘斩,再將文件鏈接到其他程序中:
    gcc -o prog main.c ./libvector.so
    這樣prog程序在運行的時候就會和libvector.so鏈接。在創(chuàng)建可執(zhí)行文件時桅咆,靜態(tài)執(zhí)行一些鏈接括授,在程序加載時,動態(tài)完成鏈接過程岩饼。鏈接器沒有復(fù)制so文件的代碼和數(shù)據(jù)節(jié)荚虚,只復(fù)制了一些重定位和符號表信息,使得在運行時可以對libvector.so中的代碼和數(shù)據(jù)的引用籍茧。

從應(yīng)用程序中加載和鏈接共享庫

上面那種方式要在編譯時指定共享庫版述,而另外一種方式是在應(yīng)用程序中,通過接口直接加載和鏈接共享庫寞冯,在編譯時無需指定渴析。
步驟:

//加載共享庫
handle = dlopen("filename",flag);
//鏈接共享庫
func = dlsym(handle,"func_name");
func();
//關(guān)閉共享庫
dlclose(handle);
//產(chǎn)生的錯誤
dlerror();
image.png

庫打樁機制

類似于設(shè)計模式中的代理模式,允許截獲對共享庫函數(shù)的調(diào)用简十,取而代之執(zhí)行自己的代碼檬某。打樁可以發(fā)生在編譯時、鏈接時或當程序被加載和執(zhí)行的運行時螟蝙。即定義一個完全一樣的函數(shù)接口恢恼,在實現(xiàn)的時候通過調(diào)用真正的函數(shù)完成功能,同時可以記錄調(diào)用的參數(shù)與結(jié)果等胰默。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场斑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牵署,更是在濱河造成了極大的恐慌漏隐,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奴迅,死亡現(xiàn)場離奇詭異青责,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門脖隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扁耐,“玉大人,你說我怎么就攤上這事产阱⊥癯疲” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵构蹬,是天一觀的道長王暗。 經(jīng)常有香客問我,道長庄敛,這世上最難降的妖魔是什么俗壹? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮藻烤,結(jié)果婚禮上策肝,老公的妹妹穿的比我還像新娘。我一直安慰自己隐绵,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布拙毫。 她就那樣靜靜地躺著依许,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缀蹄。 梳的紋絲不亂的頭發(fā)上峭跳,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音缺前,去河邊找鬼蛀醉。 笑死,一個胖子當著我的面吹牛衅码,可吹牛的內(nèi)容都是我干的拯刁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼逝段,長吁一口氣:“原來是場噩夢啊……” “哼垛玻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奶躯,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤帚桩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘹黔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體账嚎,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了郭蕉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼邀。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恳不,靈堂內(nèi)的尸體忽然破棺而出檩小,到底是詐尸還是另有隱情,我是刑警寧澤烟勋,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布规求,位于F島的核電站,受9級特大地震影響卵惦,放射性物質(zhì)發(fā)生泄漏阻肿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一沮尿、第九天 我趴在偏房一處隱蔽的房頂上張望丛塌。 院中可真熱鬧,春花似錦畜疾、人聲如沸赴邻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姥敛。三九已至,卻和暖如春瞎暑,著一層夾襖步出監(jiān)牢的瞬間彤敛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工了赌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墨榄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓勿她,卻偏偏與公主長得像袄秩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫂拴,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容