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

话不都说直接上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.函数注册
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容