From: Jakub Jelinek Any prelinked shared library is impossible to run on ppc64 without this patch, as they immediately segfault. Say: /bin/echo works even if /lib64/ld64.so.1 is prelinked while /lib64/ld64.so.1 /bin/echo segfaults. The problem is that ELF_PLAT_INIT is passed the virtual address of the shared library, not the difference between the virtual address of the shared library and p_vaddr of the first PT_LOAD segment in that library (while for the interpreter interp_load_address is the bias). ELF_PLAT_INIT sets gpr[2] to this absolute address, but arch/ppc64/kernel/process.c (start_thread) assumes it is a bias and adds it to entry and toc values loaded from the entry point descriptor. For non-prelinked shared libraries, first PT_LOAD segment's p_vaddr is typically 0 and thus load_addr == load_bias (which is why this bug has not been discovered that long). fs/binfmt_elf.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN fs/binfmt_elf.c~elf_plat_init-fix fs/binfmt_elf.c --- 25/fs/binfmt_elf.c~elf_plat_init-fix 2003-06-18 13:48:11.000000000 -0700 +++ 25-akpm/fs/binfmt_elf.c 2003-06-18 13:48:11.000000000 -0700 @@ -699,7 +699,7 @@ static int load_elf_binary(struct linux_ load_bias += error - ELF_PAGESTART(load_bias + vaddr); load_addr += load_bias; - reloc_func_desc = load_addr; + reloc_func_desc = load_bias; } } k = elf_ppnt->p_vaddr; _