二进制重排

2020-07-07  本文已影响0人  你好哈喽哈喽

一、首先获取 重排后方法执行顺序
.h 文件

import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface SymbolTools : NSObject
///写入启动完成时 调用的符号表

@end

NS_ASSUME_NONNULL_END
.m 文件

import "SymbolTools.h"

include <stdint.h>

include <stdio.h>

include <sanitizer/coverage_interface.h>

import <dlfcn.h>

import <libkern/OSAtomicQueue.h>

@implementation SymbolTools
//原子队列
static OSQueueHead symbolist = OS_ATOMIC_QUEUE_INIT;
//存放符号表的结构体
typedef struct {
void *pc; //当前函数栈信息
void *next; //下个函数栈信息
}SYNode;
//根据stop 地址偏移可以算出调用函数个数 ---暂时用不到,但是必须实现该函数,因为clang 会调用
void __sanitizer_cov_trace_pc_guard_init(uint32_t *start,
uint32_t *stop) {
if (start == stop || *start) return; // Initialize only once.
printf("INIT: %p %p\n", start, stop);

}
//返回函数调用地址 ->寄存器即将调用的下个函数地址
void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
void *PC = __builtin_return_address(0);
SYNode *node = malloc(sizeof(SYNode));
*node = (SYNode){PC,NULL};
//进入
OSAtomicEnqueue(&symbolist, node, offsetof(SYNode,next));

}

pragma 文件写入

二、配置顺序方法执行条件 -fsanitize-coverage=func,trace-pc-guard

image.png

三、按路径取到文件 放到工程目录中 然后配置参数

image.png
上一篇 下一篇

猜你喜欢

热点阅读