iOS/MacOS lazy bind

iOS由MacOS系統修改而來,所以很多機制是相同的,與Android-Linux相比相似性更高。iOS符號分為自動non-lazy和lazy綁定符號,non-lazy符號位于Mach-O文件__DATA Segment 的__nl_symbol_ptr section,lazy符號位于__DATA Segment 的__la_symbol_ptr section。對于non-lazy的符號綁定時機為動態庫加載(load),lazy符號的綁定時機則與Linux相同即函數第一次被調用。

測試代碼

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    printf("Hello World Again!\n");
    return 0;
}

lldb 調試

反匯編main函數

+34為調用第一個printf函數,+51第二次調用printf函數。
二進制文件DATA段有兩個section

DATA Segment

不用展開也應該能猜到是哪兩個sction,section[0]為__nl_symbol_ptr section[1]為__la_symbol_ptr 。回到匯編代碼,printf函數的地址無論第一次還是第二次都是0x100000f66,這個地址來自哪呢?

add.PNG

由上圖可知,0x100000f66值為__TEXT Segment中的__stub section。
該section的作用解釋如下

  • section (__TEXT,__stubs) - section contains stubs with prefix imp___stubs__. That stubs are used in the code of __text section to compile procedures with external dependencies, such as system NSLog. dyld (dynamic linker) will replace such stubs on runtime with actual place in dynamic library.
    大意就是該section保存的是編譯過程中的外部依賴,在運行時動態鏈接器dyld將其替換為實際位置 PS:靈魂翻譯

call下斷,si進去



程序jmpq 0x0000000100000f7c,在__la_symbol_ptr section address中符號的地址為0x0000000100001010

ladd.PNG
值相等

繼續調試

Screen Shot 2017-05-09 at 1.22.04 PM.png

0x0000000100000f7c僅將0x0壓棧后就jmp回0x100000f6c,printf函數的地址查詢最終是通過dyld_stub_binder函數實現。dyld_stub_binder中符號查找原理可以參考fishhook

看了以上匯編是否覺得與Linux PLT頗有幾分相似?
0x0同樣為索引

調用dyld_stub_binder前堆棧信息

第二次調用printf

Screen Shot 2017-05-09 at 1.37.54 PM.png

綁定結束,從此可以直接調用相應函數

返匯編

參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 關注倉庫,及時獲得更新:iOS-Source-Code-AnalyzeFollow: Draveness · Gi...
    Draveness閱讀 6,070評論 5 33
  • 13. Hook原理介紹 13.1 Objective-C消息傳遞(Messaging) 對于C/C++這類靜態語...
    Flonger閱讀 1,453評論 0 3
  • 13.1 Objective-C消息傳遞(Messaging) 對于C/C++這類靜態語言,調用一個方法其實就是跳...
    泰克2008閱讀 2,109評論 1 6
  • 上一篇博客介紹了mach_header相關內容,Mach-O文件介紹之mach_header。這篇博客主要介紹Ma...
    Tomychen閱讀 2,428評論 0 7
  • 她珍惜所有她的書,就如同珍惜所有真摯的情感。她認真對待所有書里傳達的信息,就如同她也認真對待每一件事的思考。...
    aqua3751閱讀 236評論 0 0