From 4ded77334e152360ef23e62722e82cccc70493fb Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 20 Dec 2018 10:51:42 +0000 Subject: [PATCH] [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 llvm-svn: 349738 --- llvm/test/tools/llvm-objcopy/ELF/copy-osabi.test | 16 ++++++++++++++++ llvm/tools/llvm-objcopy/ELF/Object.cpp | 8 ++++++-- llvm/tools/llvm-objcopy/ELF/Object.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/ELF/copy-osabi.test diff --git a/llvm/test/tools/llvm-objcopy/ELF/copy-osabi.test b/llvm/test/tools/llvm-objcopy/ELF/copy-osabi.test new file mode 100644 index 0000000..67dcfaa --- /dev/null +++ b/llvm/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/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp index ae02966..dab0b9f 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/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/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/tools/llvm-objcopy/ELF/Object.h index 4b84065..4b606c4 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.h +++ b/llvm/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; -- 2.7.4