美文网首页iOS精品文章
字符串或者函数写入指定的section

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

作者: 盘石垂钓 | 来源:发表于2017-12-12 20:23 被阅读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.函数注册

    相关文章

      网友评论

        本文标题:字符串或者函数写入指定的section

        本文链接:https://www.haomeiwen.com/subject/yoonixtx.html