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 /llvm/tools/llvm-objcopy | |
| 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
Diffstat (limited to 'llvm/tools/llvm-objcopy')
| -rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.cpp | 8 | ||||
| -rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.h | 2 |
2 files changed, 8 insertions, 2 deletions
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; |

