OSDN Git Service

A powerpc patch from Ronald Wahl:
authorEric Andersen <andersen@codepoet.org>
Tue, 12 Nov 2002 20:09:29 +0000 (20:09 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 12 Nov 2002 20:09:29 +0000 (20:09 -0000)
    Ok, now i got it after a day of work.

    I have had a look into glibc and found the following:

    sysdeps/powerpc/dl-machine.c:
    ...
case R_PPC_JMP_SLOT:
  /* It used to be that elf_machine_fixup_plt was used here,
     but that doesn't work when ld.so relocates itself
     for the second time.  On the bright side, there's
     no need to worry about thread-safety here.  */
  {
    Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr;
    ...

    The comment made me suspicious. The same position in uClibc looks like this:

    ldso/ldso/powerpc/elfinterp.c:
    ...
    case R_PPC_JMP_SLOT:
{
unsigned long targ_addr = (unsigned long)_dl_linux_resolve;
int delta = targ_addr - (unsigned long)reloc_addr;
    ...

    When I change it to the following it works:
    ...
    case R_PPC_JMP_SLOT:
{
unsigned long targ_addr = *reloc_addr;
int delta = targ_addr - (unsigned long)reloc_addr;
    ...

    I hope it will not break anything. Can anyone review this change and
    commit it into CVS?

    thanks,
    ron

ldso/ldso/powerpc/elfinterp.c

index adf95d6..4919a2f 100644 (file)
@@ -403,7 +403,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
                        break;
                case R_PPC_JMP_SLOT:
                        {
-                       unsigned long targ_addr = (unsigned long)_dl_linux_resolve;
+                       unsigned long targ_addr = (unsigned long)*reloc_addr;
                        int delta = targ_addr - (unsigned long)reloc_addr;
                        if(delta<<6>>6 == delta){
                                *reloc_addr = OPCODE_B(delta);