1 //===- LDSection.h --------------------------------------------------------===// 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 10 #ifndef MCLD_LD_LDSECTION_H 11 #define MCLD_LD_LDSECTION_H 12 #ifdef ENABLE_UNITTEST 13 #include <gtest.h> 14 #endif 15 16 #include <llvm/Support/DataTypes.h> 17 #include <mcld/Support/Allocators.h> 18 #include <mcld/Config/Config.h> 19 #include <mcld/LD/LDFileFormat.h> 20 #include <string> 21 22 namespace mcld { 23 24 class SectionData; 25 class RelocData; 26 class EhFrame; 27 28 /** \class LDSection 29 * \brief LDSection represents a section header entry. It is a unified 30 * abstraction of a section header entry for various file formats. 31 */ 32 class LDSection 33 { 34 private: 35 friend class Chunk<LDSection, MCLD_SECTIONS_PER_INPUT>; 36 37 LDSection(); 38 39 LDSection(const std::string& pName, 40 LDFileFormat::Kind pKind, 41 uint32_t pType, 42 uint32_t pFlag, 43 uint64_t pSize = 0, 44 uint64_t pAddr = 0); 45 46 public: 47 ~LDSection(); 48 49 static LDSection* Create(const std::string& pName, 50 LDFileFormat::Kind pKind, 51 uint32_t pType, 52 uint32_t pFlag, 53 uint64_t pSize = 0, 54 uint64_t pAddr = 0); 55 56 static void Destroy(LDSection*& pSection); 57 58 static void Clear(); 59 60 bool hasOffset() const; 61 62 /// name - the name of this section. 63 const std::string& name() const 64 { return m_Name; } 65 66 /// kind - the kind of this section, such as Text, BSS, GOT, and so on. 67 /// from LDFileFormat::Kind 68 LDFileFormat::Kind kind() const 69 { return m_Kind; } 70 71 /// type - The categorizes the section's contents and semantics. It's 72 /// different from llvm::SectionKind. Type is format-dependent, but 73 /// llvm::SectionKind is format independent and is used for bit-code. 74 /// In ELF, it is sh_type 75 /// In MachO, it's type field of struct section::flags 76 uint32_t type() const 77 { return m_Type; } 78 79 /// flag - An integer describes miscellaneous attributes. 80 /// In ELF, it is sh_flags. 81 /// In MachO, it's attribute field of struct section::flags 82 uint32_t flag() const 83 { return m_Flag; } 84 85 /// size - An integer specifying the size in bytes of the virtual memory 86 /// occupied by this section. 87 /// In ELF, if the type() is SHT_NOBITS, this function return zero. 88 /// Before layouting, output's LDSection::size() should return zero. 89 uint64_t size() const 90 { return m_Size; } 91 92 /// offset - An integer specifying the offset of this section in the file. 93 /// Before layouting, output's LDSection::offset() should return zero. 94 uint64_t offset() const 95 { return m_Offset; } 96 97 /// addr - An integer specifying the virtual address of this section in the 98 /// virtual image. 99 /// Before layouting, output's LDSection::offset() should return zero. 100 /// ELF uses sh_addralign to set alignment constraints. In LLVM, alignment 101 /// constraint is set in SectionData::setAlignment. addr() contains the 102 /// original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary. 103 /// MachO uses the same scenario. 104 /// 105 /// Because addr() in output is changing during linking, MCLinker does not 106 /// store the address of the output here. The address is in Layout 107 uint64_t addr() const 108 { return m_Addr; } 109 110 /// align - An integer specifying the align of this section in the file. 111 /// Before layouting, output's LDSection::align() should return zero. 112 uint32_t align() const 113 { return m_Align; } 114 115 size_t index() const 116 { return m_Index; } 117 118 /// getLink - return the Link. When a section A needs the other section B 119 /// during linking or loading, we say B is A's Link section. 120 /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info. 121 /// 122 /// @return if the section needs no other sections, return NULL 123 LDSection* getLink() 124 { return m_pLink; } 125 126 const LDSection* getLink() const 127 { return m_pLink; } 128 129 size_t getInfo() const 130 { return m_Info; } 131 132 void setKind(LDFileFormat::Kind pKind) 133 { m_Kind = pKind; } 134 135 void setSize(uint64_t size) 136 { m_Size = size; } 137 138 void setOffset(uint64_t Offset) 139 { m_Offset = Offset; } 140 141 void setAddr(uint64_t addr) 142 { m_Addr = addr; } 143 144 void setAlign(uint32_t align) 145 { m_Align = align; } 146 147 void setFlag(uint32_t flag) 148 { m_Flag = flag; } 149 150 void setType(uint32_t type) 151 { m_Type = type; } 152 153 // ----- SectionData ----- // 154 const SectionData* getSectionData() const { return m_Data.sect_data; } 155 SectionData* getSectionData() { return m_Data.sect_data; } 156 157 void setSectionData(SectionData* pSD) { m_Data.sect_data = pSD; } 158 159 bool hasSectionData() const; 160 161 // ------ RelocData ------ // 162 const RelocData* getRelocData() const { return m_Data.reloc_data; } 163 RelocData* getRelocData() { return m_Data.reloc_data; } 164 165 void setRelocData(RelocData* pRD) { m_Data.reloc_data = pRD; } 166 167 bool hasRelocData() const; 168 169 // ------ EhFrame ------ // 170 const EhFrame* getEhFrame() const { return m_Data.eh_frame; } 171 EhFrame* getEhFrame() { return m_Data.eh_frame; } 172 173 void setEhFrame(EhFrame* pEhFrame) { m_Data.eh_frame = pEhFrame; } 174 175 bool hasEhFrame() const; 176 177 /// setLink - set the sections should link with. 178 /// if pLink is NULL, no Link section is set. 179 void setLink(LDSection* pLink) 180 { m_pLink = pLink; } 181 182 void setInfo(size_t pInfo) 183 { m_Info = pInfo; } 184 185 void setIndex(size_t pIndex) 186 { m_Index = pIndex; } 187 188 private: 189 union SectOrRelocData 190 { 191 SectionData* sect_data; 192 RelocData* reloc_data; 193 EhFrame* eh_frame; 194 }; 195 196 private: 197 std::string m_Name; 198 199 LDFileFormat::Kind m_Kind; 200 uint32_t m_Type; 201 uint32_t m_Flag; 202 203 uint64_t m_Size; 204 uint64_t m_Offset; 205 uint64_t m_Addr; 206 uint32_t m_Align; 207 208 size_t m_Info; 209 LDSection* m_pLink; 210 211 /// m_Data - the SectionData or RelocData of this section 212 SectOrRelocData m_Data; 213 214 /// m_Index - the index of the file 215 size_t m_Index; 216 217 }; // end of LDSection 218 219 } // end namespace mcld 220 221 #endif 222 223