OSDN Git Service

- Use runtime pagesize (Jeremy Kerr)
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 3 Dec 2008 19:40:55 +0000 (19:40 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 3 Dec 2008 19:40:55 +0000 (19:40 -0000)
commitce54b92b046b65464e2d16b3842f3e97e3e0f27e
tree5d840e5451b4259c8ff17b33883256ec24e6de9d
parent6b497bfbe9428312f56bad4c1a288516882ef689
- Use runtime pagesize (Jeremy Kerr)
Some powerpc machines can support 64k pages, enabled by the
CONFIG_64K_PAGES option in linux.

However, the uClibc dynamic loader won't currently work on these
machines, as it uses hard-coded values (PAGE_ALIGN, ADDR_ALIGN and
OFFS_ALIGN) in the ldso architecture-specific headers.  When running on
a kernel with 64k pages, ld.so tries to mmap with 4k-aligned addresses,
rather than 64k, so mmap fails with -EINVAL.

When booting a 64k machine with a uClibc dynamic linker, init fails
with:

/init:500: can't map '/lib/libc.so.0'
/init:500: can't map '/lib/libc.so.0'
/init:500: can't map '/lib/libc.so.0'
/init: can't load library 'libc.so.0'
Kernel panic - not syncing: Attempted to kill init!

This change allows ld.so determine these alignment masks at runtime,
rather than compile-time. Since we have the _dl_pagesize variable
available, we can use that to generate the appropriate masks.

Since almost all of the architectures can use the common definitions for
the _ALIGN macros, we can consolidate them all in ldso.h, and override
in the sysdep headers where necessary (ie, mips).

This allows me to start a uClibc-based root fs on a 64k machine.

Signed-off-by: Jeremy Kerr <jk at ozlabs org>
15 files changed:
ldso/include/ldso.h
ldso/ldso/arm/dl-sysdep.h
ldso/ldso/avr32/dl-sysdep.h
ldso/ldso/bfin/dl-sysdep.h
ldso/ldso/cris/dl-sysdep.h
ldso/ldso/frv/dl-sysdep.h
ldso/ldso/i386/dl-sysdep.h
ldso/ldso/m68k/dl-sysdep.h
ldso/ldso/mips/dl-sysdep.h
ldso/ldso/powerpc/dl-sysdep.h
ldso/ldso/sh/dl-sysdep.h
ldso/ldso/sh64/dl-sysdep.h
ldso/ldso/sparc/dl-sysdep.h
ldso/ldso/x86_64/dl-sysdep.h
ldso/ldso/xtensa/dl-sysdep.h