}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;
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
{
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 -
/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);
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;