📄 dl-sysdep.h
字号:
/* vi: set sw=4 ts=4: *//* * Various assmbly language/system dependent hacks that are required * so that we can minimize the amount of platform specific code. * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org> *//* Define this if the system uses RELOCA. */#undef ELF_USES_RELOCA#include <elf.h>/* Initialization sequence for the GOT. */#define INIT_GOT(GOT_BASE,MODULE) \do { \ GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ GOT_BASE[1] = (unsigned long) MODULE; \} while(0)/* Here we define the magic numbers that this dynamic loader should accept */#define MAGIC1 EM_386#undef MAGIC2/* Used for error messages */#define ELF_TARGET "386"struct elf_resolve;extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);#define do_rem(result, n, base) ((result) = (n) % (base))/* 4096 bytes alignment */#define PAGE_ALIGN 0xfffff000#define ADDR_ALIGN 0xfff#define OFFS_ALIGN 0x7ffff000/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or TLS variable, so undefined references should not be allowed to define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */#define elf_machine_type_class(type) \ ((((type) == R_386_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))/* 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. */static inline Elf32_Addr __attribute__ ((unused))elf_machine_dynamic (void){ register Elf32_Addr *got asm ("%ebx"); return *got;}/* Return the run-time load address of the shared object. */static inline Elf32_Addr __attribute__ ((unused))elf_machine_load_address (void){ /* It doesn't matter what variable this is, the reference never makes it to assembly. We need a dummy reference to some global variable via the GOT to make sure the compiler initialized %ebx in time. */ extern int _dl_errno; Elf32_Addr addr; asm ("leal _dl_start@GOTOFF(%%ebx), %0\n" "subl _dl_start@GOT(%%ebx), %0" : "=r" (addr) : "m" (_dl_errno) : "cc"); return addr;}static inline voidelf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, Elf32_Word relative_count){ Elf32_Rel * rpnt = (void *) rel_addr; --rpnt; do { Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset); *reloc_addr += load_off; } while (--relative_count);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -