//===- ELFDynObjFileFormat.cpp --------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <llvm/Support/ELF.h>
#include <mcld/LD/ELFDynObjFileFormat.h>
#include <mcld/LD/LDFileFormat.h>
#include <mcld/LD/LDSection.h>
#include <mcld/MC/MCLinker.h>
#include <mcld/Target/GNULDBackend.h>

using namespace mcld;

void ELFDynObjFileFormat::initObjectType(MCLinker& pLinker)
{
  f_pDynSymTab    = &pLinker.getOrCreateOutputSectHdr(".dynsym",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_DYNSYM,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pDynStrTab    = &pLinker.getOrCreateOutputSectHdr(".dynstr",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_STRTAB,
                                           llvm::ELF::SHF_ALLOC,
                                           0x1);
  f_pInterp       = &pLinker.getOrCreateOutputSectHdr(".interp",
                                           LDFileFormat::Note,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC,
                                           0x1);
  f_pHashTab      = &pLinker.getOrCreateOutputSectHdr(".hash",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_HASH,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pDynamic      = &pLinker.getOrCreateOutputSectHdr(".dynamic",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_DYNAMIC,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           f_Backend.bitclass() / 8);
  f_pRelaDyn      = &pLinker.getOrCreateOutputSectHdr(".rela.dyn",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_RELA,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pRelaPlt      = &pLinker.getOrCreateOutputSectHdr(".rela.plt",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_RELA,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pRelDyn      = &pLinker.getOrCreateOutputSectHdr(".rel.dyn",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_REL,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pRelPlt      = &pLinker.getOrCreateOutputSectHdr(".rel.plt",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_REL,
                                           llvm::ELF::SHF_ALLOC,
                                           f_Backend.bitclass() / 8);
  f_pGOT          = &pLinker.getOrCreateOutputSectHdr(".got",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           f_Backend.bitclass() / 8);
  f_pPLT          = &pLinker.getOrCreateOutputSectHdr(".plt",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
                                           f_Backend.bitclass() / 8);
  f_pGOTPLT       = &pLinker.getOrCreateOutputSectHdr(".got.plt",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           f_Backend.bitclass() / 8);
  f_pEhFrameHdr     = &pLinker.getOrCreateOutputSectHdr(".eh_frame_hdr",
                                              LDFileFormat::EhFrameHdr,
                                              llvm::ELF::SHT_PROGBITS,
                                              llvm::ELF::SHF_ALLOC,
                                              0x4);
}