diff options
Diffstat (limited to 'ldso/include/dl-defs.h')
-rw-r--r-- | ldso/include/dl-defs.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/ldso/include/dl-defs.h b/ldso/include/dl-defs.h index 878ebc3b8..dc6531d19 100644 --- a/ldso/include/dl-defs.h +++ b/ldso/include/dl-defs.h @@ -66,4 +66,70 @@ typedef struct { #endif +/* Machines in which different sections may be relocated by different + amounts should define this and LD_RELOC_ADDR. If you change this, + make sure you change struct link_map in include/link.h accordingly + such that it matches a prefix of struct elf_resolve. */ +#ifndef DL_LOADADDR_TYPE +# define DL_LOADADDR_TYPE ElfW(Addr) +#endif + +/* When DL_LOADADDR_TYPE is not a scalar value, or some different + computation is needed to relocate an address, define this. */ +#ifndef DL_RELOC_ADDR +# define DL_RELOC_ADDR(ADDR, LOADADDR) \ + ((void*)((intptr_t)(ADDR) + (intptr_t)(LOADADDR))) +#endif + +/* Define if any declarations/definitions of local variables are + needed in a function that calls DT_INIT_LOADADDR or + DL_INIT_LOADADDR_HDR. Declarations must be properly terminated + with a semicolon, and non-declaration statements are forbidden. */ +#ifndef DL_INIT_LOADADDR_EXTRA_DECLS +# define DL_INIT_LOADADDR_EXTRA_DECLS /* int i; */ +#endif + +/* Prepare a DL_LOADADDR_TYPE data structure for incremental + initialization with DL_INIT_LOADADDR_HDR, given pointers to a base + load address and to program headers. */ +#ifndef DL_INIT_LOADADDR +# define DL_INIT_LOADADDR(LOADADDR, BASEADDR, PHDR, PHDRCNT) \ + ((LOADADDR) = (BASEADDR)) +#endif + +/* Convert a DL_LOADADDR_TYPE to an identifying pointer. Used mostly + for debugging. */ +#ifndef DL_LOADADDR_BASE +# define DL_LOADADDR_BASE(LOADADDR) (LOADADDR) +#endif + +/* Initialize a LOADADDR representing the loader itself. It's only + called from DL_BOOT, so additional arguments passed to it may be + referenced. */ +#ifndef DL_INIT_LOADADDR_BOOT +# define DL_INIT_LOADADDR_BOOT(LOADADDR, BASEADDR) \ + ((LOADADDR) = (BASEADDR)) +#endif + +/* Initialize a LOADADDR representing the program. It's called from + DL_BOOT only. */ +#ifndef DL_INIT_LOADADDR_PROG +# define DL_INIT_LOADADDR_PROG(LOADADDR, BASEADDR) \ + ((LOADADDR) = (BASEADDR)) +#endif + +/* Test whether a given ADDR is more likely to be within the memory + region mapped to TPNT (a struct elf_resolve *) than to TFROM. + Everywhere that this is used, TFROM is initially NULL, and whenever + a potential match is found, it's updated. One might want to walk + the chain of elf_resolve to locate the best match and return false + whenever TFROM is non-NULL, or use an exact-matching algorithm + using additional information encoded in DL_LOADADDR_TYPE to test + for exact containment. */ +#ifndef DL_ADDR_IN_LOADADDR +# define DL_ADDR_IN_LOADADDR(ADDR, TPNT, TFROM) \ + ((void*)(TPNT)->loadaddr < (void*)(ADDR) \ + && (! (TFROM) || (TFROM)->loadaddr < (TPNT)->loadaddr)) +#endif + #endif /* _LD_DEFS_H */ |