• Rich Felker's avatar
    fs/binfmt_elf_fdpic.c: provide NOMMU loader for regular ELF binaries · 1bde925d
    Rich Felker authored
    The ELF binary loader in binfmt_elf.c requires an MMU, making it
    impossible to use regular ELF binaries on NOMMU archs.  However, the FDPIC
    ELF loader in binfmt_elf_fdpic.c is fully capable as a loader for plain
    ELF, which requires constant displacements between LOAD segments, since it
    already supports FDPIC ELF files flagged as needing constant displacement.
    
    This patch adjusts the FDPIC ELF loader to accept non-FDPIC ELF files on
    NOMMU archs.  They are treated identically to FDPIC ELF files with the
    constant-displacement flag bit set, except for personality, which must
    match the ABI of the program being loaded; the PER_LINUX_FDPIC personality
    controls how the kernel interprets function pointers passed to sigaction.
    
    Files that do not set a stack size requirement explicitly are given a
    default stack size (matching the amount of committed stack the normal ELF
    loader for MMU archs would give them) rather than being rejected; this is
    necessary because plain ELF files generally do not declare stack
    requirements in theit program headers.
    
    Only ET_DYN (PIE) format ELF files are supported, since loading at a fixed
    virtual address is not possible on NOMMU.
    
    This patch was developed and tested on J2 (SH2-compatible) but should
    be usable immediately on all archs where binfmt_elf_fdpic is
    available. Moreover, by providing dummy definitions of the
    elf_check_fdpic() and elf_check_const_displacement() macros for archs
    which lack an FDPIC ABI, it should be possible to enable building of
    binfmt_elf_fdpic on all other NOMMU archs and thereby give them ELF
    binary support, but I have not yet tested this.
    
    The motivation for using binfmt_elf_fdpic.c rather than adapting
    binfmt_elf.c to NOMMU is that the former already has all the necessary
    code to work properly on NOMMU and has already received widespread
    real-world use and testing. I hope this is not controversial.
    
    I'm not really happy with having to unset the FDPIC_FUNCPTRS
    personality bit when loading non-FDPIC ELF. This bit should really
    reset automatically on execve, since otherwise, executing non-ELF
    binaries (e.g. bFLT) from an FDPIC process will leave the personality
    in the wrong state and severely break signal handling. But that's a
    separate, existing bug and I don't know the right place to fix it.
    Signed-off-by: default avatarRich Felker <dalias@libc.org>
    Acked-by: default avatarGreg Ungerer <gerg@uclinux.org>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Matt Mackall <mpm@selenic.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Oleg Endo <oleg.endo@t-online.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1bde925d
binfmt_elf_fdpic.c 47.5 KB