1//===- ELFExecFileFormat.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 <llvm/Support/ELF.h> 10#include <mcld/LD/ELFExecFileFormat.h> 11#include <mcld/LD/LDFileFormat.h> 12#include <mcld/LD/LDSection.h> 13#include <mcld/MC/MCLinker.h> 14#include <mcld/Target/GNULDBackend.h> 15 16using namespace mcld; 17 18void ELFExecFileFormat::initObjectType(MCLinker& pLinker) 19{ 20 // FIXME: make sure ELF executable files has these sections. 21 f_pDynSymTab = &pLinker.getOrCreateOutputSectHdr(".dynsym", 22 LDFileFormat::NamePool, 23 llvm::ELF::SHT_DYNSYM, 24 llvm::ELF::SHF_ALLOC, 25 f_Backend.bitclass() / 8); 26 f_pDynStrTab = &pLinker.getOrCreateOutputSectHdr(".dynstr", 27 LDFileFormat::NamePool, 28 llvm::ELF::SHT_STRTAB, 29 llvm::ELF::SHF_ALLOC, 30 0x1); 31 f_pInterp = &pLinker.getOrCreateOutputSectHdr(".interp", 32 LDFileFormat::Note, 33 llvm::ELF::SHT_PROGBITS, 34 llvm::ELF::SHF_ALLOC, 35 0x1); 36 f_pHashTab = &pLinker.getOrCreateOutputSectHdr(".hash", 37 LDFileFormat::NamePool, 38 llvm::ELF::SHT_HASH, 39 llvm::ELF::SHF_ALLOC, 40 f_Backend.bitclass() / 8); 41 f_pDynamic = &pLinker.getOrCreateOutputSectHdr(".dynamic", 42 LDFileFormat::NamePool, 43 llvm::ELF::SHT_DYNAMIC, 44 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 45 f_Backend.bitclass() / 8); 46 f_pRelaDyn = &pLinker.getOrCreateOutputSectHdr(".rela.dyn", 47 LDFileFormat::Relocation, 48 llvm::ELF::SHT_RELA, 49 llvm::ELF::SHF_ALLOC, 50 f_Backend.bitclass() / 8); 51 f_pRelaPlt = &pLinker.getOrCreateOutputSectHdr(".rela.plt", 52 LDFileFormat::Relocation, 53 llvm::ELF::SHT_RELA, 54 llvm::ELF::SHF_ALLOC, 55 f_Backend.bitclass() / 8); 56 f_pRelDyn = &pLinker.getOrCreateOutputSectHdr(".rel.dyn", 57 LDFileFormat::Relocation, 58 llvm::ELF::SHT_REL, 59 llvm::ELF::SHF_ALLOC, 60 f_Backend.bitclass() / 8); 61 f_pRelPlt = &pLinker.getOrCreateOutputSectHdr(".rel.plt", 62 LDFileFormat::Relocation, 63 llvm::ELF::SHT_REL, 64 llvm::ELF::SHF_ALLOC, 65 f_Backend.bitclass() / 8); 66 f_pGOT = &pLinker.getOrCreateOutputSectHdr(".got", 67 LDFileFormat::Target, 68 llvm::ELF::SHT_PROGBITS, 69 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 70 f_Backend.bitclass() / 8); 71 f_pPLT = &pLinker.getOrCreateOutputSectHdr(".plt", 72 LDFileFormat::Target, 73 llvm::ELF::SHT_PROGBITS, 74 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR, 75 f_Backend.bitclass() / 8); 76 f_pGOTPLT = &pLinker.getOrCreateOutputSectHdr(".got.plt", 77 LDFileFormat::Target, 78 llvm::ELF::SHT_PROGBITS, 79 llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 80 f_Backend.bitclass() / 8); 81 f_pEhFrameHdr = &pLinker.getOrCreateOutputSectHdr(".eh_frame_hdr", 82 LDFileFormat::EhFrameHdr, 83 llvm::ELF::SHT_PROGBITS, 84 llvm::ELF::SHF_ALLOC, 85 0x4); 86} 87