天天看點

對elf檔案連接配接的了解(二)-簡單的重定位類型

下面我打算分析一下簡單的重定位類型(不考慮fpic,循序漸進),考慮一下兩個簡單的檔案.a.c與b.c

a.c如下

int a ;
static int b;
int test()
{
    a = 1;
    b = 2;
    return 0;
}
           

b.c如下

int  test();
int c = (int) test;
int main()
{
    test();
    return 0;
}
           

編譯生成的a.o檔案中存在兩個重定位項,類型均為R_386_32;b.o中也存在兩個重定位項(test中對a與b的引用),類型分别是R_386_PC32(main中對test的引用),R_386_32(資料中c對test函數的引用).

最後連結生成的檔案沒有重定位項,這裡面出現了兩種最基本的重定位類型R_386_32(對變量或函數的引用,且不區分是全局的還是static的,同時不區分所處的是text還是data),R_386_PC32(對函數的調用處,且調用的是全局函數,因為如果是調用static函數,隻要采用偏移值即可,不用建立重定位項)

總結如下:在不考慮fpic代碼的情況下,隻會出現兩種基本的重定位類型,分别為R_386_32,R_386_PC32;其中R_386_32是對變量和函數的引用(不是調用!!!),注意這裡即使是對static符号的引用也要重定位.而R_386_PC32則是對函數的調用的重定位,對于static函數,因為調用位址與其偏移是固定的,是以不會生成重定位項.

繼續閱讀