void SVMELFProgramWriter::writeELFHeader(const MCAssembler &Asm, const MCAsmLayout &Layout)
{
    // Debug-only section headers
    unsigned SHNum = ELFDebug ? 1 + Asm.getSectionList().size() : 0;
    unsigned Strtab = ELFDebug ? EMB.getShstrtabIndex() : 0;
    SHOffset = ELFDebug ?
               RoundUpToAlignment(ML.getSectionDiskOffset(SPS_END), 4) : 0;

    Write8(0x7f);                                   // e_ident
    Write8('E');
    Write8('L');
    Write8('F');
    Write8(ELF::ELFCLASS32);
    Write8(ELF::ELFDATA2LSB);
    Write8(ELF::EV_CURRENT);
    Write8(ELF::ELFOSABI_NONE);
    Write8(0);                                      // ABI Version
    WriteZeros(ELF::EI_NIDENT - ELF::EI_PAD);

    Write16(ELF::ET_EXEC);                          // e_type
    Write16(ELF::EM_ARM);                           // e_machine
    Write32(ELF::EV_CURRENT);                       // e_version
    Write32(ML.getEntryAddress(Asm, Layout));       // e_entry
    Write32(SVMELF::PHOffset);                      // e_phoff
    Write32(SHOffset);                              // e_shoff
    Write32(0);                                     // e_flags
    Write16(sizeof(ELF::Elf32_Ehdr));               // e_ehsize
    Write16(sizeof(ELF::Elf32_Phdr));               // e_phentsize
    Write16(SVMELF::PHNum);                         // e_phnum
    Write16(sizeof(ELF::Elf32_Shdr));               // e_shentsize
    Write16(SHNum);                                 // e_shnum
    Write16(Strtab);                                // e_shstrndx
}