Index: llvm/lib/ObjectYAML/ELFEmitter.cpp =================================================================== --- llvm/lib/ObjectYAML/ELFEmitter.cpp +++ llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -318,6 +318,7 @@ void ELFState::initProgramHeaders(std::vector &PHeaders) { for (const auto &YamlPhdr : Doc.ProgramHeaders) { Elf_Phdr Phdr; + zero(Phdr); Phdr.p_type = YamlPhdr.Type; Phdr.p_flags = YamlPhdr.Flags; Phdr.p_vaddr = YamlPhdr.VAddr; @@ -759,16 +760,16 @@ reportError("sections in the program header with index " + Twine(PhdrIdx) + " are not sorted by their file offset"); - uint64_t PhdrFileOffset = Fragments.empty() ? 0 : Fragments.front().Offset; if (YamlPhdr.Offset) { - if (!Fragments.empty() && *YamlPhdr.Offset > PhdrFileOffset) + if (!Fragments.empty() && *YamlPhdr.Offset > Fragments.front().Offset) reportError("'Offset' for segment with index " + Twine(PhdrIdx) + " must be less than or equal to the minimum file offset of " "all included sections (0x" + - Twine::utohexstr(PhdrFileOffset) + ")"); - PhdrFileOffset = *YamlPhdr.Offset; + Twine::utohexstr(Fragments.front().Offset) + ")"); + PHeader.p_offset = *YamlPhdr.Offset; + } else if (!Fragments.empty()) { + PHeader.p_offset = Fragments.front().Offset; } - PHeader.p_offset = PhdrFileOffset; // Find the maximum offset of the end of a section in order to set p_filesz // and p_memsz. When setting p_filesz, trailing SHT_NOBITS sections are not