1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
* 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.
This commit is contained in:
Ulrich Drepper
1999-05-07 00:00:48 +00:00
parent 607c351a14
commit 7bcaca4384
4 changed files with 31 additions and 15 deletions

View 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. */