//===- ELFDynObjFileFormat.cpp --------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/ELFDynObjFileFormat.h>
#include <mcld/LD/LDSection.h>
#include <mcld/Object/ObjectBuilder.h>

#include <llvm/Support/ELF.h>

using namespace mcld;

void ELFDynObjFileFormat::initObjectFormat(ObjectBuilder& pBuilder,
                                           unsigned int pBitClass)
{
  f_pDynSymTab    = pBuilder.CreateSection(".dynsym",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_DYNSYM,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pDynStrTab    = pBuilder.CreateSection(".dynstr",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_STRTAB,
                                           llvm::ELF::SHF_ALLOC,
                                           0x1);
  f_pInterp       = pBuilder.CreateSection(".interp",
                                           LDFileFormat::Note,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC,
                                           0x1);
  f_pHashTab      = pBuilder.CreateSection(".hash",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_HASH,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pDynamic      = pBuilder.CreateSection(".dynamic",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_DYNAMIC,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           pBitClass / 8);
  f_pRelaDyn      = pBuilder.CreateSection(".rela.dyn",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_RELA,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pRelaPlt      = pBuilder.CreateSection(".rela.plt",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_RELA,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pRelDyn       = pBuilder.CreateSection(".rel.dyn",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_REL,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pRelPlt       = pBuilder.CreateSection(".rel.plt",
                                           LDFileFormat::Relocation,
                                           llvm::ELF::SHT_REL,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
  f_pGOT          = pBuilder.CreateSection(".got",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           pBitClass / 8);
  f_pPLT          = pBuilder.CreateSection(".plt",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
                                           pBitClass / 8);
  f_pGOTPLT       = pBuilder.CreateSection(".got.plt",
                                           LDFileFormat::Target,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
                                           pBitClass / 8);
  f_pEhFrameHdr   = pBuilder.CreateSection(".eh_frame_hdr",
                                           LDFileFormat::EhFrameHdr,
                                           llvm::ELF::SHT_PROGBITS,
                                           llvm::ELF::SHF_ALLOC,
                                           0x4);
  f_pGNUHashTab   = pBuilder.CreateSection(".gnu.hash",
                                           LDFileFormat::NamePool,
                                           llvm::ELF::SHT_GNU_HASH,
                                           llvm::ELF::SHF_ALLOC,
                                           pBitClass / 8);
}