<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Mac系統(tǒng)下lipo, ar, nm等工具的使用簡(jiǎn)介

      引言

      開(kāi)發(fā)第三方庫(kù)時(shí), 如果沒(méi)有進(jìn)行特殊處理, 很容易把其他第三方庫(kù)的符號(hào)暴露出來(lái), 導(dǎo)致鏈接時(shí)產(chǎn)生符號(hào)重復(fù). 如下圖所示

      如果用戶鏈接了其他版本的libjpeg, 會(huì)因?yàn)槿肟诘刂凡徽_讓程序直接崩潰

      本文就從這個(gè)問(wèn)題入手, 簡(jiǎn)要介紹Mac OS X系統(tǒng)下幾個(gè)常用二進(jìn)制文件修改工具的使用

      概述

      我們都知道, 代碼到可執(zhí)行文件需要經(jīng)過(guò)編譯(compile)和鏈接(link)兩個(gè)主要步驟. 編譯是把程序語(yǔ)言轉(zhuǎn)換為機(jī)器指令, 這個(gè)不在本文的討論范圍.

      鏈接是把分塊編譯的對(duì)象文件(obj)合并成一個(gè)完整的程序, 主要解決函數(shù)入口重定向的問(wèn)題. 其功能主要就是把所有的對(duì)象文件打個(gè)包, 生成一個(gè)導(dǎo)出符號(hào)表, 讓其他程序可以知道本文件的結(jié)構(gòu).

      而對(duì)于蘋(píng)果系統(tǒng)來(lái)說(shuō), 豐富的設(shè)備包含了多種架構(gòu)平臺(tái), armv7, arm64, i386, x86_64是最常見(jiàn)的指令集, 一個(gè)程序庫(kù)為了兼容各個(gè)平臺(tái), 常常要把不同平臺(tái)編譯的程序合并起來(lái), 生成所謂的胖文件(Fat File), 這樣子開(kāi)發(fā)者就不需要專門(mén)準(zhǔn)備一套真機(jī)版本庫(kù)和模擬器版本庫(kù)了(在早期, 很多第三方庫(kù)確實(shí)是提供了不同版本的二進(jìn)制文件來(lái)減少庫(kù)文件大小).

      因此對(duì)于一個(gè)可執(zhí)行文件, 其實(shí)包含了3層結(jié)構(gòu): Universal Fat File -> Single Architecture Binary File -> Mach-O Object.

      本文將要介紹的lipo, ar, nm, strip, ld等工具的功能就是對(duì)這三層結(jié)構(gòu)進(jìn)行轉(zhuǎn)換和修改.

      本文以高德地圖iOS SDK MAMapKit.framework 4.0.3為例, 演示如何從這個(gè)庫(kù)文件里剔除暴露的png符號(hào).

      工具介紹

      lipo

      lipo是管理Fat File的工具, 可以查看平臺(tái)列表, 提取特定平臺(tái), 重新打包.

      首先運(yùn)行 lipo -info MAMapKit

      可以看出這個(gè)文件包含了4個(gè)平臺(tái)的代碼. 接下來(lái)的所有操作都是要針對(duì)單一平臺(tái)進(jìn)行的, 因此先提取出來(lái)armv7平臺(tái),

      lipo -thin armv7 MAMapKit -output MAMapKit.armv7

      可以看出單平臺(tái)的程序文件要小得多.

      接下來(lái)我們來(lái)查看一下這個(gè)文件的符號(hào)表

      nm

      nm用來(lái)顯示一個(gè)程序包的符號(hào)表, 默認(rèn)會(huì)顯示入口地址, 符號(hào)類型, 符號(hào)名.

      nm -j MAMapKit.armv7  | grep png > symbols 可以獲得所有的libpng導(dǎo)出符號(hào), 存入到symbols文件, 為接下來(lái)的工作做準(zhǔn)備. -j 選項(xiàng)控制只輸出符號(hào)名.

      strip

      strip用來(lái)刪除程序里的符號(hào)表. -R 用來(lái)指定一個(gè)要?jiǎng)h除的符號(hào)列表, 使用上述生成的symbols文件. 添加 -S 選項(xiàng)來(lái)保留其他符號(hào).

      strip -S -R symbols MAMapKit.armv7 -o MAMapKit.armv7.strip

      可以驗(yàn)證生成的新文件已經(jīng)沒(méi)有了png符號(hào).

      我們用這個(gè)方法應(yīng)用到其他所有平臺(tái).

      ar

      我們用上述方法處理arm64時(shí)遇到了問(wèn)題

       

      這個(gè)文件里的一些符號(hào)用作了重定向入口, strip命令不允許刪除, 這時(shí)就需要更強(qiáng)力的工具ld登場(chǎng)了. ld 其實(shí)蘋(píng)果系統(tǒng)下的鏈接器, 可以更精確的控制符號(hào)表的導(dǎo)出.

      ld的操作對(duì)象是obj, 因此我們需要先用到ar打包工具. ar可以查看一個(gè)程序包里的對(duì)象文件列表, 解壓出其中的對(duì)象文件并重新打包.

      ar -t MAMapKit.arm64 

       

      可以看到整個(gè)包就包含了一個(gè)主對(duì)象文件.

      使用 -x 解壓出來(lái), 接下來(lái)就要輪到 ld 上場(chǎng)了.

      ld

      本問(wèn)題需要的ld功能和strip基本一致, 使用下述命令

      ld -x -r -unexported_symbols_list symbols MAMapKit-arm64-master.o -o MAMapKit-arm64-master.o.strip

      由此生成對(duì)象文件就剔除了png符號(hào)表

      接下來(lái)要做的就是上述逆過(guò)程, 對(duì)象文件合并成程序文件

      ar -r MAMapKit.arm64 MAMapKit-arm64-master.o.strip Pods-MAMapKit-dummy.o

      最后是把各個(gè)平臺(tái)的程序打包成Fat File即可.

        

      終極大招

      2016-09-02 更新

      使用 Xcode 編譯選項(xiàng)即可以完成上述任務(wù)!

      1. Perform Single-Object Prelink

      這個(gè)參數(shù)設(shè)置為 Yes

      這一步, 把所有的object文件合并成一個(gè)object文件, 相當(dāng)于進(jìn)行預(yù)編譯

      這是最核心的操作, 因?yàn)樵撁顣?huì)觸發(fā)Xcode調(diào)用 ld 命令

       

       2. Single-Object Prelink Flags

      這個(gè)參數(shù)設(shè)置 -unexported_symbols_list $(PROJECT_DIR)/symbol.txt

      這就相當(dāng)于給 ld 命令傳遞參數(shù), 正式我們上文提到的操作

       

      通過(guò)這兩個(gè)選項(xiàng)的配置, 我們就在Xcode里設(shè)置好了符號(hào)刪除的任務(wù), 不用再在編譯完成后手動(dòng)刪除.

       

      其他的一些參數(shù), 比如 Strip Style, 可以根據(jù)需要手動(dòng)決定, 因?yàn)閯h除后就不能再斷點(diǎn)調(diào)試了!

       

      posted on 2016-07-23 15:44  大寶pku  閱讀(9065)  評(píng)論(4)    收藏  舉報(bào)

      導(dǎo)航

      主站蜘蛛池模板: 嘉义县| 亚洲av影院一区二区三区| 久久精品国产91精品亚洲| 野花香视频在线观看免费高清版 | 熟女一区二区中文在线| 国产专区一va亚洲v天堂| 国产在线视频不卡一区二区| 日本a在线播放| 亚洲综合色区另类av| 亚洲精品专区永久免费区| 97亚洲色欲色欲综合网| 国产综合久久久久鬼色| 在线精品亚洲区一区二区| 亚洲欧美另类久久久精品播放的| 天堂va蜜桃一区二区三区| 少妇又爽又刺激视频| 天堂网亚洲综合在线| 伊人久久大香线蕉aⅴ色| 国产日韩综合av在线| 羞羞影院午夜男女爽爽免费视频| 亚洲综合网国产精品一区| 亚洲人成色99999在线观看| 少妇高潮喷水正在播放| 久久丫精品久久丫| 国产精品一区二区三区污| 97久久超碰亚洲视觉盛宴| 精品国偷自产在线视频99| 亚洲av专区一区| 国产麻豆成人传媒免费观看| 疯狂做受XXXX高潮国产| 辽宁省| 久久99精品久久久大学生| 亚洲精品久久婷婷丁香51| 欧美日韩国产图片区一区| 久久精品无码免费不卡| 综合在线 亚洲 成人 欧美| 久热中文字幕在线| 国产欧亚州美日韩综合区| 中文人妻av高清一区二区| 国产综合久久久久鬼色| 国产欧美一区二区精品性色|