dynlink.h raw

   1  #ifndef _INTERNAL_RELOC_H
   2  #define _INTERNAL_RELOC_H
   3  
   4  #include <features.h>
   5  #include <elf.h>
   6  #include <stdint.h>
   7  #include <stddef.h>
   8  #include <stdarg.h>
   9  
  10  #if UINTPTR_MAX == 0xffffffff
  11  typedef Elf32_Ehdr Ehdr;
  12  typedef Elf32_Phdr Phdr;
  13  typedef Elf32_Sym Sym;
  14  #define R_TYPE(x) ((x)&255)
  15  #define R_SYM(x) ((x)>>8)
  16  #define R_INFO ELF32_R_INFO
  17  #else
  18  typedef Elf64_Ehdr Ehdr;
  19  typedef Elf64_Phdr Phdr;
  20  typedef Elf64_Sym Sym;
  21  #define R_TYPE(x) ((x)&0x7fffffff)
  22  #define R_SYM(x) ((x)>>32)
  23  #define R_INFO ELF64_R_INFO
  24  #endif
  25  
  26  /* These enum constants provide unmatchable default values for
  27   * any relocation type the arch does not use. */
  28  enum {
  29  	REL_NONE = 0,
  30  	REL_SYMBOLIC = -100,
  31  	REL_USYMBOLIC,
  32  	REL_GOT,
  33  	REL_PLT,
  34  	REL_RELATIVE,
  35  	REL_OFFSET,
  36  	REL_OFFSET32,
  37  	REL_COPY,
  38  	REL_SYM_OR_REL,
  39  	REL_DTPMOD,
  40  	REL_DTPOFF,
  41  	REL_TPOFF,
  42  	REL_TPOFF_NEG,
  43  	REL_TLSDESC,
  44  	REL_FUNCDESC,
  45  	REL_FUNCDESC_VAL,
  46  };
  47  
  48  struct fdpic_loadseg {
  49  	uintptr_t addr, p_vaddr, p_memsz;
  50  };
  51  
  52  struct fdpic_loadmap {
  53  	unsigned short version, nsegs;
  54  	struct fdpic_loadseg segs[];
  55  };
  56  
  57  struct fdpic_dummy_loadmap {
  58  	unsigned short version, nsegs;
  59  	struct fdpic_loadseg segs[1];
  60  };
  61  
  62  #include "reloc.h"
  63  
  64  #ifndef FDPIC_CONSTDISP_FLAG
  65  #define FDPIC_CONSTDISP_FLAG 0
  66  #endif
  67  
  68  #ifndef DL_FDPIC
  69  #define DL_FDPIC 0
  70  #endif
  71  
  72  #ifndef DL_NOMMU_SUPPORT
  73  #define DL_NOMMU_SUPPORT 0
  74  #endif
  75  
  76  #if !DL_FDPIC
  77  #define IS_RELATIVE(x,s) ( \
  78  	(R_TYPE(x) == REL_RELATIVE) || \
  79  	(R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
  80  #else
  81  #define IS_RELATIVE(x,s) ( ( \
  82  	(R_TYPE(x) == REL_FUNCDESC_VAL) || \
  83  	(R_TYPE(x) == REL_SYMBOLIC) ) \
  84  	&& (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) )
  85  #endif
  86  
  87  #ifndef NEED_MIPS_GOT_RELOCS
  88  #define NEED_MIPS_GOT_RELOCS 0
  89  #endif
  90  
  91  #ifndef DT_DEBUG_INDIRECT
  92  #define DT_DEBUG_INDIRECT 0
  93  #endif
  94  
  95  #define AUX_CNT 32
  96  #define DYN_CNT 32
  97  
  98  typedef void (*stage2_func)(unsigned char *, size_t *);
  99  
 100  hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
 101  
 102  hidden void __dl_seterr(const char *, ...);
 103  hidden int __dl_invalid_handle(void *);
 104  hidden void __dl_vseterr(const char *, va_list);
 105  
 106  hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
 107  
 108  hidden extern int __malloc_replaced;
 109  hidden extern int __aligned_alloc_replaced;
 110  hidden void __malloc_donate(char *, char *);
 111  hidden int __malloc_allzerop(void *);
 112  
 113  #endif
 114