#include #include #include #if SIZE_MAX == 0xffffffff typedef Elf32_Phdr Phdr; #else typedef Elf64_Phdr Phdr; #endif void __static_pie_reloc(size_t *p) { size_t aux[16] = {0}, dyn[24] = {0}, *z; for (; *p; p++); for (p++; *p; p++); for (p++; *p; p+=2) if (*p<16) aux[*p]=p[1]; if (!aux[AT_BASE]) aux[AT_BASE] = aux[AT_PHDR] & -4096; for (p=(void *)aux[AT_PHDR]; *p; p=(void *)((char *)p+aux[AT_PHENT])) { Phdr *ph = (void *)p; if (ph->p_type == PT_DYNAMIC) { p = (void *)(aux[AT_BASE] + ph->p_vaddr); break; } } for (; *p; p+=2) if (*p<24) dyn[*p]=p[1]; if (dyn[DT_REL]) { p = (void *)(aux[AT_BASE] + dyn[DT_REL]); z = (void *)((char *)p + dyn[DT_RELSZ]); for (; p