Le 16/07/2025 à 21:24, ~wojtekka a écrit :
From: Wojtek Kaniewski <wojte...@toxygen.net>

bFLT format is big-endian. get_user_ual() returns host value so for
little-endian target and little-endian host it's necessary to reverse
words using ntohl(). For big-endian targets we end up with incorrect
endianess:

     $ qemu-m68k-static ./test
     BINFMT_FLAT: reloc outside program 0x801f0000 (0 - 0x41f0/0x1e40)
     Aborted (core dumped)

For comparison the output of `flthdr` follows:

     $ m68k-elf-flthdr -P ./test
     ./test
         Magic:        bFLT
         Rev:          4
         Build Date:   Tue Jul 15 23:02:00 2025
         Entry:        0x44
         Data Start:   0x1e80
         Data End:     0x205c
         BSS End:      0x40a0
         Stack Size:   0x1000
         Reloc Start:  0x205c
         Reloc Count:  0x17
         Flags:        0x2 ( Has-PIC-GOT )
         Relocs:
         #      reloc      (  address ) data
         0      0x00001f80 (0x00001f80) 3c200000
                   ^^^^^^^^
         1      0x00001f84 (0x00001f84) 3c300000
         2      0x00001f88 (0x00001f88) 3c200000
         ...

Signed-off-by: Wojtek Kaniewski <wojte...@toxygen.net>
---
  linux-user/flatload.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/linux-user/flatload.c b/linux-user/flatload.c
index 4beb3ed1b9..afaff4ac44 100644
--- a/linux-user/flatload.c
+++ b/linux-user/flatload.c
@@ -413,7 +413,9 @@ static int load_flat_file(struct linux_binprm * bprm,
                 relocated first).  */
              if (get_user_ual(relval, reloc + i * sizeof(abi_ulong)))
                  return -EFAULT;
+#if !TARGET_BIG_ENDIAN
              relval = ntohl(relval);
+#endif
              if (flat_set_persistent(relval, &persistent))
                  continue;
              addr = flat_get_relocate_addr(relval);

I think the ntohl() should be removed totally and flat_set_persistent() should use put_user_ual().

Could you test this?

Thanks,
Laurent


Reply via email to