代碼共享與Linux動態鏈接:探究PLT、GOT與ld-linux.so.2

在之前的一篇文章【1】中,我們曾經介紹過在Linux中編寫並使用Shared Library的具體方法(注意本文中大量使用了Shared Library,它的編譯和使用方法請參考【1】,本文將不再重複)。Shared Library是現代操作系統中不可或缺的一部分,但其背後的實現機制卻並不容易理解。本文將就此話題展開討論,並試圖對程序的動態鏈接機制一探究竟。

 

首先來看下面這段示例代碼,我們在命令行中用GCC來編譯它,然後再用readelf來查看文件信息

//test1.c
extern int foo;

int function(void) {
    return foo;
}

符號foo的值在你編譯生成a.o文件時是未知的,因此,編譯器預留了一個R_X86_64_PC32類型的relocation。它的意思是在最終的二進制文件中,在偏移量0x6的位置處加上符號foo的地址。

如果你用objdum

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章