二進制重排

clang插裝

先查看需要優(yōu)化項目的排列
1、Xcode:【Build Settings 】-> 【W(wǎng)rite Link Map File】 -> YES;
2聚蝶、然后Clean項目篡殷,運行钝吮,選擇Products 中的項目-> Show in Finder;
3、然后上上層,就是找到【Intermediates.noindex】->【FlashRider.build】->【Debug-iphonesimulator】(選擇對應(yīng)運行模式的)
->【FlashRider.build】->【FlashRider-LinkMap-normal-arm64.txt】

/**
 Build Settings -> Other C Flags -> -fsanitize-coverage=func,trace-pc-guard
 Build Settings -> Other Swift Flags -> -sanitize-coverage=func -sanitize=undefined
 Build Settings -> Write Link Map File -> Yes
 Build Settings -> Order File -> ./my.order
 */

#import "OrderFileTool.h"
#include <stdint.h>
#include <stdio.h>
#include <sanitizer/coverage_interface.h>
#import <dlfcn.h>
#import <libkern/OSAtomic.h>

@implementation OrderFileTool

//定義原子隊列
static OSQueueHead symbolList = OS_ATOMIC_QUEUE_INIT;

//定義符號結(jié)構(gòu)體
typedef struct{
    void *pc;
    void *next;
} SYNode;

void __sanitizer_cov_trace_pc_guard_init(uint32_t *start,
                                                    uint32_t *stop) {
  static uint64_t N;  // Counter for the guards.
  if (start == stop || *start) return;  // Initialize only once.
  printf("INIT: %p %p\n", start, stop);
  for (uint32_t *x = start; x < stop; x++)
    *x = ++N;
}


void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
//  if (!*guard) return;
  //當(dāng)前函數(shù)返回到上一個調(diào)用的地址!!
    
    void *PC = __builtin_return_address(0);
    //創(chuàng)建結(jié)構(gòu)體!
   SYNode * node = malloc(sizeof(SYNode));
    *node = (SYNode){PC,NULL};
    
    //加入結(jié)構(gòu)!
    OSAtomicEnqueue(&symbolList, node, offsetof(SYNode, next));
}


- (void)createOrderFile {
    //定義數(shù)組
    NSMutableArray<NSString *> * symbolNames = [NSMutableArray array];
    
    while (YES) {//一次循環(huán)!也會被HOOK一次!!
       SYNode * node = OSAtomicDequeue(&symbolList, offsetof(SYNode, next));
        
        if (node == NULL) {
            break;
        }
        Dl_info info = {0};
        dladdr(node->pc, &info);
//        printf("%s \n",info.dli_sname);
        NSString * name = @(info.dli_sname);
        free(node);
        
        BOOL isObjc = [name hasPrefix:@"+["]||[name hasPrefix:@"-["];
        NSString * symbolName = isObjc ? name : [@"_" stringByAppendingString:name];
        //是否去重??
        [symbolNames addObject:symbolName];
        /*
        if ([name hasPrefix:@"+["]||[name hasPrefix:@"-["]) {
            //如果是OC方法名稱直接存!
            [symbolNames addObject:name];
            continue;
        }
        //如果不是OC直接加個_存!
        [symbolNames addObject:[@"_" stringByAppendingString:name]];
         */
    }
    //反向數(shù)組
//    symbolNames = (NSMutableArray<NSString *>*)[[symbolNames reverseObjectEnumerator] allObjects];
    NSEnumerator * enumerator = [symbolNames reverseObjectEnumerator];
    
    //創(chuàng)建一個新數(shù)組
    NSMutableArray * funcs = [NSMutableArray arrayWithCapacity:symbolNames.count];
    NSString * name;
    //去重!
    while (name = [enumerator nextObject]) {
        if (![funcs containsObject:name]) {//數(shù)組中不包含name
            [funcs addObject:name];
        }
    }
    [funcs removeObject:[NSString stringWithFormat:@"%s",__FUNCTION__]];
    //數(shù)組轉(zhuǎn)成字符串
    NSString * funcStr = [funcs componentsJoinedByString:@"\n"];
    NSLog(@"OrderFile###%@",funcStr);
    //字符串寫入文件
    //文件路徑
    NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"my.order"];
    //文件內(nèi)容
    NSData * fileContents = [funcStr dataUsingEncoding:NSUTF8StringEncoding];
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:fileContents attributes:nil];
    
}
@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奇瘦,一起剝皮案震驚了整個濱河市棘催,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耳标,老刑警劉巖醇坝,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異次坡,居然都是意外死亡纲仍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門贸毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夜赵,你說我怎么就攤上這事明棍。” “怎么了寇僧?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵摊腋,是天一觀的道長。 經(jīng)常有香客問我嘁傀,道長兴蒸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任细办,我火速辦了婚禮橙凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笑撞。我一直安慰自己岛啸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布茴肥。 她就那樣靜靜地躺著坚踩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓤狐。 梳的紋絲不亂的頭發(fā)上瞬铸,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音础锐,去河邊找鬼嗓节。 笑死,一個胖子當(dāng)著我的面吹牛皆警,可吹牛的內(nèi)容都是我干的赦政。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恢着!你這毒婦竟也來了桐愉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤掰派,失蹤者是張志新(化名)和其女友劉穎从诲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靡羡,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡系洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了略步。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片描扯。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趟薄,靈堂內(nèi)的尸體忽然破棺而出绽诚,到底是詐尸還是另有隱情,我是刑警寧澤杭煎,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布恩够,位于F島的核電站,受9級特大地震影響羡铲,放射性物質(zhì)發(fā)生泄漏蜂桶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一也切、第九天 我趴在偏房一處隱蔽的房頂上張望扑媚。 院中可真熱鬧,春花似錦雷恃、人聲如沸钦购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押桃。三九已至,卻和暖如春导犹,著一層夾襖步出監(jiān)牢的瞬間唱凯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工谎痢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磕昼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓节猿,卻偏偏與公主長得像票从,于是被迫代替她去往敵國和親漫雕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容