From b10ab72581173784a6687739e44c02d940e009c9 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 8 Sep 2005 22:45:53 +0000 Subject: 2005-09-08 Jeff Johnston * Makefile.am: Add include files under bits sub-directory. * Makefile.in: Regenerated. * libc/sys/linux/argp/argp-fs-xinl.c: Set __OPTIMIZE__ to actual value of 1 to be compatible with newer glibc headers. * libc/sys/linux/sys/cdefs.h: Fix to be compatible with newer glibc headers. * libc/sys/linux/sys/dirent.h: Ditto. * libc/sys/linux/argp/argp-xinl.c: Ditto. * libc/sys/linux/dl/dl-runtime.c: Make sure fixup and profile_fixup routines are marked used so they won't be optimized away. * libc/sys/linux/dl/dl-cache.c: Don't use weak_extern macro to mark functions as weak. * libc/sys/linux/dl/dl-open.c: Ditto. * libc/sys/linux/iconv/gconv_open.c: Fix to obey new gcc4 rules about lvalues. * libc/sys/linux/iconv/gconv_simple.c: Ditto. * libc/sys/linux/linuxthreads/bits/libc-lock.h: Don't use weak_extern macro to mark functions as weak. Instead always use #pragma weak. * iconvdata/jis0208.h: Fix to work with gcc4. * libc/sys/linux/dl/dl-load.c: Ditto. * libc/sys/linux/dl/dl-reloc.c: Ditto. * libc/sys/linux/dl/do-rel.h: Ditto. * libc/sys/linux/dl/dynamic-link.h: Ditto. * libc/sys/linux/include/ltdl.h: Ditto. * libc/sys/linux/machine/i386/dl-machine.h: Ditto. * libc/sys/linux/machine/i386/weakalias.h: Ditto. * libc/sys/linux/net/ns_ntoa.c: Ditto. * libc/sys/linux/bits/initspin.h: New file. * libc/sys/linux/bits/libc-lock.h: Ditto. * libc/sys/linux/bits/pthreadtypes.h: Ditto. * libc/sys/linux/bits/typesizes.h: Ditto. --- newlib/libc/sys/linux/dl/dl-cache.c | 2 +- newlib/libc/sys/linux/dl/dl-load.c | 4 +-- newlib/libc/sys/linux/dl/dl-open.c | 4 +-- newlib/libc/sys/linux/dl/dl-reloc.c | 52 ++++++++++++++++----------------- newlib/libc/sys/linux/dl/dl-runtime.c | 4 +-- newlib/libc/sys/linux/dl/do-rel.h | 10 ++++--- newlib/libc/sys/linux/dl/dynamic-link.h | 25 ++++++++++++---- 7 files changed, 57 insertions(+), 44 deletions(-) (limited to 'newlib/libc/sys/linux/dl') diff --git a/newlib/libc/sys/linux/dl/dl-cache.c b/newlib/libc/sys/linux/dl/dl-cache.c index a71e5e876..9511da13f 100644 --- a/newlib/libc/sys/linux/dl/dl-cache.c +++ b/newlib/libc/sys/linux/dl/dl-cache.c @@ -208,7 +208,7 @@ _dl_load_cache_lookup (const char *name) /* This file ends in static libraries where we don't have a hwcap. */ unsigned long int *hwcap; uint64_t platform; - weak_extern (_dl_hwcap); + #pragma weak _dl_hwcap /* This is where the strings start. */ cache_data = (const char *) cache_new; diff --git a/newlib/libc/sys/linux/dl/dl-load.c b/newlib/libc/sys/linux/dl/dl-load.c index 65b72c729..4e32d604b 100644 --- a/newlib/libc/sys/linux/dl/dl-load.c +++ b/newlib/libc/sys/linux/dl/dl-load.c @@ -1095,7 +1095,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, } else /* Adjust the PT_PHDR value by the runtime load address. */ - (ElfW(Addr)) l->l_phdr += l->l_addr; + l->l_phdr = (ElfW(Addr)) l->l_phdr + l->l_addr; } /* We are done mapping in the file. We no longer need the descriptor. */ @@ -1115,7 +1115,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, } } else - (ElfW(Addr)) l->l_ld += l->l_addr; + l->l_ld = (ElfW(Addr)) l->l_ld + l->l_addr; l->l_entry += l->l_addr; diff --git a/newlib/libc/sys/linux/dl/dl-open.c b/newlib/libc/sys/linux/dl/dl-open.c index 195361427..4e068d435 100644 --- a/newlib/libc/sys/linux/dl/dl-open.c +++ b/newlib/libc/sys/linux/dl/dl-open.c @@ -36,8 +36,8 @@ extern ElfW(Addr) _dl_sysdep_start (void **start_argptr, void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum, - ElfW(Addr) *user_entry)); -weak_extern (BP_SYM (_dl_sysdep_start)) + ElfW(Addr) *user_entry)) + weak_function; /* This function is used to unload the cache file if necessary. */ extern void _dl_unload_cache (void); diff --git a/newlib/libc/sys/linux/dl/dl-reloc.c b/newlib/libc/sys/linux/dl/dl-reloc.c index 94163143e..0bffa4e76 100644 --- a/newlib/libc/sys/linux/dl/dl-reloc.c +++ b/newlib/libc/sys/linux/dl/dl-reloc.c @@ -105,50 +105,47 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], { /* Do the actual relocation of the object's GOT and other data. */ - /* String table object symbols. */ - const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]); - /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code. */ -#define RESOLVE_MAP(ref, version, r_type) \ +#define RESOLVE_MAP(ref, version, r_type, scope) \ (ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL \ - ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0) \ - && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class) \ + ? ((__builtin_expect ((*ref) == map->l_lookup_cache.sym, 0) \ + && elf_machine_type_class (r_type) == map->l_lookup_cache.type_class)\ ? (++_dl_num_cache_relocations, \ - (*ref) = l->l_lookup_cache.ret, \ - l->l_lookup_cache.value) \ + (*ref) = map->l_lookup_cache.ret, \ + map->l_lookup_cache.value) \ : ({ lookup_t _lr; \ int _tc = elf_machine_type_class (r_type); \ - l->l_lookup_cache.type_class = _tc; \ - l->l_lookup_cache.sym = (*ref); \ + map->l_lookup_cache.type_class = _tc; \ + map->l_lookup_cache.sym = (*ref); \ _lr = ((version) != NULL && (version)->hash != 0 \ ? _dl_lookup_versioned_symbol (strtab + (*ref)->st_name, \ - l, (ref), scope, \ + map, (ref), scope, \ (version), _tc, 0) \ - : _dl_lookup_symbol (strtab + (*ref)->st_name, l, (ref), \ + : _dl_lookup_symbol (strtab + (*ref)->st_name, map, (ref),\ scope, _tc, 0)); \ - l->l_lookup_cache.ret = (*ref); \ - l->l_lookup_cache.value = _lr; })) \ - : l) -#define RESOLVE(ref, version, r_type) \ + map->l_lookup_cache.ret = (*ref); \ + map->l_lookup_cache.value = _lr; })) \ + : map) +#define RESOLVE(ref, version, r_type, scope) \ (ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL \ - ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0) \ - && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class) \ + ? ((__builtin_expect ((*ref) == map->l_lookup_cache.sym, 0) \ + && elf_machine_type_class (r_type) == map->l_lookup_cache.type_class)\ ? (++_dl_num_cache_relocations, \ - (*ref) = l->l_lookup_cache.ret, \ - l->l_lookup_cache.value) \ + (*ref) = map->l_lookup_cache.ret, \ + map->l_lookup_cache.value) \ : ({ lookup_t _lr; \ int _tc = elf_machine_type_class (r_type); \ - l->l_lookup_cache.type_class = _tc; \ - l->l_lookup_cache.sym = (*ref); \ + map->l_lookup_cache.type_class = _tc; \ + map->l_lookup_cache.sym = (*ref); \ _lr = ((version) != NULL && (version)->hash != 0 \ ? _dl_lookup_versioned_symbol (strtab + (*ref)->st_name, \ - l, (ref), scope, \ + map, (ref), scope, \ (version), _tc, 0) \ - : _dl_lookup_symbol (strtab + (*ref)->st_name, l, (ref), \ + : _dl_lookup_symbol (strtab + (*ref)->st_name, map, (ref),\ scope, _tc, 0)); \ - l->l_lookup_cache.ret = (*ref); \ - l->l_lookup_cache.value = _lr; })) \ - : l->l_addr) + map->l_lookup_cache.ret = (*ref); \ + map->l_lookup_cache.value = _lr; })) \ + : map->l_addr) #include "dynamic-link.h" @@ -197,6 +194,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], } } +#include void internal_function diff --git a/newlib/libc/sys/linux/dl/dl-runtime.c b/newlib/libc/sys/linux/dl/dl-runtime.c index 403091d2e..4fb81cfaf 100644 --- a/newlib/libc/sys/linux/dl/dl-runtime.c +++ b/newlib/libc/sys/linux/dl/dl-runtime.c @@ -46,7 +46,7 @@ function. */ #ifndef ELF_MACHINE_NO_PLT -static ElfW(Addr) __attribute__ ((regparm (2), unused)) +static ElfW(Addr) __attribute__ ((regparm (2), used)) fixup ( # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS ELF_MACHINE_RUNTIME_FIXUP_ARGS, @@ -130,7 +130,7 @@ fixup ( #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ -static ElfW(Addr) __attribute__ ((regparm (3), unused)) +static ElfW(Addr) __attribute__ ((regparm (3), used)) profile_fixup ( #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/newlib/libc/sys/linux/dl/do-rel.h b/newlib/libc/sys/linux/dl/do-rel.h index 46202d704..03b9e807b 100644 --- a/newlib/libc/sys/linux/dl/do-rel.h +++ b/newlib/libc/sys/linux/dl/do-rel.h @@ -44,7 +44,8 @@ static inline void elf_dynamic_do_rel (struct link_map *map, ElfW(Addr) reladdr, ElfW(Addr) relsize, - int lazy) + int lazy, + struct r_scope_elem *scope[]) { const ElfW(Rel) *r = (const void *) reladdr; const ElfW(Rel) *end = (const void *) (reladdr + relsize); @@ -77,7 +78,7 @@ elf_dynamic_do_rel (struct link_map *map, RTLD_BOOTSTRAP) because rtld.c contains the common defn for _dl_rtld_map, which is incompatible with a weak decl in the same file. */ - weak_extern (_dl_rtld_map); + #pragma weak _dl_rtld_map if (map != &_dl_rtld_map) /* Already done in rtld itself. */ # ifndef DO_RELA /* Rela platforms get the offset from r_addend and this must @@ -101,13 +102,14 @@ elf_dynamic_do_rel (struct link_map *map, ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)]; elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], &map->l_versions[ndx], - (void *) (l_addr + r->r_offset)); + (void *) (l_addr + r->r_offset), + scope); } } else for (; r < end; ++r) elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL, - (void *) (l_addr + r->r_offset)); + (void *) (l_addr + r->r_offset), scope); } } diff --git a/newlib/libc/sys/linux/dl/dynamic-link.h b/newlib/libc/sys/linux/dl/dynamic-link.h index a63fded89..c1709f7c6 100644 --- a/newlib/libc/sys/linux/dl/dynamic-link.h +++ b/newlib/libc/sys/linux/dl/dynamic-link.h @@ -17,6 +17,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef __DYNAMIC_LINK_H__ +#define __DYNAMIC_LINK_H__ + #include #include #include @@ -33,7 +36,7 @@ extern int _dl_verbose __attribute__ ((unused)); /* Read the dynamic section at DYN and fill in INFO with indices DT_*. */ -static inline void __attribute__ ((unused)) +static void __attribute__ ((unused)) elf_get_dynamic_info (struct link_map *l) { ElfW(Dyn) *dyn = l->l_ld; @@ -121,6 +124,17 @@ elf_get_dynamic_info (struct link_map *l) info[DT_RPATH] = NULL; } +# if ! ELF_MACHINE_NO_REL +# include "do-rel.h" +# endif + +# if ! ELF_MACHINE_NO_RELA +# define DO_RELA +# include "do-rel.h" +# endif + +#endif /* __DYNAMIC_LINK_H__ */ + #ifdef RESOLVE /* Get the definitions of `elf_dynamic_do_rel' and `elf_dynamic_do_rela'. @@ -164,7 +178,8 @@ elf_get_dynamic_info (struct link_map *l) elf_dynamic_do_##reloc ((map), \ ranges[ranges_index].start, \ ranges[ranges_index].size, \ - ranges[ranges_index].lazy); \ + ranges[ranges_index].lazy, \ + scope); \ } while (0) # else # define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, test_rel) \ @@ -204,7 +219,8 @@ elf_get_dynamic_info (struct link_map *l) elf_dynamic_do_##reloc ((map), \ ranges[ranges_index].start, \ ranges[ranges_index].size, \ - ranges[ranges_index].lazy); \ + ranges[ranges_index].lazy, \ + scope); \ } while (0) # endif @@ -215,7 +231,6 @@ elf_get_dynamic_info (struct link_map *l) # endif # if ! ELF_MACHINE_NO_REL -# include "do-rel.h" # define ELF_DYNAMIC_DO_REL(map, lazy) \ _ELF_DYNAMIC_DO_RELOC (REL, rel, map, lazy, _ELF_CHECK_REL) # else @@ -223,8 +238,6 @@ elf_get_dynamic_info (struct link_map *l) # endif # if ! ELF_MACHINE_NO_RELA -# define DO_RELA -# include "do-rel.h" # define ELF_DYNAMIC_DO_RELA(map, lazy) \ _ELF_DYNAMIC_DO_RELOC (RELA, rela, map, lazy, _ELF_CHECK_REL) # else -- cgit v1.2.3