summaryrefslogtreecommitdiff
path: root/lib/LD/ELFExecFileFormat.cpp
blob: 6a81f72261711903422fe0a095b4f466dd7f1a62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//===- ELFExecFileFormat.cpp ----------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/ELFExecFileFormat.h>
#include <mcld/LD/LDSection.h>
#include <mcld/Object/ObjectBuilder.h>

#include <llvm/Support/ELF.h>

using namespace mcld;

void ELFExecFileFormat::initObjectFormat(ObjectBuilder& pBuilder,
                                         unsigned int pBitClass)
{
  // FIXME: make sure ELF executable files has these sections.
  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);
}