15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFFileFormat.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/ELFFileFormat.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GNULDBackend.h"
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ELF.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoELFFileFormat::ELFFileFormat()
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : f_pNULLSection(NULL),
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGOT(NULL),
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pPLT(NULL),
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pRelDyn(NULL),
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pRelPlt(NULL),
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pRelaDyn(NULL),
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pRelaPlt(NULL),
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pComment(NULL),
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pData1(NULL),
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDebug(NULL),
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDynamic(NULL),
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDynStrTab(NULL),
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDynSymTab(NULL),
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pFini(NULL),
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pFiniArray(NULL),
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pHashTab(NULL),
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pInit(NULL),
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pInitArray(NULL),
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pInterp(NULL),
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pLine(NULL),
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pNote(NULL),
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pPreInitArray(NULL),
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pROData1(NULL),
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pShStrTab(NULL),
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pStrTab(NULL),
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pSymTab(NULL),
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pTBSS(NULL),
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pTData(NULL),
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pCtors(NULL),
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDataRelRo(NULL),
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDtors(NULL),
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pEhFrame(NULL),
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pEhFrameHdr(NULL),
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGCCExceptTable(NULL),
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGNUVersion(NULL),
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGNUVersionD(NULL),
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGNUVersionR(NULL),
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGOTPLT(NULL),
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pJCR(NULL),
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pNoteABITag(NULL),
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pStab(NULL),
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pStabStr(NULL),
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pStack(NULL),
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pStackNote(NULL),
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pDataRelRoLocal(NULL),
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      f_pGNUHashTab(NULL) {
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ELFFileFormat::initStdSections(ObjectBuilder& pBuilder,
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    unsigned int pBitClass) {
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pTextSection =
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".text",
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::TEXT,
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pNULLSection =
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection("", LDFileFormat::Null, llvm::ELF::SHT_NULL, 0x0);
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pReadOnlySection = pBuilder.CreateSection(".rodata",
770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                              LDFileFormat::TEXT,
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pBSSSection =
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".bss",
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::BSS,
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_NOBITS,
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pComment = pBuilder.CreateSection(
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".comment", LDFileFormat::MetaData, llvm::ELF::SHT_PROGBITS, 0x0, 0x1);
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDataSection =
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".data",
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pData1 = pBuilder.CreateSection(".data1",
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    LDFileFormat::DATA,
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHT_PROGBITS,
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    0x1);
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDebug = pBuilder.CreateSection(
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".debug", LDFileFormat::Debug, llvm::ELF::SHT_PROGBITS, 0x0, 0x1);
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pInit =
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".init",
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::TEXT,
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pInitArray =
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".init_array",
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_INIT_ARRAY,
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pFini =
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".fini",
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::TEXT,
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pFiniArray =
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".fini_array",
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_FINI_ARRAY,
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pLine = pBuilder.CreateSection(
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".line", LDFileFormat::Debug, llvm::ELF::SHT_PROGBITS, 0x0, 0x1);
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pPreInitArray =
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".preinit_array",
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PREINIT_ARRAY,
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // the definition of SHF_XXX attributes of rodata in Linux Standard Base
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // conflicts with System V standard. We follow System V standard.
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pROData1 = pBuilder.CreateSection(".rodata1",
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      LDFileFormat::TEXT,
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHT_PROGBITS,
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHF_ALLOC,
14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      0x1);
14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pShStrTab = pBuilder.CreateSection(
14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".shstrtab", LDFileFormat::NamePool, llvm::ELF::SHT_STRTAB, 0x0, 0x1);
144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // In ELF Spec Book I, p1-16. If symbol table and string table are in
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // loadable segments, set the attribute to SHF_ALLOC bit. But in the
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // real world, this bit always turn off.
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pSymTab = pBuilder.CreateSection(".symtab",
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     LDFileFormat::NamePool,
14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     llvm::ELF::SHT_SYMTAB,
15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     0x0,
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     pBitClass / 8);
152d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pStrTab = pBuilder.CreateSection(
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".strtab", LDFileFormat::NamePool, llvm::ELF::SHT_STRTAB, 0x0, 0x1);
15537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pTBSS = pBuilder.CreateSection(
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".tbss",
15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDFileFormat::BSS,
15837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::ELF::SHT_NOBITS,
15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | llvm::ELF::SHF_TLS,
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x1);
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pTData = pBuilder.CreateSection(
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".tdata",
16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDFileFormat::DATA,
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::ELF::SHT_PROGBITS,
16537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | llvm::ELF::SHF_TLS,
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x1);
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24.
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pCtors = pBuilder.CreateSection(".ctors",
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    LDFileFormat::DATA,
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHT_PROGBITS,
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    0x1);
17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDataRelRo =
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".data.rel.ro",
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
17737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDtors = pBuilder.CreateSection(".dtors",
18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    LDFileFormat::DATA,
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHT_PROGBITS,
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    0x1);
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pEhFrame = pBuilder.CreateSection(".eh_frame",
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      LDFileFormat::EhFrame,
18737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHT_PROGBITS,
18837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      llvm::ELF::SHF_ALLOC,
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                      0x4);
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGCCExceptTable = pBuilder.CreateSection(".gcc_except_table",
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             LDFileFormat::GCCExceptTable,
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             llvm::ELF::SHT_PROGBITS,
19337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             llvm::ELF::SHF_ALLOC,
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             0x4);
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGNUVersion = pBuilder.CreateSection(".gnu.version",
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         LDFileFormat::Version,
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHT_GNU_versym,
19837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         llvm::ELF::SHF_ALLOC,
19937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         0x1);
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGNUVersionD = pBuilder.CreateSection(".gnu.version_d",
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          LDFileFormat::Version,
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          llvm::ELF::SHT_GNU_verdef,
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          llvm::ELF::SHF_ALLOC,
20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          0x1);
20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pGNUVersionR = pBuilder.CreateSection(".gnu.version_r",
20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          LDFileFormat::Version,
20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          llvm::ELF::SHT_GNU_verneed,
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          llvm::ELF::SHF_ALLOC,
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          0x1);
21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pJCR = pBuilder.CreateSection(".jcr",
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  LDFileFormat::DATA,
21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  llvm::ELF::SHT_PROGBITS,
21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  0x1);
21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pStab = pBuilder.CreateSection(
21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".stab", LDFileFormat::Debug, llvm::ELF::SHT_PROGBITS, 0x0, 0x1);
21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pStabStr = pBuilder.CreateSection(
21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ".stabstr", LDFileFormat::Debug, llvm::ELF::SHT_STRTAB, 0x0, 0x1);
21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pStackNote = pBuilder.CreateSection(".note.GNU-stack",
22037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        LDFileFormat::StackNote,
22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        llvm::ELF::SHT_PROGBITS,
22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        0x0,
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        0x1);
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @ref GCC convention, see http://www.airs.com/blog/archives/189
22637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  f_pDataRelRoLocal =
22737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pBuilder.CreateSection(".data.rel.ro.local",
22837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             LDFileFormat::DATA,
22937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHT_PROGBITS,
23037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             0x1);
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// Initialize format dependent sections. (sections for executable and shared
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// objects)
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  initObjectFormat(pBuilder, pBitClass);
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
23737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
238