15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFExecFileFormat.cpp ----------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFExecFileFormat.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h"
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ELF.h>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ELFExecFileFormat::initObjectFormat(ObjectBuilder& pBuilder,
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         unsigned int pBitClass) {
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // FIXME: make sure ELF executable files has these sections.
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDynSymTab = pBuilder.CreateSection(".dynsym",
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        LDFileFormat::NamePool,
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        llvm::ELF::SHT_DYNSYM,
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        llvm::ELF::SHF_ALLOC,
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        pBitClass / 8);
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDynStrTab = pBuilder.CreateSection(".dynstr",
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        LDFileFormat::NamePool,
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        llvm::ELF::SHT_STRTAB,
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        llvm::ELF::SHF_ALLOC,
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        0x1);
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pInterp = pBuilder.CreateSection(".interp",
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     LDFileFormat::Note,
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHT_PROGBITS,
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHF_ALLOC,
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     0x1);
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pHashTab = pBuilder.CreateSection(".hash",
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      LDFileFormat::NamePool,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHT_HASH,
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHF_ALLOC,
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      pBitClass / 8);
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDynamic =
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".dynamic",
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::NamePool,
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_DYNAMIC,
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             pBitClass / 8);
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pRelaDyn = pBuilder.CreateSection(".rela.dyn",
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      LDFileFormat::Relocation,
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHT_RELA,
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHF_ALLOC,
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      pBitClass / 8);
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pRelaPlt = pBuilder.CreateSection(".rela.plt",
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      LDFileFormat::Relocation,
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHT_RELA,
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHF_ALLOC,
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      pBitClass / 8);
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pRelDyn = pBuilder.CreateSection(".rel.dyn",
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     LDFileFormat::Relocation,
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHT_REL,
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHF_ALLOC,
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     pBitClass / 8);
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pRelPlt = pBuilder.CreateSection(".rel.plt",
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     LDFileFormat::Relocation,
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHT_REL,
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHF_ALLOC,
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     pBitClass / 8);
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGOT = pBuilder.CreateSection(".got",
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  LDFileFormat::Target,
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  llvm::ELF::SHT_PROGBITS,
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  pBitClass / 8);
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pPLT =
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".plt",
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::Target,
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             pBitClass / 8);
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGOTPLT =
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".got.plt",
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::Target,
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             pBitClass / 8);
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pEhFrameHdr = pBuilder.CreateSection(".eh_frame_hdr",
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         LDFileFormat::EhFrameHdr,
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHT_PROGBITS,
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHF_ALLOC,
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         0x4);
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGNUHashTab = pBuilder.CreateSection(".gnu.hash",
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         LDFileFormat::NamePool,
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHT_GNU_HASH,
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHF_ALLOC,
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         pBitClass / 8);
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
96