關於對象文件在進行連接時的一些思考

實例程序如下:

//  a.c

//  編譯指令:cl /c a.c ----> a.obj

int a;

 

//  b.c

extern int a;

int main()

{

    int b = a;

}

文件 b.c 編譯後生成 b.obj 文件   ,extern 關鍵字表明整型變量(int) e 來自於外部的 .obj 文件或者.lib文件,所以爲了正確得到該變量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正確得到 .obj 文件。

以上爲 b.obj 的彙編代碼注意其中的符號 _e ,在對象文件 b.obj 文件進行連接時就是要根據符號 _e進行查找和定位,從而得到e的值。

 

b.obj文件的彙編代碼:

其中產生了符號 _e 所以在連接時a.obj才能正確找到e的值。正確連接後,變量e被分配到數據段,使用b.obj文件中的值進行正確的賦值,此時,變量e就有了確切的地址,符號_e自然就沒有用了,所以連接(link a.obj b.obj)後生成的a.exe中就沒有了符號_e.

 

變量(e)的修飾名稱(_e),是與編譯器設置相關的(和語言相關的),倘若變量e聲明在a.c文件中,在某個.cpp文件中如若使用到e,則應該使用extern "C" int e來進行說明,這樣其生產的obj文件對e的名稱修飾就是_e,而不是C++語言的修飾規則。

 

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