dl-defs.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright (C) 2000-2006 by Erik Andersen <andersen@codepoet.org>
  3. *
  4. * GNU Lesser General Public License version 2.1 or later.
  5. */
  6. #ifndef _DL_DEFS_H
  7. #define _DL_DEFS_H
  8. #define FLAG_ANY -1
  9. #define FLAG_TYPE_MASK 0x00ff
  10. #define FLAG_LIBC4 0x0000
  11. #define FLAG_ELF 0x0001
  12. #define FLAG_ELF_LIBC5 0x0002
  13. #define FLAG_ELF_LIBC6 0x0003
  14. #define FLAG_ELF_UCLIBC 0x0004
  15. #define FLAG_REQUIRED_MASK 0xff00
  16. #define FLAG_SPARC_LIB64 0x0100
  17. #define FLAG_IA64_LIB64 0x0200
  18. #define FLAG_X8664_LIB64 0x0300
  19. #define FLAG_S390_LIB64 0x0400
  20. #define FLAG_POWERPC_LIB64 0x0500
  21. #define FLAG_MIPS64_LIBN32 0x0600
  22. #define FLAG_MIPS64_LIBN64 0x0700
  23. #define LIB_ANY -1
  24. #define LIB_DLL 0
  25. #define LIB_ELF 1
  26. #define LIB_ELF64 0x80
  27. #define LIB_ELF_LIBC5 2
  28. #define LIB_ELF_LIBC6 3
  29. #define LIB_ELF_LIBC0 4
  30. #if defined(__LDSO_PRELOAD_FILE_SUPPORT__) || defined(__LDSO_CACHE_SUPPORT__)
  31. #ifndef __LDSO_BASE_FILENAME__
  32. #define __LDSO_BASE_FILENAME__ "ld.so"
  33. #endif
  34. #define LDSO_BASE_PATH UCLIBC_RUNTIME_PREFIX "etc/" __LDSO_BASE_FILENAME__
  35. #ifdef __LDSO_PRELOAD_FILE_SUPPORT__
  36. #define LDSO_PRELOAD LDSO_BASE_PATH ".preload"
  37. #endif
  38. #ifdef __LDSO_CACHE_SUPPORT__
  39. #define LDSO_CONF LDSO_BASE_PATH ".conf"
  40. #define LDSO_CACHE LDSO_BASE_PATH ".cache"
  41. #define LDSO_CACHE_MAGIC "ld.so-"
  42. #define LDSO_CACHE_MAGIC_LEN (sizeof LDSO_CACHE_MAGIC -1)
  43. #define LDSO_CACHE_VER "1.7.0"
  44. #define LDSO_CACHE_VER_LEN (sizeof LDSO_CACHE_VER -1)
  45. typedef struct {
  46. char magic [LDSO_CACHE_MAGIC_LEN];
  47. char version [LDSO_CACHE_VER_LEN];
  48. int nlibs;
  49. } header_t;
  50. typedef struct {
  51. int flags;
  52. int sooffset;
  53. int liboffset;
  54. } libentry_t;
  55. #ifdef __ARCH_USE_MMU__
  56. #define LDSO_CACHE_MMAP_FLAGS (MAP_SHARED)
  57. #else
  58. #define LDSO_CACHE_MMAP_FLAGS (MAP_PRIVATE)
  59. #endif
  60. #endif /* __LDSO_CACHE_SUPPORT__ */
  61. #endif
  62. #ifdef _LIBC
  63. #ifndef __ARCH_HAS_NO_SHARED__
  64. /* arch specific defines */
  65. #include <dl-sysdep.h>
  66. #endif
  67. #ifdef __TARGET_c6x__
  68. #include <dl-sysdep.h>
  69. #endif
  70. #endif
  71. /* Provide a means for a port to pass additional arguments to the _dl_start
  72. function. */
  73. #ifndef DL_START
  74. # define DL_START(X) static void * __attribute_used__ _dl_start(X)
  75. #endif
  76. /* Machines in which different sections may be relocated by different
  77. * amounts should define this and LD_RELOC_ADDR. If you change this,
  78. * make sure you change struct link_map in include/link.h accordingly
  79. * such that it matches a prefix of struct elf_resolve.
  80. */
  81. #ifndef DL_LOADADDR_TYPE
  82. # define DL_LOADADDR_TYPE ElfW(Addr)
  83. #endif
  84. /* When DL_LOADADDR_TYPE is not a scalar value, or some different
  85. * computation is needed to relocate an address, define this.
  86. */
  87. #ifndef DL_RELOC_ADDR
  88. # define DL_RELOC_ADDR(LOADADDR, ADDR) \
  89. ((LOADADDR) + (ADDR))
  90. #endif
  91. /* Initialize the location of the dynamic addr. This is only called
  92. * from DL_START, so additional arguments passed to it may be referenced. */
  93. #ifndef DL_BOOT_COMPUTE_DYN
  94. #define DL_BOOT_COMPUTE_DYN(DPNT, GOT, LOAD_ADDR) \
  95. ((DPNT) = ((ElfW(Dyn) *) DL_RELOC_ADDR(LOAD_ADDR, GOT)))
  96. #endif
  97. /* Initialize the location of the global offset table. This is only called
  98. * from DL_START, so additional arguments passed to it may be referenced. */
  99. #ifndef DL_BOOT_COMPUTE_GOT
  100. #define DL_BOOT_COMPUTE_GOT(GOT) \
  101. ((GOT) = elf_machine_dynamic())
  102. #endif
  103. /* Initialize a LOADADDR representing the loader itself. It's only
  104. * called from DL_START, so additional arguments passed to it may be
  105. * referenced.
  106. */
  107. #ifndef DL_INIT_LOADADDR_BOOT
  108. # define DL_INIT_LOADADDR_BOOT(LOADADDR, BASEADDR) \
  109. ((LOADADDR) = (BASEADDR))
  110. #endif
  111. /* Define if any declarations/definitions of local variables are
  112. * needed in a function that calls DT_INIT_LOADADDR or
  113. * DL_INIT_LOADADDR_HDR. Declarations must be properly terminated
  114. * with a semicolon, and non-declaration statements are forbidden.
  115. */
  116. #ifndef DL_INIT_LOADADDR_EXTRA_DECLS
  117. # define DL_INIT_LOADADDR_EXTRA_DECLS /* int i; */
  118. #endif
  119. /* Prepare a DL_LOADADDR_TYPE data structure for incremental
  120. * initialization with DL_INIT_LOADADDR_HDR, given pointers to a base
  121. * load address and to program headers.
  122. */
  123. #ifndef DL_INIT_LOADADDR
  124. # define DL_INIT_LOADADDR(LOADADDR, BASEADDR, PHDR, PHDRCNT) \
  125. ((LOADADDR) = (BASEADDR))
  126. #endif
  127. /* Initialize a LOADADDR representing the program. It's called from
  128. * DL_BOOT only.
  129. */
  130. #ifndef DL_INIT_LOADADDR_PROG
  131. # define DL_INIT_LOADADDR_PROG(LOADADDR, BASEADDR) \
  132. ((LOADADDR) = (DL_LOADADDR_TYPE)(BASEADDR))
  133. #endif
  134. /* Update LOADADDR with information about PHDR, just mapped to the
  135. given ADDR. */
  136. #ifndef DL_INIT_LOADADDR_HDR
  137. # define DL_INIT_LOADADDR_HDR(LOADADDR, ADDR, PHDR) /* Do nothing. */
  138. #endif
  139. /* Convert a DL_LOADADDR_TYPE to an identifying pointer. Used mostly
  140. * for debugging.
  141. */
  142. #ifndef DL_LOADADDR_BASE
  143. # define DL_LOADADDR_BASE(LOADADDR) (LOADADDR)
  144. #endif
  145. /* Test whether a given ADDR is more likely to be within the memory
  146. * region mapped to TPNT (a struct elf_resolve *) than to TFROM.
  147. * Everywhere that this is used, TFROM is initially NULL, and whenever
  148. * a potential match is found, it's updated. One might want to walk
  149. * the chain of elf_resolve to locate the best match and return false
  150. * whenever TFROM is non-NULL, or use an exact-matching algorithm
  151. * using additional information encoded in DL_LOADADDR_TYPE to test
  152. * for exact containment.
  153. */
  154. #ifndef DL_ADDR_IN_LOADADDR
  155. # define DL_ADDR_IN_LOADADDR(ADDR, TPNT, TFROM) \
  156. ((void*)(TPNT)->mapaddr < (void*)(ADDR) \
  157. && (!(TFROM) || (TFROM)->mapaddr < (TPNT)->mapaddr))
  158. #endif
  159. /* This is called from dladdr() to give targets that use function descriptors
  160. * a chance to map a function descriptor's address to the function's entry
  161. * point before trying to find in which library it's defined. */
  162. #ifndef DL_LOOKUP_ADDRESS
  163. #define DL_LOOKUP_ADDRESS(ADDRESS) (ADDRESS)
  164. #endif
  165. /* On some architectures dladdr can't use st_size of all symbols this way. */
  166. #define DL_ADDR_SYM_MATCH(SYM_ADDR, SYM, MATCHSYM, ADDR) \
  167. ((ADDR) >= (SYM_ADDR) \
  168. && ((((SYM)->st_shndx == SHN_UNDEF || (SYM)->st_size == 0) \
  169. && (ADDR) == (SYM_ADDR)) \
  170. || (ADDR) < (SYM_ADDR) + (SYM)->st_size) \
  171. && (!(MATCHSYM) || MATCHSYM < (SYM_ADDR)))
  172. /* Use this macro to convert a pointer to a function's entry point to
  173. * a pointer to function. The pointer is assumed to have already been
  174. * relocated. LOADADDR is passed because it may contain additional
  175. * information needed to compute the pointer to function.
  176. */
  177. #ifndef DL_ADDR_TO_FUNC_PTR
  178. # define DL_ADDR_TO_FUNC_PTR(ADDR, LOADADDR) ((void(*)(void))(ADDR))
  179. #endif
  180. /* On some platforms, computing a pointer to function is more
  181. expensive than calling a function at a given address, so this
  182. alternative is provided. The function signature must be given
  183. within parentheses, as in a type cast. */
  184. #ifndef DL_CALL_FUNC_AT_ADDR
  185. # define DL_CALL_FUNC_AT_ADDR(ADDR, LOADADDR, SIGNATURE, ...) \
  186. ((*SIGNATURE DL_ADDR_TO_FUNC_PTR ((ADDR), (LOADADDR)))(__VA_ARGS__))
  187. #endif
  188. /* An alignment value for a memory block returned by _dl_malloc. */
  189. #ifndef DL_MALLOC_ALIGN
  190. # define DL_MALLOC_ALIGN (__WORDSIZE / 8)
  191. #endif
  192. #ifdef __UCLIBC_UNDERSCORES__
  193. # define __C_SYMBOL_PREFIX__ "_"
  194. #else
  195. # define __C_SYMBOL_PREFIX__ ""
  196. #endif
  197. /* Define this if you want to modify the VALUE returned by
  198. _dl_find_hash for this reloc TYPE. TPNT is the module in which the
  199. matching SYM was found. */
  200. #ifndef DL_FIND_HASH_VALUE
  201. # define DL_FIND_HASH_VALUE(TPNT, TYPE, SYM) (DL_RELOC_ADDR ((TPNT)->loadaddr, (SYM)->st_value))
  202. #endif
  203. /* Unmap all previously-mapped segments accumulated in LOADADDR.
  204. Generally used when an error occurs during loading. */
  205. #ifndef DL_LOADADDR_UNMAP
  206. # define DL_LOADADDR_UNMAP(LOADADDR, LEN) \
  207. _dl_munmap((char *) (LOADADDR), (LEN))
  208. #endif
  209. /* Similar to DL_LOADADDR_UNMAP, but used for libraries that have been
  210. dlopen()ed successfully, when they're dlclose()d. */
  211. #ifndef DL_LIB_UNMAP
  212. # define DL_LIB_UNMAP(LIB, LEN) (DL_LOADADDR_UNMAP ((LIB)->mapaddr, (LEN)))
  213. #endif
  214. /* Define this to verify that a library named LIBNAME, whose ELF
  215. headers are pointed to by EPNT, is suitable for dynamic linking.
  216. If it is not, print an error message (optional) and return NULL.
  217. If the library can have its segments relocated independently,
  218. arrange for PICLIB to be set to 2. If all segments have to be
  219. relocated by the same amount, set it to 1. If it has to be loaded
  220. at physical addresses as specified in the program headers, set it
  221. to 0. A reasonable (?) guess for PICLIB will already be in place,
  222. so it is safe to do nothing here. */
  223. #ifndef DL_CHECK_LIB_TYPE
  224. # define DL_CHECK_LIB_TYPE(EPNT, PICLIB, PROGNAME, LIBNAME) (void)0
  225. #endif
  226. /* Define this if you have special segment. */
  227. #ifndef DL_IS_SPECIAL_SEGMENT
  228. # define DL_IS_SPECIAL_SEGMENT(EPNT, PPNT) 0
  229. #endif
  230. /* Define this if you want to use special method to map the segment. */
  231. #ifndef DL_MAP_SEGMENT
  232. # define DL_MAP_SEGMENT(EPNT, PPNT, INFILE, FLAGS) 0
  233. #endif
  234. /* Define this to declare the library offset. */
  235. #ifndef DL_DEF_LIB_OFFSET
  236. # define DL_DEF_LIB_OFFSET static unsigned long _dl_library_offset
  237. #endif
  238. /* Define this to get the library offset. */
  239. #ifndef DL_GET_LIB_OFFSET
  240. # define DL_GET_LIB_OFFSET() _dl_library_offset
  241. #endif
  242. /* Define this to set the library offset as difference beetwen the mapped
  243. library address and the smallest virtual address of the first PT_LOAD
  244. segment. */
  245. #ifndef DL_SET_LIB_OFFSET
  246. # define DL_SET_LIB_OFFSET(offset) (_dl_library_offset = (offset))
  247. #endif
  248. /* Define this to get the real object's runtime address. */
  249. #ifndef DL_GET_RUN_ADDR
  250. # define DL_GET_RUN_ADDR(loadaddr, mapaddr) (mapaddr)
  251. #endif
  252. #endif /* _DL_DEFS_H */