diff options
author | George Rimar <grimar@accesssoftek.com> | 2018-12-20 10:51:42 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2018-12-20 10:51:42 +0000 |
commit | 4ded77334e152360ef23e62722e82cccc70493fb (patch) | |
tree | a00b7b01f9761dbb78087dddf4dbdd7c7acb5039 | |
parent | 6367d7a6d15c1114942a8ec7b130de04a8d5daf9 (diff) | |
download | bcm5719-llvm-4ded77334e152360ef23e62722e82cccc70493fb.tar.gz bcm5719-llvm-4ded77334e152360ef23e62722e82cccc70493fb.zip |
[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
-rw-r--r-- | llvm/test/tools/llvm-objcopy/ELF/copy-osabi.test | 16 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.h | 2 |
3 files changed, 24 insertions, 2 deletions
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 00000000000..67dcfaa5faf --- /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 ae02966b730..dab0b9fcea8 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 <class ELFT> void BinaryELFBuilder<ELFT>::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 <class ELFT> void ELFBuilder<ELFT>::readSectionHeaders() { template <class ELFT> void ELFBuilder<ELFT>::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 <class ELFT> void ELFWriter<ELFT>::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 4b840651106..4b606c4ae54 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; |