]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 7 May 1999 00:00:48 +0000 (00:00 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 7 May 1999 00:00:48 +0000 (00:00 +0000)
* elf/link.h (struct link_map): New field l_phdr_allocated.
* elf/dl-load.c (_dl_map_object_from_fd): Don't depend on having
the program header being part of any loaded segment.  If it is not
allocate memory and set l_phdr_allocated flag.
* elf/dl-close.c (_dl_close): Free l_phdr if necessary.

ChangeLog
elf/dl-close.c
elf/dl-load.c
elf/link.h

index 59400bffeb49b9f253994d1631ed37dfa7e0c536..06de3f1da69637ef15f1257fa34efb809aba6b9b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 1999-05-06  Ulrich Drepper  <drepper@cygnus.com>
 
+       * elf/link.h (struct link_map): New field l_phdr_allocated.
+       * elf/dl-load.c (_dl_map_object_from_fd): Don't depend on having
+       the program header being part of any loaded segment.  If it is not
+       allocate memory and set l_phdr_allocated flag.
+       * elf/dl-close.c (_dl_close): Free l_phdr if necessary.
+
        * nss/digits_dots.c: Correct return value interpretation of
        inet_ntoa.  Fix PR libc/1109.
 
index d7a61c45356ffaddd346cae8f573185f17c3a9a3..6846f83a8d9fdeae5eab1720b9c64e76c878f127 100644 (file)
@@ -165,6 +165,9 @@ _dl_close (struct link_map *map)
          if (imap != map && imap->l_searchlist.r_list != NULL)
            free (imap->l_searchlist.r_list);
 
+         if (imap->l_phdr_allocated)
+           free (imap->l_phdr);
+
          free (imap);
        }
     }
index 6e8b977195f65bc4e7e829856daaf6b6823ca924..5ed5128ef577eb68d886b20fbbd2f0ba5f60114e 100644 (file)
@@ -917,6 +917,13 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
                       c->prot, MAP_FIXED, c->mapoff);
 
       postmap:
+       if (l->l_phdr == 0
+           && c->mapoff <= header->e_phoff
+           && (c->mapend - c->mapstart + c->mapoff
+               >= header->e_phoff + header->e_phnum * sizeof (ElfW(Phdr))))
+         /* Found the program header in this segment.  */
+         l->l_phdr = (void *) (c->mapstart + header->e_phoff - c->mapoff);
+
        if (c->allocend > c->dataend)
          {
            /* Extra zero pages should appear at the end of this segment,
@@ -963,22 +970,19 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
        ++c;
       }
 
-    if (l->l_phdr == 0)
+    if (l->l_phdr == NULL)
       {
-       /* There was no PT_PHDR specified.  We need to find the phdr in the
-           load image ourselves.  We assume it is in fact in the load image
-           somewhere.  */
-       for (c = loadcmds; c < &loadcmds[nloadcmds]; c++)
-         if (c->mapoff <= header->e_phoff
-             && (c->mapend - c->mapstart + c->mapoff
-                 >= header->e_phoff + header->e_phnum * sizeof (ElfW(Phdr))))
-           {
-             ElfW(Addr) bof = l->l_addr + c->mapstart;
-             l->l_phdr = (void *) (bof + header->e_phoff - c->mapoff);
-             break;
-           }
-       if (l->l_phdr == 0)
-         LOSE (0, "program headers not contained in any loaded segment");
+       /* The program header is not contained in any of the segmenst.
+          We have to allocate memory ourself and copy it over from
+          out temporary place.  */
+       ElfW(Phdr) *newp = (ElfW(Phdr) *) malloc (header->e_phnum
+                                                 * sizeof (ElfW(Phdr)));
+       if (newp == NULL)
+         LOSE (ENOMEM, "cannot allocate memory for program header");
+
+       l->l_phdr = memcpy (newp, phdr,
+                           (header->e_phnum * sizeof (ElfW(Phdr))));
+       l->l_phdr_allocated = 1;
       }
     else
       /* Adjust the PT_PHDR value by the runtime load address.  */
index 4abcb49070901a5862256916f322f2ac20b8605f..5e9d7a88681e6e2e75aba32d567a7f6c5bb7077e 100644 (file)
@@ -199,6 +199,9 @@ struct link_map
        object is the same as one already loaded.  */
     dev_t l_dev;
     ino_t l_ino;
+
+    /* Nonzero if the data structure pointed to by `l_phdr' is allocated.  */
+    int l_phdr_allocated;
   };
 
 #endif /* link.h */