15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFExecFileFormat.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/ELFExecFileFormat.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h" 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ELF.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ELFExecFileFormat::initObjectFormat(ObjectBuilder& pBuilder, 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int pBitClass) { 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // FIXME: make sure ELF executable files has these sections. 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pDynSymTab = pBuilder.CreateSection(".dynsym", 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::NamePool, 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_DYNSYM, 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pDynStrTab = pBuilder.CreateSection(".dynstr", 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::NamePool, 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_STRTAB, 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x1); 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pInterp = pBuilder.CreateSection(".interp", 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Note, 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_PROGBITS, 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x1); 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pHashTab = pBuilder.CreateSection(".hash", 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::NamePool, 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_HASH, 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pDynamic = 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.CreateSection(".dynamic", 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::NamePool, 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_DYNAMIC, 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pRelaDyn = pBuilder.CreateSection(".rela.dyn", 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Relocation, 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_RELA, 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pRelaPlt = pBuilder.CreateSection(".rela.plt", 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Relocation, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_RELA, 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pRelDyn = pBuilder.CreateSection(".rel.dyn", 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Relocation, 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_REL, 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pRelPlt = pBuilder.CreateSection(".rel.plt", 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Relocation, 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_REL, 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pGOT = pBuilder.CreateSection(".got", 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Target, 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_PROGBITS, 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pPLT = 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.CreateSection(".plt", 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Target, 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_PROGBITS, 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR, 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pGOTPLT = 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.CreateSection(".got.plt", 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Target, 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_PROGBITS, 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pEhFrameHdr = pBuilder.CreateSection(".eh_frame_hdr", 8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::EhFrameHdr, 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_PROGBITS, 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x4); 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines f_pGNUHashTab = pBuilder.CreateSection(".gnu.hash", 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::NamePool, 9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHT_GNU_HASH, 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::ELF::SHF_ALLOC, 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBitClass / 8); 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 96