OBJ檔案解析之靜態連結的效果
至於發生靜態連結的時機是在編譯器編譯生成OBJ檔案之後,在連結器連結 各個obj檔案之時,在執行生成程式之前,詳細的過程你可以去參考《程式設計師的自我修養》,在這裡我只是引證一下靜態連結的發生時存在的:
還積極的上篇哪個簡單的obj1.cpp檔案嗎?裡面只有一個簡單的printf("This is 1st .c file : obj1.c"), 以及用dumpbin /all obj1.obj生成的 obj1.txt檔案 中有一個節,
這是這個obj檔案的程式碼節,裡面本來應該呼叫了printf ,可為什麼是0x 00000000 表示呢? 因為 printf 這個 庫函式 不是我們自己寫的,是需要 在連結時 填寫完成的,
那麼,我就得給聯結器提供相關 我們在這裡呼叫 printf函式的提示了, 這就是 重定位表項的作用了,通過 相對於節原始資料的偏移 ,型別(確定大小), 符號索引(唯一確定一個符號),連結器就明白了需要去在別的obj檔案中查詢 該 符號的 地址了,然後在此處填寫
最終生成的EXE檔案,會將相關obj檔案 的區段合併,比如說程式碼段,所以需要查詢PE檔案裡特定的2進位制程式碼段,我這裡用的Hex Editor,查詢16進位制 55 8B EC 81 EC ,
顯示找到了11項,進過肉眼刪除,確定一份
轉到重定位相關處 偏移 0x21 處 對字串的訪問 ,68 00 00 00 00 變成了 68 58 58 41 00 了,發生了變化, 可以看到 地址 0x00 41 58 58 是在 pe檔案資料區
偏移0x27出的15 00 00 00 00 變成了 15 14 91 41 00
VS2013除錯執行截圖(會發生執行時重定位)
反彙編視窗
記憶體視窗
68 58 58 39 01 ff 15 14 91 39 01 83 c4 04 3b f4
原始obj檔案對應處資料
68 00 00 00 00 FF 15 00 00 00 00 83 C4 04 3B F4
PEVIEW 中資料
調動PEVIEW VA視角,找到 0x415858處
,找到了字串
另一個 0X419114 ,
注意了 由於 printf 是被動態 連結進 PE檔案中去東,因此 在檔案中的時候 ,0x419114 存放的並不是 printf的地址 ,而是它名稱字串“printf”所在RVA地址,真正的地址要等到
載入器,去修復,至於RVA是什麼 要等到 你學PE檔案結構時 ,就知道了,在這裡 你只需要 瞭解 這個地址指向了名稱 字串 ,通過這個名稱 ,在你點選了exe程式後,
載入器會自動幫你找到 該名稱對應 函式 的地址的