From: George Rimar Date: Thu, 20 Dec 2018 10:51:42 +0000 (+0000) Subject: [llvm-objcopy] - Do not drop the OS/ABI and ABIVersion fields of ELF header X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1224b482b42971cb6377730e967241476f4ce448;p=llvm [llvm-objcopy] - Do not drop the OS/ABI and ABIVersion fields of ELF header This is https://bugs.llvm.org/show_bug.cgi?id=40005, Patch teaches llvm-objcopy to preserve OS/ABI and ABIVersion fields of ELF header. (Currently, it drops them to zero). Differential revision: https://reviews.llvm.org/D55886 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349738 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objcopy/ELF/copy-osabi.test b/test/tools/llvm-objcopy/ELF/copy-osabi.test new file mode 100644 index 00000000000..67dcfaa5faf --- /dev/null +++ b/test/tools/llvm-objcopy/ELF/copy-osabi.test @@ -0,0 +1,16 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers %t2 | FileCheck %s + +## Check that llvm-objcopy preserves the OSABI and ABIVersion fields. +# CHECK: OS/ABI: FreeBSD (0x9) +# CHECK: ABIVersion: 1 + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + ABIVersion: 1 + Type: ET_REL + Machine: EM_AARCH64 diff --git a/tools/llvm-objcopy/ELF/Object.cpp b/tools/llvm-objcopy/ELF/Object.cpp index ae02966b730..dab0b9fcea8 100644 --- a/tools/llvm-objcopy/ELF/Object.cpp +++ b/tools/llvm-objcopy/ELF/Object.cpp @@ -703,6 +703,8 @@ static bool compareSegmentsByPAddr(const Segment *A, const Segment *B) { template void BinaryELFBuilder::initFileHeader() { Obj->Flags = 0x0; Obj->Type = ET_REL; + Obj->OSABI = 0; + Obj->ABIVersion = 0; Obj->Entry = 0x0; Obj->Machine = EMachine; Obj->Version = 1; @@ -1086,6 +1088,8 @@ template void ELFBuilder::readSectionHeaders() { template void ELFBuilder::build() { const auto &Ehdr = *ElfFile.getHeader(); + Obj.OSABI = Ehdr.e_ident[EI_OSABI]; + Obj.ABIVersion = Ehdr.e_ident[EI_ABIVERSION]; Obj.Type = Ehdr.e_type; Obj.Machine = Ehdr.e_machine; Obj.Version = Ehdr.e_version; @@ -1162,8 +1166,8 @@ template void ELFWriter::writeEhdr() { Ehdr.e_ident[EI_DATA] = ELFT::TargetEndianness == support::big ? ELFDATA2MSB : ELFDATA2LSB; Ehdr.e_ident[EI_VERSION] = EV_CURRENT; - Ehdr.e_ident[EI_OSABI] = ELFOSABI_NONE; - Ehdr.e_ident[EI_ABIVERSION] = 0; + Ehdr.e_ident[EI_OSABI] = Obj.OSABI; + Ehdr.e_ident[EI_ABIVERSION] = Obj.ABIVersion; Ehdr.e_type = Obj.Type; Ehdr.e_machine = Obj.Machine; diff --git a/tools/llvm-objcopy/ELF/Object.h b/tools/llvm-objcopy/ELF/Object.h index 4b840651106..4b606c4ae54 100644 --- a/tools/llvm-objcopy/ELF/Object.h +++ b/tools/llvm-objcopy/ELF/Object.h @@ -733,6 +733,8 @@ public: Segment ElfHdrSegment; Segment ProgramHdrSegment; + uint8_t OSABI; + uint8_t ABIVersion; uint64_t Entry; uint64_t SHOffset; uint32_t Type;