Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2005-09-09 02:45:53 +0400
committerJeff Johnston <jjohnstn@redhat.com>2005-09-09 02:45:53 +0400
commitb10ab72581173784a6687739e44c02d940e009c9 (patch)
tree4fece41a6baba0e3b82da3793a0dfe1bf5d77ce1 /newlib/libc/sys/linux/dl
parent7b786e4861b3ba6594d5518770ddc498ae9b8a87 (diff)
2005-09-08 Jeff Johnston <jjohnstn@redhat.com>
* 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.
Diffstat (limited to 'newlib/libc/sys/linux/dl')
-rw-r--r--newlib/libc/sys/linux/dl/dl-cache.c2
-rw-r--r--newlib/libc/sys/linux/dl/dl-load.c4
-rw-r--r--newlib/libc/sys/linux/dl/dl-open.c4
-rw-r--r--newlib/libc/sys/linux/dl/dl-reloc.c52
-rw-r--r--newlib/libc/sys/linux/dl/dl-runtime.c4
-rw-r--r--newlib/libc/sys/linux/dl/do-rel.h10
-rw-r--r--newlib/libc/sys/linux/dl/dynamic-link.h25
7 files changed, 57 insertions, 44 deletions
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 <machine/dl-machine.h>
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 <elf.h>
#include <machine/dl-machine.h>
#include <assert.h>
@@ -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