summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-12 04:00:32 +0000
committerRoland McGrath <roland@gnu.org>1996-06-12 04:00:32 +0000
commit463e148b7581de66898a9675fc7dd5dfc88f8b0e (patch)
tree2d98d77cb503cd6aabd4bcd80a09da21924ae62e
parent8d6468d0c8aa55b319ba70a83d3b092c292ef0b1 (diff)
Tue Jun 11 23:23:30 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* Makerules (LDFLAGS-c.so): Use __libc_main instead of __libc_print_version as entry point for shared object. * version.c [HAVE_ELF] (__libc_main): New function. * elf/dl-load.c (_dl_map_object_from_fd): Relocate l_entry with the load address.
-rw-r--r--ChangeLog9
-rw-r--r--Makerules2
-rw-r--r--elf/dl-load.c2
-rw-r--r--version.c14
4 files changed, 26 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 0eb13bd181..1adcc3f4cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Jun 11 23:23:30 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
+
+ * Makerules (LDFLAGS-c.so): Use __libc_main instead of
+ __libc_print_version as entry point for shared object.
+ * version.c [HAVE_ELF] (__libc_main): New function.
+
+ * elf/dl-load.c (_dl_map_object_from_fd): Relocate l_entry with the
+ load address.
+
Tue Jun 11 19:13:04 1996 Richard Henderson <rth@tamu.edu>
* elf/dl-close.c: Include <string.h> for memcpy.
diff --git a/Makerules b/Makerules
index 5320ff4a9b..412b217184 100644
--- a/Makerules
+++ b/Makerules
@@ -491,7 +491,7 @@ endef
# since we define our own `.init' section specially.
LDFLAGS-c.so = -nostdlib -nostartfiles
# Give libc.so an entry point and make it directly runnable itself.
-LDFLAGS-c.so += -e __libc_print_version
+LDFLAGS-c.so += -e __libc_main
# Use our own special initializer and finalizer files for libc.so.
elfobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)elf))
$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
diff --git a/elf/dl-load.c b/elf/dl-load.c
index b9f4aa184b..48210731cc 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -357,6 +357,8 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
l->l_phdr = (void *) ((const ElfW(Ehdr) *) l->l_addr)->e_phoff;
(ElfW(Addr)) l->l_phdr += l->l_addr;
+ l->l_entry += l->l_addr;
+
elf_get_dynamic_info (l->l_ld, l->l_info);
if (l->l_info[DT_HASH])
_dl_setup_hash (l);
diff --git a/version.c b/version.c
index 3405ed5a68..e62504d2f9 100644
--- a/version.c
+++ b/version.c
@@ -36,6 +36,20 @@ This is free software; see the source for copying conditions.\n\
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
PARTICULAR PURPOSE.");
}
+
+#ifdef HAVE_ELF
+/* This function is the entry point for the shared object.
+ Running the library as a program will get here. */
+
+#include <stdlib.h>
+
+void
+__libc_main (void)
+{
+ __libc_print_version ();
+ exit (0);
+}
+#endif
/*
Local Variables: