* elf/dl-load.c (_dl_map_object_from_fd): Fix mapping and l_phdr

guessing to not assume p_vaddr of first load cmd is zero.
This commit is contained in:
Roland McGrath 1996-06-21 21:37:08 +00:00
parent 4f54cdb1dd
commit 0d3726c3fb
2 changed files with 18 additions and 5 deletions

View File

@ -1,5 +1,8 @@
Fri Jun 21 00:27:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* elf/dl-load.c (_dl_map_object_from_fd): Fix mapping and l_phdr
guessing to not assume p_vaddr of first load cmd is zero.
* sysdeps/sparc/elf/start.S: New file.
* sysdeps/sparc/dl-machine.h: New file.

View File

@ -278,7 +278,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
unallocated. Then jump into the normal segment-mapping loop to
handle the portion of the segment past the end of the file
mapping. */
__mprotect (mapat + c->mapend,
__mprotect ((caddr_t) (l->l_addr + c->mapend),
loadcmds[nloadcmds - 1].allocend - c->mapend,
0);
goto postmap;
@ -337,6 +337,20 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
++c;
}
if (l->l_phdr == 0)
{
/* 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, and that the first load command starts at the
beginning of the file and thus contains the ELF file header. */
ElfW(Addr) bof = l->l_addr + loadcmds[0].mapstart;
assert (loadcmds[0].mapoff == 0);
l->l_phdr = (void *) (bof + ((const ElfW(Ehdr) *) bof)->e_phoff);
}
else
/* Adjust the PT_PHDR value by the runtime load address. */
(ElfW(Addr)) l->l_phdr += l->l_addr;
}
/* We are done mapping in the file. We no longer need the descriptor. */
@ -353,10 +367,6 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
else
(ElfW(Addr)) l->l_ld += l->l_addr;
if (l->l_phdr == 0)
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);