* solib-svr4.c (LM_ADDR_CHECK): New variable minpagesize.  Optionally
	initialize it from ELF BFD.  Extend the prelink condition by it.
This commit is contained in:
Jan Kratochvil 2010-02-15 17:37:35 +00:00
parent 74164c5624
commit 4e1fc9c971
2 changed files with 13 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2010-02-15 Jan Kratochvil <jan.kratochvil@redhat.com>
* solib-svr4.c (LM_ADDR_CHECK): New variable minpagesize. Optionally
initialize it from ELF BFD. Extend the prelink condition by it.
2010-02-15 Jan Kratochvil <jan.kratochvil@redhat.com>
* defs.h (parse_pid_to_attach): New.

View File

@ -194,6 +194,7 @@ LM_ADDR_CHECK (struct so_list *so, bfd *abfd)
if (dynaddr + l_addr != l_dynaddr)
{
CORE_ADDR align = 0x1000;
CORE_ADDR minpagesize = align;
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
{
@ -206,6 +207,8 @@ LM_ADDR_CHECK (struct so_list *so, bfd *abfd)
for (i = 0; i < ehdr->e_phnum; i++)
if (phdr[i].p_type == PT_LOAD && phdr[i].p_align > align)
align = phdr[i].p_align;
minpagesize = get_elf_backend_data (abfd)->minpagesize;
}
/* Turn it into a mask. */
@ -230,9 +233,12 @@ LM_ADDR_CHECK (struct so_list *so, bfd *abfd)
mapping of the library may not actually happen on a 64k boundary!
(In the usual case where (l_addr & align) == 0, this check is
equivalent to the possibly expected check above.) */
equivalent to the possibly expected check above.)
if ((l_addr & align) == ((l_dynaddr - dynaddr) & align))
Even on PPC it must be zero-aligned at least for MINPAGESIZE. */
if ((l_addr & (minpagesize - 1)) == 0
&& (l_addr & align) == ((l_dynaddr - dynaddr) & align))
{
l_addr = l_dynaddr - dynaddr;