X86LDBackend.h revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- X86LDBackend.h -----------------------------------------------------===// 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#ifndef X86_LDBACKEND_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define X86_LDBACKEND_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86ELFDynamic.h" 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86GOT.h" 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "X86GOTPLT.h" 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86PLT.h" 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/OutputRelocSection.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass GNUInfo; 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// X86GNULDBackend - linker backend of X86 target of GNU ELF format 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass X86GNULDBackend : public GNULDBackend 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /** \enum ReservedEntryType 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief The reserved entry type of reserved space in ResolveInfo. 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * This is used for sacnRelocation to record what kinds of entries are 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * reserved for this resolved symbol 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * In X86, there are three kinds of entries, GOT, PLT, and dynamic reloction. 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * GOT may needs a corresponding relocation to relocate itself, so we 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * separate GOT to two situations: GOT and GOTRel. Besides, for the same 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * symbol, there might be two kinds of entries reserved for different location. 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * For example, reference to the same symbol, one may use GOT and the other may 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * use dynamic relocation. 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * bit: 3 2 1 0 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * | PLT | GOTRel | GOT | Rel | 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * value Name - Description 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0000 None - no reserved entry 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0001 ReserveRel - reserve an dynamic relocation entry 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0010 ReserveGOT - reserve an GOT entry 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0011 GOTandRel - For different relocation, we've reserved GOT and 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Rel for different location. 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0100 GOTRel - reserve an GOT entry and the corresponding Dyncamic 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * relocation entry which relocate this GOT entry 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 0101 GOTRelandRel - For different relocation, we've reserved GOTRel 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * and relocation entry for different location. 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 1000 ReservePLT - reserve an PLT entry and the corresponding GOT, 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Dynamic relocation entries 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 1001 PLTandRel - For different relocation, we've reserved PLT and 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Rel for different location. 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum ReservedEntryType { 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao None = 0, 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReserveRel = 1, 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReserveGOT = 2, 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GOTandRel = 3, 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GOTRel = 4, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GOTRelandRel = 5, 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReservePLT = 8, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PLTandRel = 9 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86GNULDBackend(const LinkerConfig& pConfig, 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines GNUInfo* pInfo, 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Relocation::Type pCopyRel); 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~X86GNULDBackend(); 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t machine() const; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86PLT& getPLT(); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const X86PLT& getPLT() const; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// preLayout - Backend can do any needed modification before layout 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void doPreLayout(IRBuilder& pBuilder); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// postLayout -Backend can do any needed modification after layout 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void doPostLayout(Module& pModule, IRBuilder& pBuilder); 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// dynamic - the dynamic section of the target machine. 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Use co-variant return type to return its own dynamic section. 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86ELFDynamic& dynamic(); 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// dynamic - the dynamic section of the target machine. 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Use co-variant return type to return its own dynamic section. 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const X86ELFDynamic& dynamic() const; 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// emitSectionData - write out the section data into the memory region. 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// When writers get a LDSection whose kind is LDFileFormat::Target, writers 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// call back target backend to emit the data. 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Backends handle the target-special tables (plt, gp,...) by themselves. 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Backend can put the data of the tables in MCSectionData directly 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// - LDSection.getSectionData can get the section data. 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Or, backend can put the data into special data structure 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// - backend can maintain its own map<LDSection, table> to get the table 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// from given LDSection. 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pSection - the given LDSection 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pLayout - for comouting the size of fragment 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pRegion - the region to write out data 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the size of the table in the file. 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t emitSectionData(const LDSection& pSection, 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion& pRegion) const; 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// initRelocator - create and initialize Relocator. 1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool initRelocator() = 0; 121d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 122d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// getRelocator - return relocator. 123d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Relocator* getRelocator(); 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) = 0; 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void initTargetSymbols(IRBuilder& pBuilder, Module& pModule); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// scanRelocation - determine the empty entries are needed or not and create 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// the empty entries if needed. 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// For X86, following entries are check to create: 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// - GOT entry (for .got and .got.plt sections) 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// - PLT entry (for .plt section) 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections) 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void scanRelocation(Relocation& pReloc, 1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module& pModule, 1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection); 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputRelocSection& getRelDyn(); 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const OutputRelocSection& getRelDyn() const; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputRelocSection& getRelPLT(); 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const OutputRelocSection& getRelPLT() const; 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getTargetSectionOrder - compute the layout order of X86 target sections 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const; 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// finalizeTargetSymbols - finalize the symbol value 1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool finalizeTargetSymbols(); 1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getPointerRel - get pointer relocation type. 1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Relocation::Type getPointerRel() 1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_PointerRel; } 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void scanLocalReloc(Relocation& pReloc, 1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection) = 0; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void scanGlobalReloc(Relocation& pReloc, 1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection) = 0; 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected: 170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// addCopyReloc - add a copy relocation into .rel.dyn for pSym 171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pSym - A resolved copy symbol that defined in BSS section 172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void addCopyReloc(ResolveInfo& pSym); 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// defineSymbolforCopyReloc - allocate a space in BSS section and 175affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// and force define the copy of pSym to BSS section 176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return the output LDSymbol of the copy symbol 1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker, 178affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const ResolveInfo& pSym); 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void defineGOTSymbol(IRBuilder& pBuilder, Fragment&); 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected: 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// getRelEntrySize - the size in BYTE of rel type relocation 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t getRelEntrySize() 1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_RelEntrySize; } 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// getRelEntrySize - the size in BYTE of rela type relocation 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t getRelaEntrySize() 1896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_RelaEntrySize; } 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// doCreateProgramHdrs - backend can implement this function to create the 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// target-dependent segments 1946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void doCreateProgramHdrs(Module& pModule); 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void setGOTSectionSize(IRBuilder& pBuilder) = 0; 1976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual uint64_t emitGOTSectionData(MemoryRegion& pRegion) const = 0; 1996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion, 2016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const ELFFileFormat* FileFormat) const = 0; 2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void setRelDynSize() = 0; 2046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void setRelPLTSize() = 0; 2056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected: 207d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Relocator* m_pRelocator; 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86PLT* m_pPLT; 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_RelDyn - dynamic relocation table of .rel.dyn 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputRelocSection* m_pRelDyn; 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_RelPLT - dynamic relocation table of .rel.plt 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputRelocSection* m_pRelPLT; 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao X86ELFDynamic* m_pDynamic; 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol* m_pGOTSymbol; 2166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t m_RelEntrySize; 2186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t m_RelaEntrySize; 2196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Relocation::Type m_CopyRel; 2216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Relocation::Type m_PointerRel; 2226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 2236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 2256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 2266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_32GNULDBackend - linker backend of X86-32 target of GNU ELF format 2276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// 2286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GNULDBackend : public X86GNULDBackend 2296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 2306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo); 2326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~X86_32GNULDBackend(); 2346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void initTargetSections(Module& pModule, ObjectBuilder& pBuilder); 2366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOT& getGOT(); 2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const X86_32GOT& getGOT() const; 2406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOTPLT& getGOTPLT(); 2426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const X86_32GOTPLT& getGOTPLT() const; 2446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOTEntry& getTLSModuleID(); 2466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 2486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void scanLocalReloc(Relocation& pReloc, 2496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 2506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 2516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection); 2526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void scanGlobalReloc(Relocation& pReloc, 2546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 2556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 2566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection); 2576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// initRelocator - create and initialize Relocator. 2596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool initRelocator(); 2606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// ----- tls optimization ----- /// 2626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// convert R_386_TLS_IE to R_386_TLS_LE 2636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void convertTLSIEtoLE(Relocation& pReloc, LDSection& pSection); 2646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setGOTSectionSize(IRBuilder& pBuilder); 2666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t emitGOTSectionData(MemoryRegion& pRegion) const; 2686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion, 2706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const ELFFileFormat* FileFormat) const; 2716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setRelDynSize(); 2736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setRelPLTSize(); 2746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 2766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOT* m_pGOT; 2776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_32GOTPLT* m_pGOTPLT; 2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 2826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_64GNULDBackend - linker backend of X86-64 target of GNU ELF format 2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 2846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64GNULDBackend : public X86GNULDBackend 2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 2876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo); 2886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~X86_64GNULDBackend(); 2906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void initTargetSections(Module& pModule, ObjectBuilder& pBuilder); 2926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOT& getGOT(); 2946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const X86_64GOT& getGOT() const; 2966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOTPLT& getGOTPLT(); 2986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const X86_64GOTPLT& getGOTPLT() const; 3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 3026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void scanLocalReloc(Relocation& pReloc, 3036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 3046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 3056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection); 3066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void scanGlobalReloc(Relocation& pReloc, 3086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines IRBuilder& pBuilder, 3096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Module& pModule, 3106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& pSection); 3116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// initRelocator - create and initialize Relocator. 3136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool initRelocator(); 3146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setGOTSectionSize(IRBuilder& pBuilder); 3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t emitGOTSectionData(MemoryRegion& pRegion) const; 3186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion, 3206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const ELFFileFormat* FileFormat) const; 3216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setRelDynSize(); 3236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setRelPLTSize(); 3246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 3266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOT* m_pGOT; 3276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines X86_64GOTPLT* m_pGOTPLT; 3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 332affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 333