OSDN Git Service

buildsys: cache build flags in vars
[uclinux-h8/uClibc.git] / ldso / include / dl-elf.h
index 40c88b9..29d1a00 100644 (file)
@@ -26,16 +26,18 @@ static __inline__ void _dl_map_cache(void) { }
 static __inline__ void _dl_unmap_cache(void) { }
 #endif
 
+#define DL_RESOLVE_SECURE              0x0001
+#define DL_RESOLVE_NOLOAD              0x0002
 
 /* Function prototypes for non-static stuff in readelflib1.c */
 extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
        unsigned long rel_addr, unsigned long rel_size);
 extern int _dl_parse_relocation_information(struct dyn_elf *rpnt,
        struct r_scope_elem *scope, unsigned long rel_addr, unsigned long rel_size);
-extern struct elf_resolve * _dl_load_shared_library(int secure,
+extern struct elf_resolve * _dl_load_shared_library(unsigned rflags,
        struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname,
        int trace_loaded_objects);
-extern struct elf_resolve * _dl_load_elf_shared_library(int secure,
+extern struct elf_resolve * _dl_load_elf_shared_library(unsigned rflags,
        struct dyn_elf **rpnt, const char *libname);
 extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
        int trace_loaded_objects);
@@ -200,8 +202,13 @@ unsigned int __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info
                if (dynamic_info[tag]) \
                        dynamic_info[tag] = (unsigned long) DL_RELOC_ADDR(load_off, dynamic_info[tag]); \
        } while (0)
-       /* Don't adjust .dynamic unnecessarily.  */
-       if (load_off != 0) {
+       /* Don't adjust .dynamic unnecessarily.  For FDPIC targets,
+          we'd have to walk all the loadsegs to find out if it was
+          actually unnecessary, so skip this optimization.  */
+#if !defined __FDPIC__ && !defined __DSBT__
+       if (load_off != 0)
+#endif
+       {
                ADJUST_DYN_INFO(DT_HASH, load_off);
                ADJUST_DYN_INFO(DT_PLTGOT, load_off);
                ADJUST_DYN_INFO(DT_STRTAB, load_off);
@@ -212,6 +219,15 @@ unsigned int __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info
                ADJUST_DYN_INFO(DT_GNU_HASH_IDX, load_off);
 #endif
        }
+#ifdef __DSBT__
+       /* Get the mapped address of the DSBT base.  */
+       ADJUST_DYN_INFO(DT_DSBT_BASE_IDX, load_off);
+
+       /* Initialize loadmap dsbt info.  */
+       load_off.map->dsbt_table = (void *)dynamic_info[DT_DSBT_BASE_IDX];
+       load_off.map->dsbt_size = dynamic_info[DT_DSBT_SIZE_IDX];
+       load_off.map->dsbt_index = dynamic_info[DT_DSBT_INDEX_IDX];
+#endif
 #undef ADJUST_DYN_INFO
        return rtld_flags;
 }