فهرست منبع

A powerpc patch from Ronald Wahl:

    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
Eric Andersen 23 سال پیش
والد
کامیت
2302879d9b
1فایلهای تغییر یافته به همراه1 افزوده شده و 1 حذف شده
  1. 1 1
      ldso/ldso/powerpc/elfinterp.c

+ 1 - 1
ldso/ldso/powerpc/elfinterp.c

@@ -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);