binfmt_flat: use fixed size type for the on-disk format

So far binfmt_flat has only been supported on 32-bit platforms, so the
variable size of the fields didn't matter.  But the upcoming RISC-V
nommu port supports 64-bit CPUs, and we now have a conflict between
the elf2flt creation tool that always uses 32-bit fields and the kernel
that uses (unsigned) long field.  Switch to the userspace view as the
rest of the binfmt_flat format is completely architecture neutral,
and binfmt_flat isn't the right binary format for huge executables to
start with.

While we're at it also ensure these fields are using __be types as
they big endian and are byte swapped when loaded.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
This commit is contained in:
Christoph Hellwig 2019-06-13 09:08:55 +02:00 committed by Greg Ungerer
parent 3f8b76a66e
commit 34b4664ac4

View File

@ -24,26 +24,26 @@
*/
struct flat_hdr {
char magic[4];
unsigned long rev; /* version (as above) */
unsigned long entry; /* Offset of first executable instruction
with text segment from beginning of file */
unsigned long data_start; /* Offset of data segment from beginning of
file */
unsigned long data_end; /* Offset of end of data segment
from beginning of file */
unsigned long bss_end; /* Offset of end of bss segment from beginning
of file */
char magic[4];
__be32 rev; /* version (as above) */
__be32 entry; /* Offset of first executable instruction
with text segment from beginning of file */
__be32 data_start; /* Offset of data segment from beginning of
file */
__be32 data_end; /* Offset of end of data segment from beginning
of file */
__be32 bss_end; /* Offset of end of bss segment from beginning
of file */
/* (It is assumed that data_end through bss_end forms the bss segment.) */
unsigned long stack_size; /* Size of stack, in bytes */
unsigned long reloc_start; /* Offset of relocation records from
beginning of file */
unsigned long reloc_count; /* Number of relocation records */
unsigned long flags;
unsigned long build_date; /* When the program/library was built */
unsigned long filler[5]; /* Reservered, set to zero */
__be32 stack_size; /* Size of stack, in bytes */
__be32 reloc_start; /* Offset of relocation records from beginning of
file */
__be32 reloc_count; /* Number of relocation records */
__be32 flags;
__be32 build_date; /* When the program/library was built */
__u32 filler[5]; /* Reservered, set to zero */
};
#define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */
@ -67,15 +67,15 @@ struct flat_hdr {
#define OLD_FLAT_RELOC_TYPE_BSS 2
typedef union {
unsigned long value;
u32 value;
struct {
#if defined(__LITTLE_ENDIAN_BITFIELD) || \
(defined(mc68000) && !defined(CONFIG_COLDFIRE))
signed long offset : 30;
unsigned long type : 2;
s32 offset : 30;
u32 type : 2;
# elif defined(__BIG_ENDIAN_BITFIELD)
unsigned long type : 2;
signed long offset : 30;
u32 type : 2;
s32 offset : 30;
# else
# error "Unknown bitfield order for flat files."
# endif