diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2009-06-22 22:13:44 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2009-06-22 22:13:44 +0200 |
commit | 96404c63d3e2bd199c5faef8965f0e2886f0bb90 (patch) | |
tree | aee46dc9bc3e6bdce728253fbd3d3f7c7565f986 /toolchain | |
parent | f2eba903f8c420abf95de6af60e7793c7b8a88aa (diff) |
make lemote boot with uClibc
- patches for uClibc to work with pagesize != 4k
- use gcc extension to avoid -O2 compile
- use ld.so for 64 bit archs
big thanks to thorsten glaser helping out here.
Diffstat (limited to 'toolchain')
-rw-r--r-- | toolchain/uClibc/Makefile | 5 | ||||
-rw-r--r-- | toolchain/uClibc/patches/always_inline.patch | 360 | ||||
-rw-r--r-- | toolchain/uClibc/patches/extension-insteadof-inline.patch | 77 | ||||
-rw-r--r-- | toolchain/uClibc/patches/nold64.patch | 17 | ||||
-rw-r--r-- | toolchain/uClibc/patches/pagesize-fix.patch | 276 |
5 files changed, 370 insertions, 365 deletions
diff --git a/toolchain/uClibc/Makefile b/toolchain/uClibc/Makefile index 69b5d343a..e393eba5b 100644 --- a/toolchain/uClibc/Makefile +++ b/toolchain/uClibc/Makefile @@ -8,11 +8,6 @@ include ../rules.mk include Makefile.inc include ${TOPDIR}/mk/buildhlp.mk -#workaround for mips and gcc 4.4, where -Os does not inline code in ld.so -ifeq ($(ARCH),mips) -TARGET_CFLAGS:=$(subst Os,O2,$(TARGET_CFLAGS)) -endif - $(WRKBUILD)/.headers: $(SED) 's,^CROSS=.*,CROSS=$(TARGET_CROSS),g' $(WRKBUILD)/Rules.mak sed -e 's^KERNEL_HEADERS.*$$KERNEL_HEADERS=\"${TOOLCHAIN_SYSROOT}/usr/include\"' \ diff --git a/toolchain/uClibc/patches/always_inline.patch b/toolchain/uClibc/patches/always_inline.patch deleted file mode 100644 index 88b5209e9..000000000 --- a/toolchain/uClibc/patches/always_inline.patch +++ /dev/null @@ -1,360 +0,0 @@ -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/arm/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/arm/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/arm/dl-sysdep.h 2008-09-25 10:35:20.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/arm/dl-sysdep.h 2009-06-18 16:37:16.000000000 +0200 -@@ -15,7 +15,7 @@ - GOT_BASE[1] = (unsigned long) MODULE; \ - } - --static __inline__ unsigned long arm_modulus(unsigned long m, unsigned long p) -+static __always_inline unsigned long arm_modulus(unsigned long m, unsigned long p) - { - unsigned long i,t,inc; - i=p; t=0; -@@ -72,7 +72,7 @@ - first element of the GOT. We used to use the PIC register to do this - without a constant pool reference, but GCC 4.2 will use a pseudo-register - for the PIC base, so it may not be in r10. */ --static __inline__ Elf32_Addr __attribute__ ((unused)) -+static __always_inline Elf32_Addr __attribute__ ((unused)) - elf_machine_dynamic (void) - { - Elf32_Addr dynamic; -@@ -104,7 +104,7 @@ - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr __attribute__ ((unused)) -+static __always_inline Elf32_Addr __attribute__ ((unused)) - elf_machine_load_address (void) - { - extern void __dl_start __asm__ ("_dl_start"); -@@ -128,7 +128,7 @@ - return pcrel_addr - got_addr; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/bfin/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/bfin/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/bfin/dl-sysdep.h 2008-07-23 13:23:36.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/bfin/dl-sysdep.h 2009-06-18 16:37:37.000000000 +0200 -@@ -213,7 +213,7 @@ - #endif - - #include <elf.h> --static __inline__ void -+static __always_inline void - elf_machine_relative (DL_LOADADDR_TYPE load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/cris/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/cris/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/cris/dl-sysdep.h 2008-07-23 13:19:00.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/cris/dl-sysdep.h 2009-06-18 16:37:42.000000000 +0200 -@@ -39,7 +39,7 @@ - || ((type) == R_CRIS_GLOB_DAT)) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_CRIS_COPY) * ELF_RTYPE_CLASS_COPY)) - --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_dynamic(void) - { - /* Don't just set this to an asm variable "r0" since that's not logical -@@ -61,7 +61,7 @@ - there's some other symbol we could use, that we don't *have* to force a - GOT entry for. */ - --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_load_address(void) - { - Elf32_Addr gotaddr_diff; -@@ -95,7 +95,7 @@ - return gotaddr_diff; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/i386/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/i386/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/i386/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/i386/dl-sysdep.h 2009-06-18 16:37:53.000000000 +0200 -@@ -42,8 +42,8 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ --static __inline__ Elf32_Addr elf_machine_dynamic (void) attribute_unused; --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr elf_machine_dynamic (void) attribute_unused; -+static __always_inline Elf32_Addr - elf_machine_dynamic (void) - { - register Elf32_Addr *got __asm__ ("%ebx"); -@@ -52,8 +52,8 @@ - - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr elf_machine_load_address (void) attribute_unused; --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr elf_machine_load_address (void) attribute_unused; -+static __always_inline Elf32_Addr - elf_machine_load_address (void) - { - /* It doesn't matter what variable this is, the reference never makes -@@ -66,7 +66,7 @@ - return addr; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/m68k/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/m68k/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/m68k/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/m68k/dl-sysdep.h 2009-06-18 16:37:58.000000000 +0200 -@@ -41,7 +41,7 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_dynamic (void) - { - register Elf32_Addr *got __asm__ ("%a5"); -@@ -50,7 +50,7 @@ - - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_load_address (void) - { - Elf32_Addr addr; -@@ -60,7 +60,7 @@ - return addr; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h 2009-06-18 16:38:03.000000000 +0200 -@@ -163,7 +163,7 @@ - - #define OFFSET_GP_GOT 0x7ff0 - --static __inline__ ElfW(Addr) * -+static __always_inline ElfW(Addr) * - elf_mips_got_from_gpreg (ElfW(Addr) gpreg) - { - /* FIXME: the offset of gp from GOT may be system-dependent. */ -@@ -173,7 +173,7 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. We assume its $gp points to the primary GOT. */ --static __inline__ ElfW(Addr) -+static __always_inline ElfW(Addr) - elf_machine_dynamic (void) - { - register ElfW(Addr) gp __asm__ ("$28"); -@@ -192,7 +192,7 @@ - #endif - - /* Return the run-time load address of the shared object. */ --static __inline__ ElfW(Addr) -+static __always_inline ElfW(Addr) - elf_machine_load_address (void) - { - ElfW(Addr) addr; -@@ -208,7 +208,7 @@ - return addr; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (ElfW(Addr) load_off, const ElfW(Addr) rel_addr, - ElfW(Word) relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/powerpc/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/powerpc/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/powerpc/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/powerpc/dl-sysdep.h 2009-06-18 16:38:09.000000000 +0200 -@@ -90,7 +90,7 @@ - #define ELF_MACHINE_PLTREL_OVERLAP 1 - - /* Return the value of the GOT pointer. */ --static __inline__ Elf32_Addr * __attribute__ ((const)) -+static __always_inline Elf32_Addr * __attribute__ ((const)) - ppc_got (void) - { - Elf32_Addr *got; -@@ -109,14 +109,14 @@ - - /* Return the link-time address of _DYNAMIC, stored as - the first value in the GOT. */ --static __inline__ Elf32_Addr __attribute__ ((const)) -+static __always_inline Elf32_Addr __attribute__ ((const)) - elf_machine_dynamic (void) - { - return *ppc_got(); - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr __attribute__ ((const)) -+static __always_inline Elf32_Addr __attribute__ ((const)) - elf_machine_load_address (void) - { - Elf32_Addr *branchaddr; -@@ -164,7 +164,7 @@ - return runtime_dynamic - elf_machine_dynamic (); - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sh/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sh/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/sh/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/sh/dl-sysdep.h 2009-06-18 16:38:18.000000000 +0200 -@@ -25,7 +25,7 @@ - struct elf_resolve; - extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); - --static __inline__ unsigned int -+static __always_inline unsigned int - _dl_urem(unsigned int n, unsigned int base) - { - int res; -@@ -100,7 +100,7 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ --static __inline__ Elf32_Addr __attribute__ ((unused)) -+static __always_inline Elf32_Addr __attribute__ ((unused)) - elf_machine_dynamic (void) - { - register Elf32_Addr *got; -@@ -109,7 +109,7 @@ - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr __attribute__ ((unused)) -+static __always_inline Elf32_Addr __attribute__ ((unused)) - elf_machine_load_address (void) - { - Elf32_Addr addr; -@@ -151,7 +151,7 @@ - } \ - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sh64/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sh64/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/sh64/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/sh64/dl-sysdep.h 2009-06-18 16:38:14.000000000 +0200 -@@ -42,7 +42,7 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ --static __inline__ Elf32_Addr elf_machine_dynamic(void) -+static __always_inline Elf32_Addr elf_machine_dynamic(void) - { - register Elf32_Addr *got; - -@@ -70,7 +70,7 @@ - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr elf_machine_load_address(void) -+static __always_inline Elf32_Addr elf_machine_load_address(void) - { - Elf32_Addr addr; - -@@ -123,7 +123,7 @@ - } \ - } - --static __inline__ void -+static __always_inline void - elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sparc/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sparc/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/sparc/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/sparc/dl-sysdep.h 2009-06-18 16:38:23.000000000 +0200 -@@ -49,7 +49,7 @@ - - #ifndef COMPILE_ASM - /* Cheap modulo implementation, taken from arm/ld_sysdep.h. */ --static __inline__ unsigned long -+static __always_inline unsigned long - sparc_mod(unsigned long m, unsigned long p) - { - unsigned long i, t, inc; -@@ -127,7 +127,7 @@ - /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_dynamic (void) - { - register Elf32_Addr *got __asm__ ("%l7"); -@@ -138,7 +138,7 @@ - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_load_address (void) - { - register Elf32_Addr *pc __asm__ ("%o7"), *got __asm__ ("%l7"); -@@ -157,7 +157,7 @@ - return (Elf32_Addr) got - *got + (pc[2] - pc[3]) * 4 - 4; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { -diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/xtensa/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/xtensa/dl-sysdep.h ---- uClibc-0.9.30.1.orig/ldso/ldso/xtensa/dl-sysdep.h 2008-07-23 13:19:00.000000000 +0200 -+++ uClibc-0.9.30.1/ldso/ldso/xtensa/dl-sysdep.h 2009-06-18 16:38:39.000000000 +0200 -@@ -87,7 +87,7 @@ - (((type) == R_XTENSA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) - - /* Return the link-time address of _DYNAMIC. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_dynamic (void) - { - /* This function is only used while bootstrapping the runtime linker. -@@ -97,7 +97,7 @@ - } - - /* Return the run-time load address of the shared object. */ --static __inline__ Elf32_Addr -+static __always_inline Elf32_Addr - elf_machine_load_address (void) - { - Elf32_Addr addr, tmp; -@@ -118,7 +118,7 @@ - return addr - 3; - } - --static __inline__ void -+static __always_inline void - elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) - { diff --git a/toolchain/uClibc/patches/extension-insteadof-inline.patch b/toolchain/uClibc/patches/extension-insteadof-inline.patch new file mode 100644 index 000000000..bd3a720e9 --- /dev/null +++ b/toolchain/uClibc/patches/extension-insteadof-inline.patch @@ -0,0 +1,77 @@ +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h 2009-06-21 19:08:44.487613137 +0200 +@@ -163,22 +163,25 @@ + + #define OFFSET_GP_GOT 0x7ff0 + +-static __inline__ ElfW(Addr) * +-elf_mips_got_from_gpreg (ElfW(Addr) gpreg) +-{ +- /* FIXME: the offset of gp from GOT may be system-dependent. */ +- return (ElfW(Addr) *) (gpreg - OFFSET_GP_GOT); +-} ++#define elf_mips_got_from_gpreg(gpreg) __extension__({ \ ++ ElfW(Addr) *elf_mips_got_from_gpreg_res; \ ++ \ ++ /* FIXME: the offset of gp from GOT may be system-dependent. */ \ ++ elf_mips_got_from_gpreg_res = gpreg - OFFSET_GP_GOT; \ ++ (elf_mips_got_from_gpreg_res); \ ++}) + + /* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. We assume its $gp points to the primary GOT. */ +-static __inline__ ElfW(Addr) +-elf_machine_dynamic (void) +-{ +- register ElfW(Addr) gp __asm__ ("$28"); +- return *elf_mips_got_from_gpreg (gp); +-} ++#define elf_machine_dynamic() __extension__({ \ ++ register ElfW(Addr) elf_machine_dynamic_gp __asm__("$28"); \ ++ ElfW(Addr) elf_machine_dynamic_res; \ ++ \ ++ elf_machine_dynamic_res = *elf_mips_got_from_gpreg( \ ++ elf_machine_dynamic_gp); \ ++ (elf_machine_dynamic_res); \ ++}) + + #define STRINGXP(X) __STRING(X) + #define STRINGXV(X) STRINGV_(X) +@@ -192,21 +195,20 @@ + #endif + + /* Return the run-time load address of the shared object. */ +-static __inline__ ElfW(Addr) +-elf_machine_load_address (void) +-{ +- ElfW(Addr) addr; +- __asm__ (" .set noreorder\n" +- " " STRINGXP (PTR_LA) " %0, 0f\n" +- " bltzal $0, 0f\n" +- " nop\n" +- "0: " STRINGXP (PTR_SUBU) " %0, $31, %0\n" +- " .set reorder\n" +- : "=r" (addr) +- : /* No inputs */ +- : "$31"); +- return addr; +-} ++#define elf_machine_load_address() __extension__({ \ ++ ElfW(Addr) elf_machine_load_address_addr; \ ++ \ ++ __asm__ (" .set noreorder\n" \ ++ " " STRINGXP (PTR_LA) " %0, 0f\n" \ ++ " bltzal $0, 0f\n" \ ++ " nop\n" \ ++ "0: " STRINGXP (PTR_SUBU) " %0, $31, %0\n" \ ++ " .set reorder\n" \ ++ : "=r" (elf_machine_load_address_addr) \ ++ : /* No inputs */ \ ++ : "$31"); \ ++ (elf_machine_load_address_addr); \ ++}) + + static __inline__ void + elf_machine_relative (ElfW(Addr) load_off, const ElfW(Addr) rel_addr, diff --git a/toolchain/uClibc/patches/nold64.patch b/toolchain/uClibc/patches/nold64.patch new file mode 100644 index 000000000..237cb9f4d --- /dev/null +++ b/toolchain/uClibc/patches/nold64.patch @@ -0,0 +1,17 @@ +diff -Nur uClibc-0.9.30.1.orig/Rules.mak uClibc-0.9.30.1/Rules.mak +--- uClibc-0.9.30.1.orig/Rules.mak 2009-03-02 22:10:04.000000000 +0100 ++++ uClibc-0.9.30.1/Rules.mak 2009-06-18 20:11:42.336906659 +0200 +@@ -97,12 +97,11 @@ + LIBC := libc + SHARED_MAJORNAME := $(LIBC).so.$(MAJOR_VERSION) + ifneq ($(findstring $(TARGET_ARCH) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64 ),) +-UCLIBC_LDSO_NAME := ld64-uClibc + ARCH_NATIVE_BIT := 64 + else +-UCLIBC_LDSO_NAME := ld-uClibc + ARCH_NATIVE_BIT := 32 + endif ++UCLIBC_LDSO_NAME := ld-uClibc + UCLIBC_LDSO := $(UCLIBC_LDSO_NAME).so.$(MAJOR_VERSION) + NONSHARED_LIBNAME := uclibc_nonshared.a + libc := $(top_builddir)lib/$(SHARED_MAJORNAME) diff --git a/toolchain/uClibc/patches/pagesize-fix.patch b/toolchain/uClibc/patches/pagesize-fix.patch new file mode 100644 index 000000000..789820638 --- /dev/null +++ b/toolchain/uClibc/patches/pagesize-fix.patch @@ -0,0 +1,276 @@ +diff -Nur uClibc-0.9.30.1.orig/ldso/include/ldso.h uClibc-0.9.30.1/ldso/include/ldso.h +--- uClibc-0.9.30.1.orig/ldso/include/ldso.h 2008-05-30 16:35:31.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/include/ldso.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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; +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/arm/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/arm/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/arm/dl-sysdep.h 2008-09-25 10:35:20.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/arm/dl-sysdep.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/avr32/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/avr32/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/avr32/dl-sysdep.h 2008-11-03 16:54:24.000000000 +0100 ++++ uClibc-0.9.30.1/ldso/ldso/avr32/dl-sysdep.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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) + +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/bfin/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/bfin/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/bfin/dl-sysdep.h 2008-07-23 13:23:36.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/bfin/dl-sysdep.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/cris/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/cris/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/cris/dl-sysdep.h 2008-07-23 13:19:00.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/cris/dl-sysdep.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/frv/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/frv/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/frv/dl-sysdep.h 2008-07-23 13:23:36.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/frv/dl-sysdep.h 2009-06-21 19:34:42.324963528 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/i386/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/i386/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/i386/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/i386/dl-sysdep.h 2009-06-21 19:34:42.328963480 +0200 +@@ -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. +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/m68k/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/m68k/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/m68k/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/m68k/dl-sysdep.h 2009-06-21 19:34:42.328963480 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/mips/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/mips/dl-sysdep.h 2009-06-22 20:51:04.324542339 +0200 +@@ -148,14 +148,9 @@ + + /* 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 OFFS_ALIGN (0x10000000000UL-_dl_pagesize) ++#endif ++/* O32 || N32 */ + + #define elf_machine_type_class(type) ELF_RTYPE_CLASS_PLT + /* MIPS does not have COPY relocs */ +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/powerpc/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/powerpc/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/powerpc/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/powerpc/dl-sysdep.h 2009-06-21 19:34:42.328963480 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sh/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sh/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/sh/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/sh/dl-sysdep.h 2009-06-21 19:34:42.328963480 +0200 +@@ -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. +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sh64/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sh64/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/sh64/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/sh64/dl-sysdep.h 2009-06-21 19:34:42.328963480 +0200 +@@ -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. +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/sparc/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/sparc/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/sparc/dl-sysdep.h 2008-09-15 18:36:11.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/sparc/dl-sysdep.h 2009-06-21 19:34:42.332963990 +0200 +@@ -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 +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/x86_64/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/x86_64/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/x86_64/dl-sysdep.h 2006-03-08 04:58:13.000000000 +0100 ++++ uClibc-0.9.30.1/ldso/ldso/x86_64/dl-sysdep.h 2009-06-21 19:34:42.332963990 +0200 +@@ -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. +diff -Nur uClibc-0.9.30.1.orig/ldso/ldso/xtensa/dl-sysdep.h uClibc-0.9.30.1/ldso/ldso/xtensa/dl-sysdep.h +--- uClibc-0.9.30.1.orig/ldso/ldso/xtensa/dl-sysdep.h 2008-07-23 13:19:00.000000000 +0200 ++++ uClibc-0.9.30.1/ldso/ldso/xtensa/dl-sysdep.h 2009-06-21 19:34:42.332963990 +0200 +@@ -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) \ +diff -Nur uClibc-0.9.30.1.orig/libc/sysdeps/linux/mips/bits/uClibc_page.h uClibc-0.9.30.1/libc/sysdeps/linux/mips/bits/uClibc_page.h +--- uClibc-0.9.30.1.orig/libc/sysdeps/linux/mips/bits/uClibc_page.h 2004-08-14 01:39:45.000000000 +0200 ++++ uClibc-0.9.30.1/libc/sysdeps/linux/mips/bits/uClibc_page.h 2009-06-22 21:04:53.505363149 +0200 +@@ -20,15 +20,17 @@ + #ifndef _UCLIBC_PAGE_H + #define _UCLIBC_PAGE_H + +-/* PAGE_SIZE of mips is sortof wierd, and depends on how the kernel +- * happens to have been configured. It might use 4KB, 16K or 64K +- * pages. To avoid using the current kernel configuration settings, +- * uClibc will simply use 4KB on mips and call it good. */ +-#if 0 +-#define PAGE_SHIFT 16 ++/* This approach sucks, one should really use sysconf(_SC_PAGESIZE) ++ * instead. The current mips64 kernel only seems to boot with a 16K ++ * page size on a Loongson 2f notebook, so we hardcode it to 16K on ++ * MIPS64 (matching the kernel developer's default) and 4K otherwise. ++ */ ++#ifdef __mips64 + #define PAGE_SHIFT 14 +-#endif ++#else + #define PAGE_SHIFT 12 ++#endif ++ + #define PAGE_SIZE (1UL << PAGE_SHIFT) + #define PAGE_MASK (~(PAGE_SIZE-1)) + |