From ecb41b75cdbc4d66c3b31bde94583c2797b8fa1d Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 12 Jan 2010 17:59:15 -0800 Subject: uclibc-nptl: Fix booting problems on mips nptl. * This patch fixes the fundamental problems in getting a bootable system based on uclibc nptl for mips. Patch is submitted upstream. Signed-off-by: Khem Raj --- .../uclibc_fix_mips_tls_relocation_and_crt.patch | 127 +++++++++++++++++++++ recipes/uclibc/uclibc_nptl.bb | 1 + 2 files changed, 128 insertions(+) create mode 100644 recipes/uclibc/uclibc-nptl/uclibc_fix_mips_tls_relocation_and_crt.patch (limited to 'recipes/uclibc') diff --git a/recipes/uclibc/uclibc-nptl/uclibc_fix_mips_tls_relocation_and_crt.patch b/recipes/uclibc/uclibc-nptl/uclibc_fix_mips_tls_relocation_and_crt.patch new file mode 100644 index 0000000000..b964da7512 --- /dev/null +++ b/recipes/uclibc/uclibc-nptl/uclibc_fix_mips_tls_relocation_and_crt.patch @@ -0,0 +1,127 @@ +Index: git/ldso/ldso/mips/elfinterp.c +=================================================================== +--- git.orig/ldso/ldso/mips/elfinterp.c 2010-01-12 12:11:37.268037011 -0800 ++++ git/ldso/ldso/mips/elfinterp.c 2010-01-12 12:11:56.132037599 -0800 +@@ -148,7 +148,7 @@ int _dl_parse_relocation_information(str + unsigned long rel_addr, unsigned long rel_size) + { + ElfW(Sym) *symtab; +- ElfW(Rel) *rpnt; ++ ELF_RELOC *rpnt; + char *strtab; + unsigned long i; + unsigned long *got; +@@ -162,7 +162,7 @@ int _dl_parse_relocation_information(str + + /* Now parse the relocation information */ + rel_size = rel_size / sizeof(ElfW(Rel)); +- rpnt = (ElfW(Rel) *) rel_addr; ++ rpnt = (ELF_RELOC *) rel_addr; + + symtab = (ElfW(Sym) *) tpnt->dynamic_info[DT_SYMTAB]; + strtab = (char *) tpnt->dynamic_info[DT_STRTAB]; +@@ -172,8 +172,8 @@ int _dl_parse_relocation_information(str + char *symname = NULL; + reloc_addr = (unsigned long *) (tpnt->loadaddr + + (unsigned long) rpnt->r_offset); +- reloc_type = ELF_R_TYPE(rpnt->r_info); +- symtab_index = ELF_R_SYM(rpnt->r_info); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); + symbol_addr = 0; + + debug_sym(symtab,strtab,symtab_index); +@@ -206,12 +206,20 @@ int _dl_parse_relocation_information(str + # endif + { + ElfW(Sym) *sym_tls = &symtab[symtab_index]; +- struct elf_resolve *tpnt_tls = tpnt; ++ struct elf_resolve *tpnt_tls = NULL; + + if (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_LOCAL) { + _dl_find_hash((strtab + symtab[symtab_index].st_name), +- _dl_symbol_tables, tpnt_tls, 1, &sym_tls); ++ _dl_symbol_tables, tpnt, ++ elf_machine_type_class(reloc_type), &tpnt_tls); + } ++#if USE_TLS ++ /* In case of a TLS reloc, tpnt_tls NULL means we have an 'anonymous' ++ symbol. This is the case for a static tls variable, so the lookup ++ module is just that one is referencing the tls variable. */ ++ if (!tpnt_tls) ++ tpnt_tls = tpnt; ++#endif + + switch (reloc_type) { + case R_MIPS_TLS_DTPMOD64: +Index: git/libc/sysdeps/linux/mips/crt1.S +=================================================================== +--- git.orig/libc/sysdeps/linux/mips/crt1.S 2010-01-12 12:11:37.328038307 -0800 ++++ git/libc/sysdeps/linux/mips/crt1.S 2010-01-12 12:11:45.720038162 -0800 +@@ -85,29 +85,10 @@ + + __start: + #ifdef __PIC__ +-#if _MIPS_SIM == _MIPS_SIM_ABI32 +- .frame sp, 24, sp +- .set noreorder +- move $0, $31 /* Save old ra. */ +- bal 10f /* Find addr of cpload. */ +- nop +-10: +- .cpload $31 +- move $31, $0 +- .set reorder +- .cprestore 16 +-#else +- move $0, $31; /* Save old ra. */ +- .set noreorder +- bal 10f /* Find addr of .cpsetup. */ +- nop +-10: +- .set reorder +- .cpsetup $31, $25, 10b +- move $31, $0 +-#endif ++ SETUP_GPX($0) ++ SETUP_GPX64($25,$0) + #else +- la $28, _gp /* Setup GP correctly if we're non-PIC. */ ++ PTR_LA $28, _gp /* Setup GP correctly if we're non-PIC. */ + move $31, $0 + #endif + +@@ -118,18 +99,18 @@ __start: + /* Allocate space on the stack for seven arguments and + * make sure the stack is aligned to double words (8 bytes) */ + ++ and $29, -2 * SZREG ++ + #if _MIPS_SIM == _MIPS_SIM_ABI32 +- and $29, -2 * 4 +- subu $29, 32 +- la $7, _init /* init */ +- la $8, _fini +- sw $8, 16($29) /* fini */ +- sw $2, 20($29) /* rtld_fini */ +- sw $29, 24($29) /* stack_end */ +-#else +- and $29, -2 * PTRSIZE ++ PTR_SUBIU $29, 32 ++#endif + PTR_LA $7, _init /* init */ +- PTR_LA $8, _fini /* fini */ ++ PTR_LA $8, _fini ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++ PTR_S $8, 16($29) /* fini */ ++ PTR_S $2, 20($29) /* rtld_fini */ ++ PTR_S $29, 24($29) /* stack_end */ ++#else + move $9, $2 /* rtld_fini */ + move $10, $29 /* stack_end */ + #endif +@@ -148,4 +129,3 @@ __data_start: + .weak data_start + data_start = __data_start + +- diff --git a/recipes/uclibc/uclibc_nptl.bb b/recipes/uclibc/uclibc_nptl.bb index 4510a987d9..428c6f62c3 100644 --- a/recipes/uclibc/uclibc_nptl.bb +++ b/recipes/uclibc/uclibc_nptl.bb @@ -35,6 +35,7 @@ SRC_URI = "git://uclibc.org/uClibc.git;protocol=git;branch=nptl \ file://ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch;patch=1 \ file://uclibc_arm_remove_duplicate_sysdep_defs.patch;patch=1 \ file://installfix.patch;patch=1 \ + file://uclibc_fix_mips_tls_relocation_and_crt.patch;patch=1 \ " S = "${WORKDIR}/git" -- cgit 1.2.3-korg