2013-07-04 54 views
4

我已經使用cMake爲ARM7構建了一些靜態庫。 通常,當您使用下一個命令.a文件時,它顯示體系結構:「otool」和「file」無法顯示「.a」文件的體系結構

f.e.

mac:libs User$ file ./libcurl.a 
./libcurl.a: Mach-O universal binary with 3 architectures 
./libcurl.a (for architecture armv6): current ar archive random library 
./libcurl.a (for architecture armv7): current ar archive random library 
./libcurl.a (for architecture i386): current ar archive random library 

或f.e.

mac:libs User$ otool -vf ./libboost_regex.a 
Fat headers 
fat_magic FAT_MAGIC 
nfat_arch 3 
architecture armv6 
    cputype CPU_TYPE_ARM 
    cpusubtype CPU_SUBTYPE_ARM_V6 
    capabilities 0x0 
    offset 68 
    size 9550024 
    align 2^2 (4) 
architecture armv7 
    cputype CPU_TYPE_ARM 
    cpusubtype CPU_SUBTYPE_ARM_V7 
    capabilities 0x0 
    offset 9550092 
    size 9390544 
    align 2^2 (4) 
architecture i386 
    cputype CPU_TYPE_I386 
    cpusubtype CPU_SUBTYPE_I386_ALL 
    capabilities 0x0 
    offset 18940636 
    size 9595040 
    align 2^2 (4) 

但現在,當我建立我的圖書館,「otool」和「文件」不能顯示它的架構。

mac:libs User$ otool -vf ./mylib_meta.a 
Archive : ./mylib_meta.a 

這是什麼意思?我可以在建立圖書館時做什麼錯誤?

更新: 伊戈爾,謝謝!

我萃取命令對象文件:

AR -t mylib.a上

AR -xv mylib.a上myobj.o

-t示出二進制代碼的列表

-xv提取具體的二進制文件

回答

4

Apple使用兩種形式的AR存檔。第一個是非常類似於傳統的Unix檔案(「a.out的檔案」) - 基本上只是一堆.o文件與前一個符號索引粘在了一起:

"<!arch>\n" 

header 0 
SYMDEF entry 

header 1 
object 1 

header 2 
object 2 

... 

要確定架構,這這個檔案的目的是,你需要提取至少一個目標文件,並使用其上的fileotool。檔案頭本身沒有這個信息。 (事實上​​,目標文件不一定全部用於同一個拱形,理論上你可能有任何形式的文件,而不僅僅是對象,但這不太可能)。您可以使用ar utility從歸檔中提取單個文件。

另一種是蘋果自己的發明。他們採用了用於多拱Mach-O可執行文件的「胖二進制/通用二進制」概念,並將其用於歸檔。因此,一個「胖」歸檔看起來是這樣的:

Fat Mach-O header 
    Architecture 1 header --+ 
    Architecture 2 header --|--+ 
    Architecture 3 header --|--|--+ 
    [padding]    | | | 
    Archive 1 <-------------+ | | 
    Archive 2 <----------------+ | 
    Archive 3 <-------------------+ 

在這種情況下fileotool可以看看胖頭和列表,它的架構支持。

要創建或編輯fat文件(檔案和可執行文件),可以使用lipo tool