summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog18
-rw-r--r--Makerules6
-rw-r--r--elf/dl-load.c4
-rw-r--r--elf/dl-lookup.c18
-rw-r--r--elf/dl-reloc.c4
-rw-r--r--elf/do-rel.h5
-rw-r--r--elf/link.h7
-rw-r--r--elf/rtld.c4
-rw-r--r--sysdeps/i386/dl-runtime.c2
9 files changed, 44 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 1a7b9c5c74..03d75b1590 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
Thu Jun 8 02:50:26 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+ * elf/dl-load.c (_dl_map_object): Add MAP_INHERIT flag in mmap
+ from zero fill.
+
+ * elf/dl-lookup.c (_dl_lookup_symbol): Take new flag arg NOSELF;
+ if nonzero, don't let *REF satisfy the reference itself.
+ * elf/link.h (_dl_lookup_symbol): Add new arg NOSELF in decl.
+ * sysdeps/i386/dl-runtime.c (_dl_runtime_resolve): Pass new arg to
+ _dl_lookup_symbol.
+ * elf/do-rel.h (elf_dynamic_do_rel): Pass new second arg of
+ R->r_offset to RESOLVE callback.
+ * elf/dl-reloc.c (_dl_relocate_object: resolve): Don't let *REF
+ satisfy the reference itself if its value equals the reloc's
+ offset.
+
+ * elf/rtld.c (dl_main): Write a newline in fatal msg.
+
+ * Makerules (lib%.so: lib%_pic.a): Pass $(LDFLAGS.so).
+
* elf/rtld.c [! NDEBUG] (__assert_perror_fail): New function.
* hurd/hurdstartup.c (_hurd_startup): Fancier kludge to guess phdr
diff --git a/Makerules b/Makerules
index 593a81c9d7..87e71a832d 100644
--- a/Makerules
+++ b/Makerules
@@ -355,10 +355,10 @@ ifeq (yes,$(build-shared))
# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
# on other shared objects.
lib%.so: lib%_pic.a
- $(LINK.o) -shared -o $@ -Wl,--whole-archive $< \
- $(LDFLAGS-$(notdir $*).so) \
+ $(LINK.o) -shared -o $@ \
+ $(LDFLAGS.so) $(LDFLAGS-$(notdir $*).so) \
-L$(firstword $(objdir) .) -L$(common-objpfx:%/=%) \
- $(LDLIBS-$(notdir $*).so)
+ $(LDLIBS-$(notdir $*).so) -Wl,--whole-archive $< \
# Don't try to use -lc when making libc.so itself.
# Also omits crti.o and crtn.o, which we do not want
diff --git a/elf/dl-load.c b/elf/dl-load.c
index c48286f938..6cacd3e3b6 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -354,8 +354,8 @@ _dl_map_object (struct link_map *loader, const char *name,
if (zeroend > zeropage)
/* Map the remaining zero pages in from the zero fill FD. */
- mapat = mmap (zeropage, zeroend - zeropage,
- prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
+ mapat = mmap (zeropage, zeroend - zeropage, prot,
+ MAP_ANON|MAP_PRIVATE|MAP_FIXED|MAP_INHERIT,
_dl_zerofd, 0);
}
}
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 4d5d795ee5..ca0f03489d 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -23,13 +23,15 @@ Cambridge, MA 02139, USA. */
#include <assert.h>
/* Search loaded objects' symbol tables for a definition of
- the symbol UNDEF_NAME. Don't use a PLT defn in UNDEF_MAP, since
- that is the object making the reference. */
+ the symbol UNDEF_NAME. If NOSELF is nonzero, then *REF
+ cannot satisfy the reference itself; some different binding
+ must be found. */
Elf32_Addr
_dl_lookup_symbol (const char *undef_name, const Elf32_Sym **ref,
struct link_map *symbol_scope,
- const char *reference_name)
+ const char *reference_name,
+ int noself)
{
unsigned long int hash = elf_hash (undef_name);
struct link_map *map;
@@ -57,7 +59,9 @@ _dl_lookup_symbol (const char *undef_name, const Elf32_Sym **ref,
{
const Elf32_Sym *sym = &symtab[symidx];
- if (sym->st_value == 0)
+ if (sym->st_value == 0 || /* No value. */
+ sym->st_shndx == SHN_UNDEF || /* PLT entry. */
+ (noself && sym == *ref)) /* The reference can't define it. */
continue;
switch (ELF32_ST_TYPE (sym->st_info))
@@ -71,12 +75,6 @@ _dl_lookup_symbol (const char *undef_name, const Elf32_Sym **ref,
continue;
}
- if (sym->st_shndx == SHN_UNDEF)
- /* This is the same symbol we are looking for the value for.
- If it is a PLT entry, it will have a value of its own;
- but that is not what we are looking for. */
- continue;
-
if (sym != *ref && strcmp (strtab + sym->st_name, undef_name))
/* Not the symbol we are looking for. */
continue;
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 7cbed389b8..7e4f4992a7 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -60,10 +60,10 @@ _dl_relocate_object (struct link_map *l, int lazy)
= ((void *) l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr);
- Elf32_Addr resolve (const Elf32_Sym **ref)
+ Elf32_Addr resolve (const Elf32_Sym **ref, Elf32_Addr r_offset)
{
return _dl_lookup_symbol (strtab + (*ref)->st_name, ref, scope,
- l->l_name);
+ l->l_name, (*ref)->st_value == r_offset);
}
real_next = l->l_next;
diff --git a/elf/do-rel.h b/elf/do-rel.h
index acef25d3f8..9657bc2297 100644
--- a/elf/do-rel.h
+++ b/elf/do-rel.h
@@ -37,7 +37,8 @@ Cambridge, MA 02139, USA. */
static inline void
elf_dynamic_do_rel (struct link_map *map,
int reltag, int sztag,
- Elf32_Addr (*resolve) (const Elf32_Sym **),
+ Elf32_Addr (*resolve) (const Elf32_Sym **symbol,
+ Elf32_Addr r_offset),
int lazy)
{
const Elf32_Sym *const symtab
@@ -61,7 +62,7 @@ elf_dynamic_do_rel (struct link_map *map,
else
{
if (resolve)
- loadbase = (*resolve) (&definer);
+ loadbase = (*resolve) (&definer, r->r_offset);
else
{
assert (definer->st_shndx != SHN_UNDEF);
diff --git a/elf/link.h b/elf/link.h
index 66de6d97d7..6f44a0cfdb 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -173,11 +173,14 @@ extern void _dl_setup_hash (struct link_map *map);
reference; it is replaced with the defining symbol, and the base load
address of the defining object is returned. SYMBOL_SCOPE is the head of
the chain used for searching. REFERENCE_NAME should name the object
- containing the reference; it is used in error messages. */
+ containing the reference; it is used in error messages. If NOSELF is
+ nonzero, them *SYM itself cannot define the value; another binding must
+ be found. */
extern Elf32_Addr _dl_lookup_symbol (const char *undef,
const Elf32_Sym **sym,
struct link_map *symbol_scope,
- const char *reference_name);
+ const char *reference_name,
+ int noself);
/* List of objects currently loaded. */
diff --git a/elf/rtld.c b/elf/rtld.c
index 7855c59052..ac14c45a98 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -258,8 +258,8 @@ of this helper program; chances are you did not intend to run this program.\n",
_dl_sysdep_fatal (_dl_argv[0] ?: "<program name unknown>",
": error in loading shared libraries\n",
errobj ?: "", errobj ? ": " : "",
- errstring, err ? ": " : NULL,
- err ? strerror (err) : NULL, NULL);
+ errstring, err ? ": " : "",
+ err ? strerror (err) : "", "\n", NULL);
/* Once we return, _dl_sysdep_start will invoke
the DT_INIT functions and then *USER_ENTRY. */
diff --git a/sysdeps/i386/dl-runtime.c b/sysdeps/i386/dl-runtime.c
index aac5f993ea..5e4a289031 100644
--- a/sysdeps/i386/dl-runtime.c
+++ b/sysdeps/i386/dl-runtime.c
@@ -64,7 +64,7 @@ _dl_runtime_resolve (Elf32_Word reloc_offset)
definer = &symtab[ELF32_R_SYM (reloc->r_info)];
loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer,
- scope, l->l_name);
+ scope, l->l_name, 0);
/* Restore list frobnication done above for DT_SYMBOLIC. */
l->l_next = real_next;