Index: llvm/trunk/test/tools/llvm-objcopy/ELF/copy-osabi.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/ELF/copy-osabi.test +++ llvm/trunk/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 Index: llvm/trunk/tools/llvm-objcopy/ELF/Object.h =================================================================== --- llvm/trunk/tools/llvm-objcopy/ELF/Object.h +++ llvm/trunk/tools/llvm-objcopy/ELF/Object.h @@ -733,6 +733,8 @@ Segment ElfHdrSegment; Segment ProgramHdrSegment; + uint8_t OSABI; + uint8_t ABIVersion; uint64_t Entry; uint64_t SHOffset; uint32_t Type; Index: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp +++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp @@ -703,6 +703,8 @@ 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::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 @@ 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;