#ifndef _INTERNAL_RELOC_H #define _INTERNAL_RELOC_H #include #include #include #include #include "libc.h" #if UINTPTR_MAX == 0xffffffff typedef Elf32_Ehdr Ehdr; typedef Elf32_Phdr Phdr; typedef Elf32_Sym Sym; #define R_TYPE(x) ((x)&255) #define R_SYM(x) ((x)>>8) #define R_INFO ELF32_R_INFO #else typedef Elf64_Ehdr Ehdr; typedef Elf64_Phdr Phdr; typedef Elf64_Sym Sym; #define R_TYPE(x) ((x)&0x7fffffff) #define R_SYM(x) ((x)>>32) #define R_INFO ELF64_R_INFO #endif /* These enum constants provide unmatchable default values for * any relocation type the arch does not use. */ enum { REL_NONE = 0, REL_SYMBOLIC = -100, REL_GOT, REL_PLT, REL_RELATIVE, REL_OFFSET, REL_OFFSET32, REL_COPY, REL_SYM_OR_REL, REL_DTPMOD, REL_DTPOFF, REL_TPOFF, REL_TPOFF_NEG, REL_TLSDESC, REL_FUNCDESC, REL_FUNCDESC_VAL, }; struct fdpic_loadseg { uintptr_t addr, p_vaddr, p_memsz; }; struct fdpic_loadmap { unsigned short version, nsegs; struct fdpic_loadseg segs[]; }; struct fdpic_dummy_loadmap { unsigned short version, nsegs; struct fdpic_loadseg segs[1]; }; #include "reloc.h" #ifndef FDPIC_CONSTDISP_FLAG #define FDPIC_CONSTDISP_FLAG 0 #endif #ifndef DL_FDPIC #define DL_FDPIC 0 #endif #ifndef DL_NOMMU_SUPPORT #define DL_NOMMU_SUPPORT 0 #endif #if !DL_FDPIC #define IS_RELATIVE(x,s) ( \ (R_TYPE(x) == REL_RELATIVE) || \ (R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) ) #else #define IS_RELATIVE(x,s) ( ( \ (R_TYPE(x) == REL_FUNCDESC_VAL) || \ (R_TYPE(x) == REL_SYMBOLIC) ) \ && (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) ) #endif #ifndef NEED_MIPS_GOT_RELOCS #define NEED_MIPS_GOT_RELOCS 0 #endif #ifndef DT_DEBUG_INDIRECT #define DT_DEBUG_INDIRECT 0 #endif #define AUX_CNT 32 #define DYN_CNT 32 typedef void (*stage2_func)(unsigned char *, size_t *); typedef _Noreturn void (*stage3_func)(size_t *); hidden void *__dlsym(void *restrict, const char *restrict, void *restrict); hidden void __dl_seterr(const char *, ...); hidden int __dl_invalid_handle(void *); hidden void __dl_vseterr(const char *, va_list); hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic(); #endif