121 lines
4.0 KiB
C++
121 lines
4.0 KiB
C++
//===- ELFSegment.h -------------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_LD_ELFSEGMENT_H_
|
|
#define MCLD_LD_ELFSEGMENT_H_
|
|
#include "mcld/Config/Config.h"
|
|
#include "mcld/Support/Allocators.h"
|
|
|
|
#include <llvm/Support/DataTypes.h>
|
|
#include <llvm/Support/ELF.h>
|
|
|
|
#include <vector>
|
|
|
|
namespace mcld {
|
|
|
|
class LDSection;
|
|
|
|
/** \class ELFSegment
|
|
* \brief decribe the program header for ELF executable or shared object
|
|
*/
|
|
class ELFSegment {
|
|
public:
|
|
typedef std::vector<LDSection*> SectionList;
|
|
typedef SectionList::iterator iterator;
|
|
typedef SectionList::const_iterator const_iterator;
|
|
typedef SectionList::reverse_iterator reverse_iterator;
|
|
typedef SectionList::const_reverse_iterator const_reverse_iterator;
|
|
|
|
private:
|
|
friend class Chunk<ELFSegment, MCLD_SEGMENTS_PER_OUTPUT>;
|
|
ELFSegment();
|
|
explicit ELFSegment(uint32_t pType, uint32_t pFlag = llvm::ELF::PF_R);
|
|
|
|
public:
|
|
~ELFSegment();
|
|
|
|
/// ----- iterators ----- ///
|
|
iterator begin() { return m_SectionList.begin(); }
|
|
const_iterator begin() const { return m_SectionList.begin(); }
|
|
iterator end() { return m_SectionList.end(); }
|
|
const_iterator end() const { return m_SectionList.end(); }
|
|
|
|
reverse_iterator rbegin() { return m_SectionList.rbegin(); }
|
|
const_reverse_iterator rbegin() const { return m_SectionList.rbegin(); }
|
|
reverse_iterator rend() { return m_SectionList.rend(); }
|
|
const_reverse_iterator rend() const { return m_SectionList.rend(); }
|
|
|
|
LDSection* front() { return m_SectionList.front(); }
|
|
const LDSection* front() const { return m_SectionList.front(); }
|
|
LDSection* back() { return m_SectionList.back(); }
|
|
const LDSection* back() const { return m_SectionList.back(); }
|
|
|
|
/// ----- observers ----- ///
|
|
uint32_t type() const { return m_Type; }
|
|
uint64_t offset() const { return m_Offset; }
|
|
uint64_t vaddr() const { return m_Vaddr; }
|
|
uint64_t paddr() const { return m_Paddr; }
|
|
uint64_t filesz() const { return m_Filesz; }
|
|
uint64_t memsz() const { return m_Memsz; }
|
|
uint32_t flag() const { return m_Flag; }
|
|
uint64_t align() const { return std::max(m_Align, m_MaxSectionAlign); }
|
|
|
|
size_t size() const { return m_SectionList.size(); }
|
|
bool empty() const { return m_SectionList.empty(); }
|
|
|
|
bool isLoadSegment() const;
|
|
bool isDataSegment() const;
|
|
bool isBssSegment() const;
|
|
|
|
/// ----- modifiers ----- ///
|
|
void setOffset(uint64_t pOffset) { m_Offset = pOffset; }
|
|
|
|
void setVaddr(uint64_t pVaddr) { m_Vaddr = pVaddr; }
|
|
|
|
void setPaddr(uint64_t pPaddr) { m_Paddr = pPaddr; }
|
|
|
|
void setFilesz(uint64_t pFilesz) { m_Filesz = pFilesz; }
|
|
|
|
void setMemsz(uint64_t pMemsz) { m_Memsz = pMemsz; }
|
|
|
|
void setFlag(uint32_t pFlag) { m_Flag = pFlag; }
|
|
|
|
void updateFlag(uint32_t pFlag) {
|
|
// PT_TLS segment should be PF_R
|
|
if (llvm::ELF::PT_TLS != m_Type)
|
|
m_Flag |= pFlag;
|
|
}
|
|
|
|
void setAlign(uint64_t pAlign) { m_Align = pAlign; }
|
|
|
|
iterator insert(iterator pPos, LDSection* pSection);
|
|
|
|
void append(LDSection* pSection);
|
|
|
|
/* factory methods */
|
|
static ELFSegment* Create(uint32_t pType, uint32_t pFlag = llvm::ELF::PF_R);
|
|
static void Destroy(ELFSegment*& pSegment);
|
|
static void Clear();
|
|
|
|
private:
|
|
uint32_t m_Type; // Type of segment
|
|
uint32_t m_Flag; // Segment flags
|
|
uint64_t m_Offset; // File offset where segment is located, in bytes
|
|
uint64_t m_Vaddr; // Virtual address of the segment
|
|
uint64_t m_Paddr; // Physical address of the segment (OS-specific)
|
|
uint64_t m_Filesz; // # of bytes in file image of segment (may be 0)
|
|
uint64_t m_Memsz; // # of bytes in mem image of segment (may be 0)
|
|
uint64_t m_Align; // alignment constraint
|
|
uint64_t m_MaxSectionAlign; // max alignment of the sections in this segment
|
|
SectionList m_SectionList;
|
|
};
|
|
|
|
} // namespace mcld
|
|
|
|
#endif // MCLD_LD_ELFSEGMENT_H_
|