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 ----- /// 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sect_iterator begin() { return m_SectionList.begin(); } 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_sect_iterator begin() const { return m_SectionList.begin(); } 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sect_iterator end() { return m_SectionList.end(); } 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_sect_iterator end() const { return m_SectionList.end(); } 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* front() { return m_SectionList.front(); } 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* front() const { return m_SectionList.front(); } 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* back() { return m_SectionList.back(); } 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* back() const { return m_SectionList.back(); } 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- observers ----- /// 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t type() const 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Type; } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t offset() const 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Offset; } 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t vaddr() const 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Vaddr; } 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t paddr() const 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Paddr; } 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t filesz() const 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Filesz; } 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t memsz() const 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Memsz; } 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t flag() const 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Flag; } 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t align() const 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return std::max(m_Align, m_MaxSectionAlign); } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfSections() const 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_SectionList.size(); } 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isDataSegment() const; 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isBssSegment() const; 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- modifiers ----- /// 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setOffset(uint64_t pOffset) 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Offset = pOffset; } 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setVaddr(uint64_t pVaddr) 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Vaddr = pVaddr; } 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setPaddr(uint64_t pPaddr) 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Paddr = pPaddr; } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFilesz(uint64_t pFilesz) 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Filesz = pFilesz; } 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setMemsz(uint64_t pMemsz) 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Memsz = pMemsz; } 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFlag(uint32_t pFlag) 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Flag = pFlag; } 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void updateFlag(uint32_t pFlag) 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // PT_TLS segment should be PF_R 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (llvm::ELF::PT_TLS != m_Type) 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Flag |= pFlag; 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAlign(uint64_t pAlign) 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Align = pAlign; } 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void addSection(LDSection* pSection) 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != pSection); 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pSection->align() > m_MaxSectionAlign) 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_MaxSectionAlign = pSection->align(); 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_SectionList.push_back(pSection); 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t m_Type; // Type of segment 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t m_Flag; // Segment flags 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Offset; // File offset where segment is located, in bytes 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Vaddr; // Virtual address of the segment 128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Paddr; // Physical address of the segment (OS-specific) 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Filesz; // # of bytes in file image of segment (may be 0) 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Memsz; // # of bytes in mem image of segment (may be 0) 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_Align; // alignment constraint 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t m_MaxSectionAlign; // max alignment of the sections in this segment 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::vector<LDSection*> m_SectionList; 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 140