On Mon, 2008-07-28 at 00:47 +0200, Stéphan Kochen wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Joakim Tjernlund schreef:
> > If you use -pie, you should also use -fPIC (gcc option). But why
> > use -pie? Just drop it if you don't have special reasons.
> 
> Excellent! Turns out bluez-utils, bluez-libs and dbus all have some
> magic in their autoconf setup for additional PIE support. Getting rid of
> it fixed the issues, and they now execute!
> 
> Many thanks for the help!
> - -- Stéphan

Good, however you should have made it to the REL24 reloc before
crashing. Would you mind trying the below patch with the old
dbus-daemon(built with -pie) to see if takes you to the
REL24 reloc?

 Jocke

>From 249f6028ea36580388deb1f963d71e77665e29a8 Mon Sep 17 00:00:00 2001
From: Joakim Tjernlund <[EMAIL PROTECTED]>
Date: Mon, 28 Jul 2008 17:11:17 +0200
Subject: [PATCH] Add check for STB_LOCAL.

Needed for "strange" relocs like R_PPC_ADDR16_HA,
R_PPC_ADDR16_HI and R_PPC_ADDR16_LO.
---
 ldso/ldso/powerpc/elfinterp.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/ldso/ldso/powerpc/elfinterp.c b/ldso/ldso/powerpc/elfinterp.c
index eeb3250..66decca 100644
--- a/ldso/ldso/powerpc/elfinterp.c
+++ b/ldso/ldso/powerpc/elfinterp.c
@@ -195,24 +195,28 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf 
*scope,
        char *symname;
        Elf32_Addr *reloc_addr;
        Elf32_Addr finaladdr;
-
+       const Elf32_Sym *sym;
        unsigned long symbol_addr;
 #if defined (__SUPPORT_LD_DEBUG__)
        unsigned long old_val;
 #endif
        reloc_addr   = (Elf32_Addr *)(intptr_t) (tpnt->loadaddr + (unsigned 
long) rpnt->r_offset);
        reloc_type   = ELF32_R_TYPE(rpnt->r_info);
-       symbol_addr  = tpnt->loadaddr; /* For R_PPC_RELATIVE */
+       symbol_addr  = tpnt->loadaddr; /* For R_PPC_RELATIVE and STB_LOCAL */ 
        symtab_index = ELF32_R_SYM(rpnt->r_info);
-       symname      = strtab + symtab[symtab_index].st_name;
-       if (symtab_index) {
+       sym          = &symtab[symtab_index];
+       symname      = strtab + sym->st_name;
+       /* binutils on ppc32 includes st_value in r_addend for relocations
+          against local symbols.  */
+       if (symtab_index && !(ELF32_ST_BIND (sym->st_info) == STB_LOCAL
+                             && sym->st_shndx != SHN_UNDEF)) {
                symbol_addr = (unsigned long) _dl_find_hash(symname, scope, 
tpnt,
                                                            
elf_machine_type_class(reloc_type));
                /* We want to allow undefined references to weak symbols - this 
might
                 * have been intentional.  We should not be linking local 
symbols
                 * here, so all bases should be covered.
                 */
-               if (unlikely(!symbol_addr && 
ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
+               if (unlikely(!symbol_addr && ELF32_ST_BIND(sym->st_info) != 
STB_WEAK))
                        return 1;
        }
 #if defined (__SUPPORT_LD_DEBUG__)
@@ -272,7 +276,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf 
*scope,
        case R_PPC_ADDR16_HI:
                finaladdr >>= 16; /* fall through. */
        case R_PPC_ADDR16_LO:
-               *(short *)reloc_addr = finaladdr;
+               *(Elf32_Half *)reloc_addr = finaladdr;
                break;
        case R_PPC_REL24:
 #if 0
-- 
1.5.6.3


_______________________________________________
uClibc mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to