dl-sysdep.h
来自「ucLinux is a very good embeded sytem. Mo」· C头文件 代码 · 共 125 行
H
125 行
/* vi: set sw=8 ts=8: *//* * Various assmbly language/system dependent hacks that are required * so that we can minimize the amount of platform specific code. *//* Define this if the system uses RELOCA. */#undef ELF_USES_RELOCA#include <elf.h>#include <link.h>#define ARCH_NUM 3#define DT_MIPS_GOTSYM_IDX (DT_NUM + OS_NUM)#define DT_MIPS_LOCAL_GOTNO_IDX (DT_NUM + OS_NUM +1)#define DT_MIPS_SYMTABNO_IDX (DT_NUM + OS_NUM +2)#define ARCH_DYNAMIC_INFO(dpnt, dynamic, debug_addr) \do { \if (dpnt->d_tag == DT_MIPS_GOTSYM) \ dynamic[DT_MIPS_GOTSYM_IDX] = dpnt->d_un.d_val; \else if(dpnt->d_tag == DT_MIPS_LOCAL_GOTNO) \ dynamic[DT_MIPS_LOCAL_GOTNO_IDX] = dpnt->d_un.d_val; \else if(dpnt->d_tag == DT_MIPS_SYMTABNO) \ dynamic[DT_MIPS_SYMTABNO_IDX] = dpnt->d_un.d_val; \else if (dpnt->d_tag == DT_MIPS_RLD_MAP) \ *(Elf32_Addr *)(dpnt->d_un.d_ptr) = (Elf32_Addr) debug_addr; \} while (0)/* Initialization sequence for the application/library GOT. */#define INIT_GOT(GOT_BASE,MODULE) \do { \ unsigned long i; \ \ /* Check if this is the dynamic linker itself */ \ if (MODULE->libtype == program_interpreter) \ continue; \ \ /* Fill in first two GOT entries according to the ABI */ \ GOT_BASE[0] = (unsigned long) _dl_runtime_resolve; \ GOT_BASE[1] = (unsigned long) MODULE; \ \ /* Add load address displacement to all local GOT entries */ \ i = 2; \ while (i < MODULE->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX]) \ GOT_BASE[i++] += (unsigned long) MODULE->loadaddr; \ \} while (0)/* Here we define the magic numbers that this dynamic loader should accept */#define MAGIC1 EM_MIPS#define MAGIC2 EM_MIPS_RS3_LE/* Used for error messages */#define ELF_TARGET "MIPS"unsigned long __dl_runtime_resolve(unsigned long sym_index, unsigned long old_gpreg);struct elf_resolve;void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy);#define do_rem(result, n, base) ((result) = (n) % (base))/* 4096 bytes alignment */#define PAGE_ALIGN 0xfffff000#define ADDR_ALIGN 0xfff#define OFFS_ALIGN 0x7ffff000#define elf_machine_type_class(type) ELF_RTYPE_CLASS_PLT/* MIPS does not have COPY relocs */#define DL_NO_COPY_RELOCS#define OFFSET_GP_GOT 0x7ff0static inline ElfW(Addr) *elf_mips_got_from_gpreg (ElfW(Addr) gpreg){ /* FIXME: the offset of gp from GOT may be system-dependent. */ return (ElfW(Addr) *) (gpreg - OFFSET_GP_GOT);}/* Return the link-time address of _DYNAMIC. Conveniently, this is the first element of the GOT. This must be inlined in a function which uses global data. We assume its $gp points to the primary GOT. */static inline ElfW(Addr)elf_machine_dynamic (void){ register ElfW(Addr) gp __asm__ ("$28"); return *elf_mips_got_from_gpreg (gp);}#define STRINGXP(X) __STRING(X)#define STRINGXV(X) STRINGV_(X)#define STRINGV_(...) # __VA_ARGS__#define PTR_LA la#define PTR_SUBU subu/* Return the run-time load address of the shared object. */static inline ElfW(Addr)elf_machine_load_address (void){ ElfW(Addr) addr; asm (" .set noreorder\n" " " STRINGXP (PTR_LA) " %0, 0f\n" " bltzal $0, 0f\n" " nop\n" "0: " STRINGXP (PTR_SUBU) " %0, $31, %0\n" " .set reorder\n" : "=r" (addr) : /* No inputs */ : "$31"); return addr;}static inline voidelf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, Elf32_Word relative_count){ /* No REALTIVE relocs in MIPS? */}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?