RISC-V NOMMU flat binaries cannot tolerate a gap between the text and data section as the toolchain fully resolves at compile time the PC relative global pointer (__global_pointer$ value loaded in the gp register). Without a relocation entry provided, the flat bin loader cannot fix the value if a gap is introduced and user executables fail to run.
This series fixes this problem by allowing an architecture to request the flat loader to suppress the offset of the data start section. Combined with the use of elf2flt "-r" option to mark the flat executables with the FLAT_FLAG_RAM flag, the text and data sections are loaded contiguously in memory, without a change in their relative position from compile time. The first patch fixes binfmt_flat flat_load_file() using the new configuration option CONFIG_BINFMT_FLAT_NO_DATA_START_OFFSET. The second patch enables this new option for RISCV NOMMU builds. These patches do not change the binfmt_flat loader behavior for other architectures. Changes from v3: * Renamed the configuration option from CONFIG_BINFMT_FLAT_NO_TEXT_DATA_GAP to CONFIG_BINFMT_FLAT_NO_DATA_START_OFFSET to clarify that only the offseting of the data section start is suppressed. * Do not force loding to RAM (contiguously) if the flat binary does not have the FLAT_FLAG_RAM flag set. * Updated commit messages to reflect above changes. Changes from v2: * Updated distribution list * Added Palmer ack-by tag Changes from v1: * Replace FLAT_TEXT_DATA_NO_GAP macro with CONFIG_BINFMT_FLAT_NO_TEXT_DATA_GAP config option (patch 1). * Remove the addition of riscv/include/asm/flat.h and set CONFIG_BINFMT_FLAT_NO_TEXT_DATA_GAP for RISCV and !MMU Damien Le Moal (2): binfmt_flat: allow not offsetting data start riscv: Disable data start offset in flat binaries arch/riscv/Kconfig | 1 + fs/Kconfig.binfmt | 3 +++ fs/binfmt_flat.c | 19 ++++++++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) -- 2.30.2