svn commit: trunk/uClibc/ldso: include ldso/arm ldso/avr32 ldso/bfin ld etc...

aldot at uclibc.org aldot at uclibc.org
Wed Dec 3 19:40:56 UTC 2008


Author: aldot
Date: 2008-12-03 11:40:55 -0800 (Wed, 03 Dec 2008)
New Revision: 24250

Log:
- 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>


Modified:
   trunk/uClibc/ldso/include/ldso.h
   trunk/uClibc/ldso/ldso/arm/dl-sysdep.h
   trunk/uClibc/ldso/ldso/avr32/dl-sysdep.h
   trunk/uClibc/ldso/ldso/bfin/dl-sysdep.h
   trunk/uClibc/ldso/ldso/cris/dl-sysdep.h
   trunk/uClibc/ldso/ldso/frv/dl-sysdep.h
   trunk/uClibc/ldso/ldso/i386/dl-sysdep.h
   trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h
   trunk/uClibc/ldso/ldso/mips/dl-sysdep.h
   trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sh/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h
   trunk/uClibc/ldso/ldso/x86_64/dl-sysdep.h
   trunk/uClibc/ldso/ldso/xtensa/dl-sysdep.h


Changeset:
Modified: trunk/uClibc/ldso/include/ldso.h
===================================================================
--- trunk/uClibc/ldso/include/ldso.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/include/ldso.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -39,6 +39,19 @@
 #include <dl-elf.h>
 #include <dl-hash.h>
 
+/* common align masks, if not specified by sysdep headers */
+#ifndef ADDR_ALIGN
+#define ADDR_ALIGN (_dl_pagesize - 1)
+#endif
+
+#ifndef PAGE_ALIGN
+#define PAGE_ALIGN (~ADDR_ALIGN)
+#endif
+
+#ifndef OFFS_ALIGN
+#define OFFS_ALIGN (PAGE_ALIGN & ~(1ul << (sizeof(_dl_pagesize) * 8 - 1)))
+#endif
+
 /* For INIT/FINI dependency sorting. */
 struct init_fini_list {
 	struct init_fini_list *next;

Modified: trunk/uClibc/ldso/ldso/arm/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/arm/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/arm/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -55,11 +55,6 @@
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one

Modified: trunk/uClibc/ldso/ldso/avr32/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/avr32/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/avr32/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -46,11 +46,6 @@
 
 unsigned long _dl_linux_resolver(unsigned long got_offset, unsigned long *got);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 #define elf_machine_type_class(type)				\
 	((type == R_AVR32_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)
 

Modified: trunk/uClibc/ldso/ldso/bfin/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/bfin/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/bfin/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -67,12 +67,6 @@
 
 extern int _dl_linux_resolve(void) __attribute__((__visibility__("hidden")));
 
-/* 4KiB page alignment.  Should perhaps be made dynamic using
-   getpagesize(), based on AT_PAGESZ from auxvt?  */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 struct funcdesc_ht;
 
 #undef SEND_EARLY_STDERR

Modified: trunk/uClibc/ldso/ldso/cris/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/cris/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/cris/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -18,11 +18,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry);
 
-/* 8192 bytes alignment */
-#define PAGE_ALIGN 0xffffe000
-#define ADDR_ALIGN 0x1fff
-#define OFFS_ALIGN 0xffffe000
-
 /* The union of reloc-type-classes where the reloc TYPE is a member.
 
    TYPE is in the class ELF_RTYPE_CLASS_PLT if it can describe a

Modified: trunk/uClibc/ldso/ldso/frv/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/frv/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/frv/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -51,12 +51,6 @@
 
 extern int _dl_linux_resolve(void) __attribute__((__visibility__("hidden")));
 
-/* 16KiB page alignment.  Should perhaps be made dynamic using
-   getpagesize(), based on AT_PAGESZ from auxvt?  */
-#define PAGE_ALIGN 0xffffc000
-#define ADDR_ALIGN 0x3fff
-#define OFFS_ALIGN 0x7fffc000
-
 struct funcdesc_ht;
 
 /* We must force strings used early in the bootstrap into the data

Modified: trunk/uClibc/ldso/ldso/i386/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/i386/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/i386/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -25,11 +25,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
    TLS variable, so undefined references should not be allowed to
    define the value.

Modified: trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -25,11 +25,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one

Modified: trunk/uClibc/ldso/ldso/mips/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/mips/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/mips/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -148,13 +148,7 @@
 
 /* 4096 bytes alignment */
 #if _MIPS_SIM == _MIPS_SIM_ABI64
-#define PAGE_ALIGN (~0xfffUL)
-#define ADDR_ALIGN 0xfffUL
 #define OFFS_ALIGN (0x10000000000UL-0x1000)
-#else	/* O32 || N32 */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
 #endif	/* O32 || N32 */
 
 #define elf_machine_type_class(type)		ELF_RTYPE_CLASS_PLT

Modified: trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -67,11 +67,6 @@
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 void _dl_init_got(unsigned long *lpnt,struct elf_resolve *tpnt);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one

Modified: trunk/uClibc/ldso/ldso/sh/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sh/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/sh/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -83,11 +83,6 @@
 
 #define do_rem(result, n, base)     ((result) = _dl_urem((n), (base)))
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
    TLS variable, so undefined references should not be allowed to
    define the value.

Modified: trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -25,11 +25,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
    TLS variable, so undefined references should not be allowed to
    define the value.

Modified: trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -89,18 +89,6 @@
 #define do_rem(result, n, base) ((result) = sparc_mod(n, base))
 #endif
 
-/* 4096 bytes alignment */
-#if defined(__sparc_v9__)
-/* ...but 8192 is required for mmap() on sparc64 kernel */
-#define PAGE_ALIGN 0xffffe000
-#define ADDR_ALIGN 0x1fff
-#define OFFS_ALIGN 0x7fffe000
-#elif defined(__sparc_v8__)
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-#endif
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one

Modified: trunk/uClibc/ldso/ldso/x86_64/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/x86_64/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/x86_64/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -41,11 +41,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
    TLS variable, so undefined references should not be allowed to
    define the value.

Modified: trunk/uClibc/ldso/ldso/xtensa/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/xtensa/dl-sysdep.h	2008-12-03 19:05:55 UTC (rev 24249)
+++ trunk/uClibc/ldso/ldso/xtensa/dl-sysdep.h	2008-12-03 19:40:55 UTC (rev 24250)
@@ -76,11 +76,6 @@
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
 
-/* 4096 bytes alignment */
-#define PAGE_ALIGN 0xfffff000
-#define ADDR_ALIGN 0xfff
-#define OFFS_ALIGN 0x7ffff000
-
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    undefined references should not be allowed to define the value.  */
 #define elf_machine_type_class(type) \




More information about the uClibc-cvs mailing list