diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index a393b2d8..4e0d0bef 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -99,11 +99,15 @@ int PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const { const unsigned char * const buf = ehdr->e_ident; + unsigned osabi0 = buf[Elf32_Ehdr::EI_OSABI]; + if (0==osabi0) { + osabi0 = opt->o_unix.osabi0; + } if (0!=memcmp(buf, "\x7f\x45\x4c\x46", 4) // "\177ELF" || buf[Elf64_Ehdr::EI_CLASS]!=ei_class || buf[Elf64_Ehdr::EI_DATA] !=ei_data - || buf[Elf64_Ehdr::EI_OSABI] !=ei_osabi + || osabi0!=ei_osabi ) { return -1; } @@ -572,7 +576,6 @@ PackLinuxElf32x86::buildLoader(const Filter *ft) { unsigned char tmp[sizeof(linux_i386elf_fold)]; memcpy(tmp, linux_i386elf_fold, sizeof(linux_i386elf_fold)); - ((Elf32_Ehdr *)tmp)->e_ident[Elf32_Ehdr::EI_OSABI] = ei_osabi; checkPatch(NULL, 0, 0, 0); // reset if (opt->o_unix.is_ptinterp) { unsigned j; @@ -601,8 +604,6 @@ PackBSDElf32x86::buildLoader(const Filter *ft) { unsigned char tmp[sizeof(bsd_i386elf_fold)]; memcpy(tmp, bsd_i386elf_fold, sizeof(bsd_i386elf_fold)); - ((Elf32_Ehdr *)tmp)->e_ident[Elf32_Ehdr::EI_OSABI] = ei_osabi; - ((Elf32_Ehdr *)tmp)->e_ident[Elf32_Ehdr::EI_ABIVERSION] = 0; checkPatch(NULL, 0, 0, 0); // reset if (opt->o_unix.is_ptinterp) { unsigned j; @@ -988,6 +989,7 @@ PackLinuxElf64::generateElfHdr( cprElfHdr2 *const h2 = (cprElfHdr2 *)&elfout; cprElfHdr3 *const h3 = (cprElfHdr3 *)&elfout; memcpy(h3, proto, sizeof(*h3)); // reads beyond, but OK + h3->ehdr.e_ident[Elf32_Ehdr::EI_OSABI] = ei_osabi; assert(get_native32(&h2->ehdr.e_phoff) == sizeof(Elf64_Ehdr)); h2->ehdr.e_shoff = 0;