ELF32 problem in mips64 kernel
There is a faulty check in include/asm-mips64/elf.h:
in elf_check_arch, the following access to the "e_flags" field is non-sensical if the binary is ELFCLASS32, because "__h" is typed as an elf64_hdr (through the elfhdr #define), whose e_flags is in a different location from an elf32_hdr.
if ((__h->e_ident[EI_CLASS] == ELFCLASS32) && \
((__h->e_flags & EF_MIPS_ABI2) == 0)) \
__res = 0; \Should the n32 check (is this what the EF_MIPS_ABI2 check is about?) be punted to another binary format handler? The attached patch removed the ABI2 check.
Kip
Index: include/asm-mips64/elf.h
===================================================================
RCS file: /cvs/linux/include/asm-mips64/elf.h,v
retrieving revision 1.10.2.2
asm-mips64/elf.h +3 -3
@@ -43,8 +43,7 @@ \if (__h->e_machine !=EM_MIPS ) \ __res =0 ; \ -if ((__h->e_ident[EI_CLASS ] ==ELFCLASS32 ) && \ - ((__h->e_flags &EF_MIPS_ABI2 ) ==0 )) \ +if (__h->e_ident[EI_CLASS ] ==ELFCLASS32 ) \ __res =0 ; \ \ __res; \
@@ -53,7 +52,8 @@/* * These are used to set parameters in the core dumps. */ -#define ELF_CLASS ELFCLASS64 +//#define ELF_CLASS ELFCLASS64 +#define ELF_CLASS ELFCLASS32#ifdef __MIPSEB__#define ELF_DATA ELFDATA2MSB#elif __MIPSEL__
OK, so I didn't mean to include the debugging garbage in that patch :-)
Take 2.
Kip
Index: include/asm-mips64/elf.h
===================================================================
RCS file: /cvs/linux/include/asm-mips64/elf.h,v
retrieving revision 1.10.2.2
asm-mips64/elf.h +1 -2
@@ -43,8 +43,7 @@ \if (__h->e_machine !=EM_MIPS ) \ __res =0 ; \ -if ((__h->e_ident[EI_CLASS ] ==ELFCLASS32 ) && \ - ((__h->e_flags &EF_MIPS_ABI2 ) ==0 )) \ +if (__h->e_ident[EI_CLASS ] ==ELFCLASS32 ) \ __res =0 ; \ \ __res; \
Quoted 4 lines · Kip Walker
in
elf_check_arch, the following access to the "e_flags" field is non-sensical if the binary is ELFCLASS32, because "__h" is typed as anelf64_hdr(through the elfhdr #define), whosee_flagsis in a different location from anelf32_hdr.
Thanks for pointing it out.
Quoted 7 lines
if ((__h->e_ident[EI_CLASS] == ELFCLASS32) && \ ((__h->e_flags & EF_MIPS_ABI2) == 0)) \ __res = 0; \Should the n32 check (is this what the
EF_MIPS_ABI2check is about?) be punted to another binary format handler? The attached patch removed the ABI2 check.
Since the layout of the ELF32 header much differs from the ELF64 one it
doesn't really make sense to handle both formats together. The change looks OK.
Signature · 3 lines
+ Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: [email protected], PGP key available +