OSDN Git Service

patch from Bernd Schmidt to abstract away load address types
authorMike Frysinger <vapier@gentoo.org>
Wed, 5 Jul 2006 19:17:19 +0000 (19:17 -0000)
committerMike Frysinger <vapier@gentoo.org>
Wed, 5 Jul 2006 19:17:19 +0000 (19:17 -0000)
ldso/include/dl-defs.h
ldso/include/dl-elf.h
ldso/include/dl-hash.h
ldso/include/ldso.h
ldso/ldso/dl-elf.c
ldso/ldso/dl-hash.c
ldso/ldso/dl-startup.c
ldso/ldso/ldso.c

index 18f718b..5cf2601 100644 (file)
@@ -66,6 +66,15 @@ 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
+
 /* Initialize a LOADADDR representing the loader itself.  It's only
  * called from DL_BOOT, so additional arguments passed to it may be
  * referenced.
index de404ae..7b609d5 100644 (file)
@@ -94,10 +94,12 @@ extern void _dl_protect_relro (struct elf_resolve *l);
 
 #define DYNAMIC_SIZE (DT_NUM+OS_NUM+ARCH_NUM)
 
-extern void _dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[], void *debug_addr, ElfW(Addr) load_off);
+extern void _dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[],
+                                   void *debug_addr, DL_LOADADDR_TYPE load_off);
 
 static __always_inline
-void __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[], void *debug_addr, ElfW(Addr) load_off)
+void __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[],
+                             void *debug_addr, DL_LOADADDR_TYPE load_off)
 {
        for (; dpnt->d_tag; dpnt++) {
                if (dpnt->d_tag < DT_NUM) {
index ad5c163..8f30688 100644 (file)
@@ -28,7 +28,7 @@ struct dyn_elf {
 struct elf_resolve {
   /* These entries must be in this order to be compatible with the interface used
      by gdb to obtain the list of symbols. */
-  ElfW(Addr) loadaddr;         /* Base address shared object is loaded at.  */
+  DL_LOADADDR_TYPE loadaddr;           /* Base address shared object is loaded at.  */
   char *libname;               /* Absolute file name object was found in.  */
   ElfW(Dyn) *dynamic_addr;     /* Dynamic section of the shared object.  */
   struct elf_resolve * next;
@@ -77,7 +77,7 @@ extern struct elf_resolve * _dl_loaded_modules;
 extern struct dyn_elf    * _dl_handles;
 
 extern struct elf_resolve * _dl_add_elf_hash_table(const char * libname,
-       ElfW(Addr) loadaddr, unsigned long * dynamic_info,
+       DL_LOADADDR_TYPE loadaddr, unsigned long * dynamic_info,
        unsigned long dynamic_addr, unsigned long dynamic_size);
 
 extern char * _dl_find_hash(const char * name, struct dyn_elf * rpnt1,
index 6b1e9cb..47b2fb5 100644 (file)
@@ -88,7 +88,7 @@ extern void _dl_unsetenv(const char *symbol, char **envp);
 extern char *_dl_strdup(const char *string);
 extern void _dl_dprintf(int, const char *, ...);
 
-extern void _dl_get_ready_to_run(struct elf_resolve *tpnt, ElfW(Addr) load_addr,
-               ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv);
+extern void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
+                                 ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv);
 
 #endif /* _LDSO_H_ */
index 9c5b3b4..923e0cf 100644 (file)
@@ -801,7 +801,8 @@ char *_dl_strdup(const char *string)
        return retval;
 }
 
-void _dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[], void *debug_addr, ElfW(Addr) load_off)
+void _dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[],
+                            void *debug_addr, DL_LOADADDR_TYPE load_off)
 {
        __dl_parse_dynamic_info(dpnt, dynamic_info, debug_addr, load_off);
 }
index be702be..ccf191a 100644 (file)
@@ -83,7 +83,7 @@ static inline Elf_Symndx _dl_elf_hash(const char *name)
  * externals properly.
  */
 struct elf_resolve *_dl_add_elf_hash_table(const char *libname,
-       ElfW(Addr) loadaddr, unsigned long *dynamic_info, unsigned long dynamic_addr,
+       DL_LOADADDR_TYPE loadaddr, unsigned long *dynamic_info, unsigned long dynamic_addr,
        attribute_unused unsigned long dynamic_size)
 {
        Elf_Symndx *hash_addr;
index 18658cb..4115f29 100644 (file)
@@ -114,7 +114,7 @@ static void * __attribute_used__ _dl_start(unsigned long args)
 {
        unsigned int argc;
        char **argv, **envp;
-       ElfW(Addr) load_addr;
+       DL_LOADADDR_TYPE load_addr;
        ElfW(Addr) got;
        unsigned long *aux_dat;
        ElfW(Ehdr) *header;
index 4fe2bd1..82eb044 100644 (file)
@@ -102,7 +102,7 @@ uintptr_t __guard attribute_relro;
 #endif
 
 static void _dl_run_array_forward(unsigned long array, unsigned long size,
-                                 ElfW(Addr) loadaddr)
+                                  DL_LOADADDR_TYPE loadaddr)
 {
        if (array != 0) {
                unsigned int j;
@@ -173,9 +173,9 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void)
        }
 }
 
-void _dl_get_ready_to_run(struct elf_resolve *tpnt, ElfW(Addr) load_addr,
-                         ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp,
-                         char **argv)
+void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
+                          ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp,
+                          char **argv)
 {
        ElfW(Phdr) *ppnt;
        ElfW(Dyn) *dpnt;