1 //===- ELFDynObjFileFormat.cpp --------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include <mcld/LD/ELFDynObjFileFormat.h> 10 #include <mcld/LD/LDFileFormat.h> 11 #include <mcld/LD/LDSection.h> 12 #include <mcld/MC/MCLinker.h> 13 #include <llvm/Support/ELF.h> 14 #include <mcld/Target/GNULDBackend.h> 15 16 using namespace mcld; 17 18 void ELFDynObjFileFormat::initObjectType(MCLinker& pLinker) 19 { 20 f_pDynSymTab = &pLinker.getOrCreateOutputSectHdr(".dynsym", 21 LDFileFormat::NamePool, 22 llvm::ELF::SHT_DYNSYM, 23 llvm::ELF::SHF_ALLOC, 24 f_Backend.bitclass() / 8); 25 f_pDynStrTab = &pLinker.getOrCreateOutputSectHdr(".dynstr", 26 LDFileFormat::NamePool, 27 llvm::ELF::SHT_STRTAB, 28 llvm::ELF::SHF_ALLOC, 29 0x1); 30 f_pInterp = &pLinker.getOrCreateOutputSectHdr(".interp", 31 LDFileFormat::Note, 32 llvm::ELF::SHT_PROGBITS, 33 llvm::ELF::SHF_ALLOC, 34 0x1); 35 f_pHashTab = &pLinker.getOrCreateOutputSectHdr(".hash", 36 LDFileFormat::NamePool, 37 llvm::ELF::SHT_HASH, 38 llvm::ELF::SHF_ALLOC, 39 f_Backend.bitclass() / 8); 40 f_pDynamic = &pLinker.getOrCreateOutputSectHdr(".dynamic", 41 LDFileFormat::NamePool, 42 llvm::ELF::SHT_DYNAMIC, 43 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 44 f_Backend.bitclass() / 8); 45 f_pRelaDyn = &pLinker.getOrCreateOutputSectHdr(".rela.dyn", 46 LDFileFormat::Relocation, 47 llvm::ELF::SHT_RELA, 48 llvm::ELF::SHF_ALLOC, 49 f_Backend.bitclass() / 8); 50 f_pRelaPlt = &pLinker.getOrCreateOutputSectHdr(".rela.plt", 51 LDFileFormat::Relocation, 52 llvm::ELF::SHT_RELA, 53 llvm::ELF::SHF_ALLOC, 54 f_Backend.bitclass() / 8); 55 f_pRelDyn = &pLinker.getOrCreateOutputSectHdr(".rel.dyn", 56 LDFileFormat::Relocation, 57 llvm::ELF::SHT_REL, 58 llvm::ELF::SHF_ALLOC, 59 f_Backend.bitclass() / 8); 60 f_pRelPlt = &pLinker.getOrCreateOutputSectHdr(".rel.plt", 61 LDFileFormat::Relocation, 62 llvm::ELF::SHT_REL, 63 llvm::ELF::SHF_ALLOC, 64 f_Backend.bitclass() / 8); 65 f_pGOT = &pLinker.getOrCreateOutputSectHdr(".got", 66 LDFileFormat::Target, 67 llvm::ELF::SHT_PROGBITS, 68 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 69 f_Backend.bitclass() / 8); 70 f_pPLT = &pLinker.getOrCreateOutputSectHdr(".plt", 71 LDFileFormat::Target, 72 llvm::ELF::SHT_PROGBITS, 73 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR, 74 f_Backend.bitclass() / 8); 75 f_pGOTPLT = &pLinker.getOrCreateOutputSectHdr(".got.plt", 76 LDFileFormat::Target, 77 llvm::ELF::SHT_PROGBITS, 78 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 79 f_Backend.bitclass() / 8); 80 } 81 82