diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp --- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp @@ -505,12 +505,17 @@ if (Error E = Obj.removeSections(ELFConfig.AllowBrokenLinks, RemovePred)) return E; + const ElfType OutputElfType = + getOutputElfType(Config.OutputArch.value_or(MachineInfo())); + const bool Is64Bit = + OutputElfType == ELFT_ELF64LE || OutputElfType == ELFT_ELF64BE; if (Config.CompressionType != DebugCompressionType::None) { if (Error Err = replaceDebugSections( Obj, isCompressable, - [&Config, &Obj](const SectionBase *S) -> Expected { + [&Config, &Obj, + Is64Bit](const SectionBase *S) -> Expected { return &Obj.addSection( - CompressedSection(*S, Config.CompressionType)); + CompressedSection(*S, Config.CompressionType, Is64Bit)); })) return Err; } else if (Config.DecompressDebugSections) { diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.h b/llvm/lib/ObjCopy/ELF/ELFObject.h --- a/llvm/lib/ObjCopy/ELF/ELFObject.h +++ b/llvm/lib/ObjCopy/ELF/ELFObject.h @@ -537,6 +537,7 @@ MAKE_SEC_WRITER_FRIEND uint32_t ChType = 0; + bool Is64Bits; DebugCompressionType CompressionType; uint64_t DecompressedSize; uint64_t DecompressedAlign; @@ -544,9 +545,10 @@ public: CompressedSection(const SectionBase &Sec, - DebugCompressionType CompressionType); + DebugCompressionType CompressionType, bool Is64Bits); CompressedSection(ArrayRef CompressedData, uint32_t ChType, - uint64_t DecompressedSize, uint64_t DecompressedAlign); + uint64_t DecompressedSize, uint64_t DecompressedAlign, + bool Is64Bits); uint64_t getDecompressedSize() const { return DecompressedSize; } uint64_t getDecompressedAlign() const { return DecompressedAlign; } diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp --- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp @@ -527,26 +527,28 @@ } CompressedSection::CompressedSection(const SectionBase &Sec, - DebugCompressionType CompressionType) - : SectionBase(Sec), CompressionType(CompressionType), + DebugCompressionType CompressionType, + bool Is64Bits) + : SectionBase(Sec), Is64Bits(Is64Bits), CompressionType(CompressionType), DecompressedSize(Sec.OriginalData.size()), DecompressedAlign(Sec.Align) { compression::compress(compression::Params(CompressionType), OriginalData, CompressedData); Flags |= ELF::SHF_COMPRESSED; size_t ChdrSize = - std::max(std::max(sizeof(object::Elf_Chdr_Impl), - sizeof(object::Elf_Chdr_Impl)), - std::max(sizeof(object::Elf_Chdr_Impl), - sizeof(object::Elf_Chdr_Impl))); + Is64Bits ? std::max(sizeof(object::Elf_Chdr_Impl), + sizeof(object::Elf_Chdr_Impl)) + : std::max(sizeof(object::Elf_Chdr_Impl), + sizeof(object::Elf_Chdr_Impl)); Size = ChdrSize + CompressedData.size(); Align = 8; } CompressedSection::CompressedSection(ArrayRef CompressedData, uint32_t ChType, uint64_t DecompressedSize, - uint64_t DecompressedAlign) - : ChType(ChType), CompressionType(DebugCompressionType::None), + uint64_t DecompressedAlign, bool Is64Bits) + : ChType(ChType), Is64Bits(Is64Bits), + CompressionType(DebugCompressionType::None), DecompressedSize(DecompressedSize), DecompressedAlign(DecompressedAlign) { OriginalData = CompressedData; } @@ -1724,8 +1726,9 @@ if (!(Shdr.sh_flags & ELF::SHF_COMPRESSED)) return Obj.addSection
(*Data); auto *Chdr = reinterpret_cast *>(Data->data()); - return Obj.addSection(CompressedSection( - *Data, Chdr->ch_type, Chdr->ch_size, Chdr->ch_addralign)); + return Obj.addSection( + CompressedSection(*Data, Chdr->ch_type, Chdr->ch_size, + Chdr->ch_addralign, ELFT::Is64Bits)); } } }