Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Christoph Hellwig and committed by
Greg Ungerer
34b4664a 3f8b76a6

+22 -22
+22 -22
include/linux/flat.h
··· 24 24 */ 25 25 26 26 struct flat_hdr { 27 - char magic[4]; 28 - unsigned long rev; /* version (as above) */ 29 - unsigned long entry; /* Offset of first executable instruction 30 - with text segment from beginning of file */ 31 - unsigned long data_start; /* Offset of data segment from beginning of 32 - file */ 33 - unsigned long data_end; /* Offset of end of data segment 34 - from beginning of file */ 35 - unsigned long bss_end; /* Offset of end of bss segment from beginning 36 - of file */ 27 + char magic[4]; 28 + __be32 rev; /* version (as above) */ 29 + __be32 entry; /* Offset of first executable instruction 30 + with text segment from beginning of file */ 31 + __be32 data_start; /* Offset of data segment from beginning of 32 + file */ 33 + __be32 data_end; /* Offset of end of data segment from beginning 34 + of file */ 35 + __be32 bss_end; /* Offset of end of bss segment from beginning 36 + of file */ 37 37 38 38 /* (It is assumed that data_end through bss_end forms the bss segment.) */ 39 39 40 - unsigned long stack_size; /* Size of stack, in bytes */ 41 - unsigned long reloc_start; /* Offset of relocation records from 42 - beginning of file */ 43 - unsigned long reloc_count; /* Number of relocation records */ 44 - unsigned long flags; 45 - unsigned long build_date; /* When the program/library was built */ 46 - unsigned long filler[5]; /* Reservered, set to zero */ 40 + __be32 stack_size; /* Size of stack, in bytes */ 41 + __be32 reloc_start; /* Offset of relocation records from beginning of 42 + file */ 43 + __be32 reloc_count; /* Number of relocation records */ 44 + __be32 flags; 45 + __be32 build_date; /* When the program/library was built */ 46 + __u32 filler[5]; /* Reservered, set to zero */ 47 47 }; 48 48 49 49 #define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ ··· 67 67 #define OLD_FLAT_RELOC_TYPE_BSS 2 68 68 69 69 typedef union { 70 - unsigned long value; 70 + u32 value; 71 71 struct { 72 72 #if defined(__LITTLE_ENDIAN_BITFIELD) || \ 73 73 (defined(mc68000) && !defined(CONFIG_COLDFIRE)) 74 - signed long offset : 30; 75 - unsigned long type : 2; 74 + s32 offset : 30; 75 + u32 type : 2; 76 76 # elif defined(__BIG_ENDIAN_BITFIELD) 77 - unsigned long type : 2; 78 - signed long offset : 30; 77 + u32 type : 2; 78 + s32 offset : 30; 79 79 # else 80 80 # error "Unknown bitfield order for flat files." 81 81 # endif