• Andrew Morton's avatar
    [PATCH] Fix binfmt_elf.c bug on ppc64 · 324a7156
    Andrew Morton authored
    From: Jakub Jelinek <jakub@redhat.com>
    
    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).
    324a7156
binfmt_elf.c 38.6 KB