15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFSegment.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 MCLD_ELF_SEGMENT_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_ELF_SEGMENT_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ELF.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cassert> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <vector> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ELFSegment 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief decribe the program header for ELF executable or shared object 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ELFSegment 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::vector<LDSection*>::iterator sect_iterator; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::vector<LDSection*>::const_iterator const_sect_iterator; 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ELFSegment(uint32_t pType, 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pFlag = llvm::ELF::PF_R, 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pOffset = 0, 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pVaddr = 0, 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pPaddr = 0, 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pFilesz = 0, 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pMemsz = 0, 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t pAlign = 0, 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t pMaxSectAlign = 0); 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~ELFSegment(); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- iterators ----- /// 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao sect_iterator sectBegin() 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.begin(); } 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao sect_iterator sectEnd() 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.end(); } 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_sect_iterator sectBegin() const 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.begin(); } 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_sect_iterator sectEnd() const 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.end(); } 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection* getFirstSection() 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == numOfSections()) 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionList[0]; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection* getLastSection() 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == numOfSections()) 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return m_SectionList[numOfSections() - 1]; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSection* getFirstSection() const 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == numOfSections()) 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionList[0]; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSection* getLastSection() const 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == numOfSections()) 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return m_SectionList[numOfSections() - 1]; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- observers ----- /// 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t type() const 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Type; } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t offset() const 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Offset; } 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t vaddr() const 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Vaddr; } 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t paddr() const 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Paddr; } 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t filesz() const 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Filesz; } 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t memsz() const 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Memsz; } 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t flag() const 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Flag; } 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t align() const 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return std::max(m_Align, m_MaxSectionAlign); } 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfSections() const 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.size(); } 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- modifiers ----- /// 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setOffset(uint64_t pOffset) 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Offset = pOffset; } 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setVaddr(uint64_t pVaddr) 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Vaddr = pVaddr; } 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setPaddr(uint64_t pPaddr) 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Paddr = pPaddr; } 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFilesz(uint64_t pFilesz) 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Filesz = pFilesz; } 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setMemsz(uint64_t pMemsz) 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Memsz = pMemsz; } 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFlag(uint32_t pFlag) 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Flag = pFlag; } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void updateFlag(uint32_t pFlag) 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // PT_TLS segment should be PF_R 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (llvm::ELF::PT_TLS != m_Type) 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Flag |= pFlag; 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAlign(uint64_t pAlign) 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Align = pAlign; } 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void addSection(LDSection* pSection) 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != pSection); 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pSection->align() > m_MaxSectionAlign) 145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_MaxSectionAlign = pSection->align(); 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_SectionList.push_back(pSection); 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t m_Type; // Type of segment 151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t m_Flag; // Segment flags 152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Offset; // File offset where segment is located, in bytes 153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Vaddr; // Virtual address of the segment 154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Paddr; // Physical address of the segment (OS-specific) 155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Filesz; // # of bytes in file image of segment (may be 0) 156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Memsz; // # of bytes in mem image of segment (may be 0) 157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Align; // alignment constraint 158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_MaxSectionAlign; // max alignment of the sections in this segment 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::vector<LDSection*> m_SectionList; 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 166