2012-04-18 103 views
2

我有你三個問題,一切都是爲了使dyld相關:)dyld的API - 奇怪的輸出

我一直在使用this dyld man page作爲基礎。我編譯了下面的代碼,併成功在我的越獄設備上執行了二進制文件。

#include <stdio.h> 
#include <mach-o/dyld.h> 

int main(int argc, const char* argv[]) { 
    uint32_t image_count, i; 
    image_count = _dyld_image_count(); 
    for (i = 0; i < image_count; i++) { 
     printf("%s\n", _dyld_get_image_name(i)); 
    } 
    return 0; 
} 

我認爲這些函數讓我找到所有在我的程序的地址空間中加載的共享庫。在我的mac上,輸出非常簡單:它顯示了當前加載到內存中的所有庫的路徑。在我的iPhone上,輸出幾乎相同 - 我也獲得文件路徑 - 但是在指定位置沒有文件。 (在我的另一方面的MAC,我可以找到文件!)

這是從輸出採樣線: /usr/lib/system/libdyld.dylib

根據LS,iFile的和我用過的所有其他工具,這個目錄(/ usr/lib/system /)是空的。爲什麼?這些文件在哪裏?

我想知道的另一件事是:是否有可能在內存中找到一個庫?從什麼偏移量到庫的映射到內存的偏移量?我想我知道如何找到開始,但我不知道如何找到圖書館的結尾。要找到開頭,我會使用_dyld_get_image_header返回的地址 - 是正確的嗎?

最後一個問題:我想加載一個動態庫系統範圍,所以我認爲我可以使用DYLD_INSERT_LIBRARIES來做到這一點。然而,我插入我的lib崩潰後,嘗試執行每個二進制文件,併產生一個總線錯誤!我是否忘記了一些事情,或者它是導致崩潰的動態庫?

+0

您應該補充說明您正在使用越獄設備。如果您不是在越獄設備上工作,那麼這是應用程序被沙箱化並且被限制在其小沙箱之外不能訪問的意外行爲的原因。 – Till 2012-04-18 16:43:54

+0

是不是存儲在標題中的庫大小?否則:指定的文件不存在,因爲實際上沒有!它們存儲在內核緩存中,但是它們的路徑名被硬編碼到了dylib文件中,這就是爲什麼dyld會將它們報告給它們(不是真的)。 – 2012-04-18 16:47:31

回答

2

庫分別位於: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6(_armv7) 這是一個很大的文件都是單個庫已經加入到一個大的一個。

用於鉤住越獄設備

上是可確定在存儲器中的dylib的位置見http://iphonedevwiki.net/index.php/MobileSubstrate,甚至在非越獄設備。 解析庫的LC_SEGMENT(_ TEXT) - 段標題(_text),然後您可以獲取庫的基址和TEXT __text段的大小。然後查詢vmslide。將其添加到TEXT __text的基地址。

mach-o文件格式的詳細描述可以在這裏找到: https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html。要特別注意「segment_command」結構。