iOS精品文章

字符串或者函数写入指定的section

2017-12-12  本文已影响81人  盘石垂钓

话不都说直接上code

typedef enum WypValueType
{
    WypValueTypeString = 0,
    WypValueTypeFunction
} WypValueType;

typedef struct WypHeader
{
    WypValueType type;
    void *value;
}WypHeader;

typedef void (*func) (void);


__attribute((used, section("__DATA, wangyp"))) static const WypHeader value1 = (WypHeader){WypValueTypeString,"hello wordl"};

static void wangyp_fucn(void);
static void wangyp_fucn()
{
    printf("hello wangyp\n");
}
__attribute((used, section("__DATA, wangyp"))) static const WypHeader value2 = (WypHeader){WypValueTypeFunction,wangyp_fucn};

读取过程

uint32_t c = _dyld_image_count();
    for (uint32_t i = 0; i < c; i++) {
        const struct mach_header* image_header = _dyld_get_image_header(i);
        Dl_info info;
        if (dladdr(image_header, &info) == 0) {
            continue;
        }
        const void *mach_header = info.dli_fbase;
        const struct section_64 *section = getsectbynamefromheader_64((void *)mach_header, "__DATA", "wangyp");
        
        if (section == NULL) {
            return;
        }
        uint16_t step = sizeof(WypHeader);
        for (uint16_t offset = section->offset; offset < section->offset + section->size; offset += step) {
            WypHeader headerP = *(WypHeader *)(mach_header + offset);
            if (headerP.type == WypValueTypeString) {
                printf("String = %s\n",(char *)headerP.value);
            }
            
            if (headerP.type == WypValueTypeFunction) {
                func f = headerP.value;
                f();
            }
        }
    }
    ```

###  用途
1.配置作用,把配置在编译时写入段中,直接从段中读取配置项。
2.函数注册
上一篇下一篇

猜你喜欢

热点阅读