字符串或者函数写入指定的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.函数注册