使用__attribute__((used, section()))儲存函數和變量值


// eventType 入參表示函數對應觸發的條件
// 定義一個全局函數,聲明不被優化,存儲到mach-o的section信息中
// 如下存儲的參數名為(eventType連接Func),后期根據此名稱取值
#define HF_Init_Func_For(eventType) \
static void HF_Func_##eventType(void); \
__attribute__((used, section("__DATA," ""#eventType "Func"))) \
static const void * __Func__##eventType = HF_Func_##eventType; \
static void HF_Func_##eventType(void)

定義一個待執行函數

HF_Init_Func_For(setup) {
    NSLog(@"這個是自定義的函數");
}

執行標記為setup條件下執行的函數

HF_Call_Func_For_([NSString stringWithFormat:@"%@Func",@"setup"]);

int HF_Call_Func_For_(NSString *eventType) {
    
    Dl_info info;
    dladdr((const void *)&HF_Call_Func_For_, &info);
    struct mach_header_64 * machOHeader = (DTBaseMachHeader *)info.dli_fbase;
    uint64_t mach_header = (DTBaseType)info.dli_fbase;
    const struct section_64 * section = getsectbynamefromheader_64(machOHeader, "__DATA", eventType.UTF8String);
    if (section == NULL) { return -1; }
    size_t size = sizeof(void*);
    for (uint64_t add = mach_header + section->offset; add < mach_header + section->offset + section->size ; add += size) {
    // 注意此處返回為指向函數指針(結構體、基本數據結構等)的指針值
void (**function)(void) = (void (**)(void))add; (*function)(); } return 0; }

以上該方式一個.m文件中只能有一個該類型函數,否則就是重復定義。執行順序和編譯相關(compile sources排序相關)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM