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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFFileFormat.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectBuilder.h>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ELF.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoELFFileFormat::ELFFileFormat()
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : f_pNULLSection(NULL),
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGOT(NULL),
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pPLT(NULL),
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pRelDyn(NULL),
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pRelPlt(NULL),
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pRelaDyn(NULL),
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pRelaPlt(NULL),
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pComment(NULL),
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pData1(NULL),
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDebug(NULL),
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDynamic(NULL),
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDynStrTab(NULL),
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDynSymTab(NULL),
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pFini(NULL),
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pFiniArray(NULL),
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pHashTab(NULL),
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pInit(NULL),
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pInitArray(NULL),
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pInterp(NULL),
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pLine(NULL),
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pNote(NULL),
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pPreInitArray(NULL),
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pROData1(NULL),
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pShStrTab(NULL),
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pStrTab(NULL),
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pSymTab(NULL),
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pTBSS(NULL),
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pTData(NULL),
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pCtors(NULL),
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDataRelRo(NULL),
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pDtors(NULL),
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pEhFrame(NULL),
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pEhFrameHdr(NULL),
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGCCExceptTable(NULL),
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGNUVersion(NULL),
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGNUVersionD(NULL),
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGNUVersionR(NULL),
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pGOTPLT(NULL),
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pJCR(NULL),
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pNoteABITag(NULL),
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    f_pStab(NULL),
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    f_pStabStr(NULL),
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    f_pStack(NULL),
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    f_pStackNote(NULL),
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    f_pDataRelRoLocal(NULL),
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    f_pGNUHashTab(NULL) {
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ELFFileFormat::initStdSections(ObjectBuilder& pBuilder, unsigned int pBitClass)
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pTextSection     = pBuilder.CreateSection(".text",
70a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::TEXT,
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pNULLSection     = pBuilder.CreateSection("",
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Null,
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_NULL,
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0);
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pReadOnlySection = pBuilder.CreateSection(".rodata",
79a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::TEXT,
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pBSSSection      = pBuilder.CreateSection(".bss",
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::BSS,
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_NOBITS,
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pComment         = pBuilder.CreateSection(".comment",
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::MetaData,
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pDataSection     = pBuilder.CreateSection(".data",
95a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pData1           = pBuilder.CreateSection(".data1",
100a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pDebug           = pBuilder.CreateSection(".debug",
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Debug,
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pInit            = pBuilder.CreateSection(".init",
110a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::TEXT,
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pInitArray       = pBuilder.CreateSection(".init_array",
115a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_INIT_ARRAY,
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pFini            = pBuilder.CreateSection(".fini",
120a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::TEXT,
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pFiniArray       = pBuilder.CreateSection(".fini_array",
125a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_FINI_ARRAY,
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pLine            = pBuilder.CreateSection(".line",
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Debug,
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pPreInitArray    = pBuilder.CreateSection(".preinit_array",
135a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PREINIT_ARRAY,
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // the definition of SHF_XXX attributes of rodata in Linux Standard Base
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // conflicts with System V standard. We follow System V standard.
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pROData1         = pBuilder.CreateSection(".rodata1",
142a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::TEXT,
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pShStrTab        = pBuilder.CreateSection(".shstrtab",
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::NamePool,
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_STRTAB,
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
151551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // In ELF Spec Book I, p1-16. If symbol table and string table are in
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // loadable segments, set the attribute to SHF_ALLOC bit. But in the
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // real world, this bit always turn off.
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pSymTab          = pBuilder.CreateSection(".symtab",
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::NamePool,
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_SYMTAB,
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              pBitClass / 8);
159d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pStrTab          = pBuilder.CreateSection(".strtab",
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::NamePool,
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_STRTAB,
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pTBSS            = pBuilder.CreateSection(".tbss",
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::BSS,
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_NOBITS,
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC |
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_WRITE |
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_TLS,
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pTData           = pBuilder.CreateSection(".tdata",
173a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC |
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_WRITE |
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_TLS,
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24.
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pCtors           = pBuilder.CreateSection(".ctors",
182a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pDataRelRo       = pBuilder.CreateSection(".data.rel.ro",
187a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pDtors           = pBuilder.CreateSection(".dtors",
192a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pEhFrame         = pBuilder.CreateSection(".eh_frame",
197affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                              LDFileFormat::EhFrame,
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
200affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                              0x4);
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pGCCExceptTable  = pBuilder.CreateSection(".gcc_except_table",
202affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                              LDFileFormat::GCCExceptTable,
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                              0x4);
20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pGNUVersion      = pBuilder.CreateSection(".gnu.version",
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Version,
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_GNU_versym,
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pGNUVersionD     = pBuilder.CreateSection(".gnu.version_d",
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Version,
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_GNU_verdef,
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pGNUVersionR     = pBuilder.CreateSection(".gnu.version_r",
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Version,
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_GNU_verneed,
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC,
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pJCR             = pBuilder.CreateSection(".jcr",
222a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pStab            = pBuilder.CreateSection(".stab",
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Debug,
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pStabStr         = pBuilder.CreateSection(".stabstr",
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              LDFileFormat::Debug,
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              llvm::ELF::SHT_STRTAB,
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x0,
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                              0x1);
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pStackNote       = pBuilder.CreateSection(".note.GNU-stack",
23722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              LDFileFormat::StackNote,
23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              0x0,
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              0x1);
24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @ref GCC convention, see http://www.airs.com/blog/archives/189
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  f_pDataRelRoLocal  = pBuilder.CreateSection(".data.rel.ro.local",
244a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines                                              LDFileFormat::DATA,
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              llvm::ELF::SHT_PROGBITS,
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              0x1);
24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// Initialize format dependent sections. (sections for executable and shared
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// objects)
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  initObjectFormat(pBuilder, pBitClass);
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
253