Sat Jul 13 20:17:38 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Sun, 14 Jul 1996 05:27:54 +0000 (05:27 +0000)
committerroland <roland>
Sun, 14 Jul 1996 05:27:54 +0000 (05:27 +0000)
* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_open_zero_fill): Function
removed.
(__mmap): Pass MACH_PORT_NULL for memobj port when (flags & MAP_ANON).
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_open_zero_fill):
Conditionalize defn on [! MAP_ANON].
* elf/dl-minimal.c (malloc): Conditionalize use of _dl_zerofd
on [! MAP_ANON].
* elf/rtld.c (dl_main): Likewise.
* elf/dl-load.c (_dl_zerofd): Conditionalize defn on [! MAP_ANON].
(_dl_map_object_from_fd): Conditionalize initialization of _dl_zerofd.

elf/dl-load.c
elf/dl-minimal.c
sysdeps/generic/dl-sysdep.c
sysdeps/mach/hurd/dl-sysdep.c

index ff7f5cf..29ac0bf 100644 (file)
@@ -59,7 +59,14 @@ Cambridge, MA 02139, USA.  */
 
 #define STRING(x) #x
 
+#ifdef MAP_ANON
+/* The fd is not examined when using MAP_ANON.  */
+#define ANONFD -1
+#else
 int _dl_zerofd = -1;
+#define ANONFD _dl_zerofd
+#endif
+
 size_t _dl_pagesize;
 
 
@@ -176,6 +183,8 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
   if (header->e_phentsize != sizeof (ElfW(Phdr)))
     LOSE ("ELF file's phentsize not the expected size");
 
+#ifndef MAP_ANON
+#define MAP_ANON 0
   if (_dl_zerofd == -1)
     {
       _dl_zerofd = _dl_sysdep_open_zero_fill ();
@@ -185,6 +194,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
          _dl_signal_error (errno, NULL, "cannot open zero fill device");
        }
     }
+#endif
 
   /* Enter the new object in the list of loaded objects.  */
   l = _dl_new_object (realname, name, l_type);
@@ -329,7 +339,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
                caddr_t mapat;
                mapat = __mmap ((caddr_t) zeropage, zeroend - zeropage,
                                c->prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
-                               _dl_zerofd, 0);
+                               ANONFD, 0);
                if (mapat == (caddr_t) -1)
                  lose (errno, "cannot map zero-fill pages");
              }
index fd7bf05..61615cd 100644 (file)
@@ -33,13 +33,18 @@ static void *alloc_ptr, *alloc_end, *alloc_last_block;
 void * weak_function
 malloc (size_t n)
 {
+#ifdef MAP_ANON
+#define        _dl_zerofd (-1)
+#else
   extern int _dl_zerofd;
 
-  if (_dl_pagesize == 0)
-    _dl_pagesize = __getpagesize ();
-
   if (_dl_zerofd == -1)
     _dl_zerofd = _dl_sysdep_open_zero_fill ();
+#define MAP_ANON 0
+#endif
+
+  if (_dl_pagesize == 0)
+    _dl_pagesize = __getpagesize ();
 
   if (alloc_end == 0)
     {
index 9fab0f0..8f9e782 100644 (file)
@@ -109,11 +109,15 @@ _dl_sysdep_start_cleanup (void)
 {
 }
 
+#ifndef MAP_ANON
+/* This is only needed if the system doesn't support MAP_ANON.  */
+
 int
 _dl_sysdep_open_zero_fill (void)
 {
   return __open ("/dev/zero", O_RDONLY);
 }
+#endif
 
 void
 _dl_sysdep_fatal (const char *msg, ...)
index cffc51e..ee2bf73 100644 (file)
@@ -210,15 +210,6 @@ _dl_sysdep_start_cleanup (void)
   __mach_port_deallocate (__mach_task_self (), __mach_task_self_);
 }
 \f
-int
-_dl_sysdep_open_zero_fill (void)
-{
-  /* The minimal mmap below uses the fd as a memory object port.
-     The real mmap used for dlopen ignores the fd for MAP_ANON.  */
-  return (int) MACH_PORT_NULL;
-}
-
-
 void
 _dl_sysdep_fatal (const char *msg, ...)
 {
@@ -523,7 +514,8 @@ __mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
   err = __vm_map (__mach_task_self (),
                  &mapaddr, (vm_size_t) len, 0 /*ELF_MACHINE_USER_ADDRESS_MASK*/,
                  !(flags & MAP_FIXED),
-                 (mach_port_t) fd, (vm_offset_t) offset,
+                 (flags & MAP_ANON) ? MACH_PORT_NULL : (mach_port_t) fd,
+                 (vm_offset_t) offset,
                  flags & (MAP_COPY|MAP_PRIVATE),
                  vmprot, VM_PROT_ALL,
                  (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY);