[uClibc-cvs] uClibc/ldso/ldso/powerpc elfinterp.c,1.26,1.27
Erik Andersen
andersen at uclibc.org
Tue Nov 11 21:50:16 UTC 2003
Update of /var/cvs/uClibc/ldso/ldso/powerpc
In directory winder:/tmp/cvs-serv11285/powerpc
Modified Files:
elfinterp.c
Log Message:
Joakim Tjernlund writes:
Comparing glibc with uClibc makes me think that the delta calculations are
wrong here. Comparing some more I still think there are a
data_words[index] assignments missing. Here is a path that has both the
data_words[index] and the above delta calclations.
This also fixes a terribly obvious bug, also spotted by Joakim, which Erik
introduced when he copied things from the i386 ldso code.
With this patch applied, things now seem to be working perfectly!
Index: elfinterp.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/powerpc/elfinterp.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- elfinterp.c 11 Nov 2003 08:59:53 -0000 1.26
+++ elfinterp.c 11 Nov 2003 21:50:11 -0000 1.27
@@ -231,14 +231,14 @@
}else{
/* Warning: we don't handle double-sized PLT entries */
unsigned long plt_addr;
- unsigned long lbranch_addr;
unsigned long *ptr;
int index;
plt_addr = (unsigned long)tpnt->dynamic_info[DT_PLTGOT] +
(unsigned long)tpnt->loadaddr;
- lbranch_addr = plt_addr + PLT_LONGBRANCH_ENTRY_WORDS*4;
- delta = lbranch_addr - insn_addr;
+
+ delta = PLT_LONGBRANCH_ENTRY_WORDS*4 - (insn_addr-plt_addr+4);
+
index = (insn_addr - plt_addr - PLT_INITIAL_ENTRY_WORDS*4)/8;
ptr = (unsigned long *)tpnt->data_words;
@@ -426,7 +426,7 @@
if (symtab_index) {
symbol_addr = (unsigned long) _dl_find_hash(symname, scope,
- (reloc_type == R_386_JMP_SLOT ? tpnt : NULL), symbolrel);
+ (reloc_type == R_PPC_JMP_SLOT ? tpnt : NULL), symbolrel);
/*
* We want to allow undefined references to weak symbols - this might
@@ -495,10 +495,10 @@
{
int delta;
int index;
- unsigned long *plt;
+ unsigned long *plt, *ptr;
plt = (unsigned long *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr);
- delta = (unsigned long)(plt+PLT_TRAMPOLINE_ENTRY_WORDS+2)
+ delta = (unsigned long)(plt+PLT_LONGBRANCH_ENTRY_WORDS)
- (unsigned long)(reloc_addr+1);
index = ((unsigned long)reloc_addr -
@@ -506,6 +506,8 @@
/sizeof(unsigned long);
index /= 2;
//DPRINTF(" index %x delta %x\n",index,delta);
+ ptr = (unsigned long *)tpnt->data_words;
+ ptr[index] = targ_addr;
reloc_addr[0] = OPCODE_LI(11,index*4);
reloc_addr[1] = OPCODE_B(delta);
@@ -570,7 +572,7 @@
reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
reloc_type = ELF32_R_TYPE(rpnt->r_info);
- if (reloc_type != R_386_COPY)
+ if (reloc_type != R_PPC_COPY)
return 0;
symtab_index = ELF32_R_SYM(rpnt->r_info);
symbol_addr = 0;
More information about the uClibc-cvs
mailing list