23 #ifndef __CLRX_ELFBINARIES_H__ 24 #define __CLRX_ELFBINARIES_H__ 117 static const Word nobase = Word(0)-1;
118 static const cxuint relSymShift = 8;
138 static const Word nobase = Word(0)-1;
139 static const cxuint relSymShift = 32;
146 template<
typename Types>
190 {
return creationFlags; }
206 {
return binaryCodeSize; }
209 operator bool()
const 210 {
return binaryCode!=
nullptr; }
214 {
return binaryCode==
nullptr; }
218 {
return binaryCode; }
221 {
return binaryCode; }
225 {
return *
reinterpret_cast<const typename Types::Ehdr*
>(binaryCode); }
229 {
return *
reinterpret_cast<typename Types::Ehdr*
>(binaryCode); }
233 {
return ULEV(getHeader().e_shnum); }
238 const typename Types::Ehdr& ehdr = getHeader();
239 return *
reinterpret_cast<const typename Types::Shdr*
>(binaryCode +
240 ULEV(ehdr.e_shoff) + size_t(
ULEV(ehdr.e_shentsize))*index);
246 const typename Types::Ehdr& ehdr = getHeader();
247 return *
reinterpret_cast<typename Types::Shdr*
>(binaryCode +
248 ULEV(ehdr.e_shoff) + size_t(
ULEV(ehdr.e_shentsize))*index);
253 {
return ULEV(getHeader().e_phnum); }
258 const typename Types::Ehdr& ehdr = getHeader();
259 return *
reinterpret_cast<const typename Types::Phdr*
>(binaryCode +
260 ULEV(ehdr.e_phoff) + size_t(
ULEV(ehdr.e_phentsize))*index);
266 const typename Types::Ehdr& ehdr = getHeader();
267 return *
reinterpret_cast<typename Types::Phdr*
>(binaryCode +
268 ULEV(ehdr.e_phoff) + size_t(
ULEV(ehdr.e_phentsize))*index);
273 {
return symbolsNum; }
277 {
return dynSymbolsNum; }
280 const typename Types::Sym&
getSymbol(
typename Types::Size index)
const 282 return *
reinterpret_cast<const typename Types::Sym*
>(symbolTable +
283 size_t(index)*symbolEntSize);
287 typename Types::Sym&
getSymbol(
typename Types::Size index)
289 return *
reinterpret_cast<typename Types::Sym*
>(
290 symbolTable + size_t(index)*symbolEntSize);
294 const typename Types::Sym&
getDynSymbol(
typename Types::Size index)
const 296 return *
reinterpret_cast<const typename Types::Sym*
>(dynSymTable +
297 size_t(index)*dynSymEntSize);
303 return *
reinterpret_cast<typename Types::Sym*
>(dynSymTable +
304 size_t(index)*dynSymEntSize);
310 const typename Types::Sym& sym = getSymbol(index);
311 return reinterpret_cast<const char*
>(symbolStringTable +
ULEV(sym.st_name));
317 const typename Types::Sym& sym = getDynSymbol(index);
318 return reinterpret_cast<const char*
>(dynSymStringTable +
ULEV(sym.st_name));
324 const typename Types::Shdr& section = getSectionHeader(index);
325 return reinterpret_cast<const char*
>(sectionStringTable +
ULEV(section.sh_name));
330 {
return sectionIndexMap.
end(); }
337 if (it == sectionIndexMap.
end())
338 throw BinException(std::string(
"Can't find Elf")+Types::bitName+
" Section");
343 uint16_t getSectionIndex(
const char* name)
const;
346 typename Types::Size getSymbolIndex(
const char* name)
const;
349 typename Types::Size getDynSymbolIndex(
const char* name)
const;
353 {
return symbolIndexMap.
end(); }
357 {
return dynSymIndexMap.
end(); }
364 if (it == symbolIndexMap.
end())
365 throw BinException(std::string(
"Can't find Elf")+Types::bitName+
" Symbol");
374 if (it == dynSymIndexMap.
end())
375 throw BinException(std::string(
"Can't find Elf")+Types::bitName+
" DynSymbol");
381 {
return getSectionHeader(getSectionIndex(name)); }
385 {
return getSectionHeader(getSectionIndex(name)); }
388 const typename Types::Sym&
getSymbol(
const char* name)
const 389 {
return getSymbol(getSymbolIndex(name)); }
393 {
return getSymbol(getSymbolIndex(name)); }
397 {
return getDynSymbol(getDynSymbolIndex(name)); }
401 {
return getDynSymbol(getDynSymbolIndex(name)); }
405 {
return reinterpret_cast<typename Types::Nhdr*
>(noteTable); }
409 {
return reinterpret_cast<typename Types::Nhdr*
>(noteTable); }
413 {
return noteTableSize; }
417 {
return dynamicsNum; }
421 {
return dynamicEntSize; }
425 {
return reinterpret_cast<const typename Types::Dyn*
>(dynamicTable); }
429 {
return reinterpret_cast<typename Types::Dyn*
>(dynamicTable); }
434 const typename Types::Shdr& shdr = getSectionHeader(index);
435 return binaryCode +
ULEV(shdr.sh_offset);
441 typename Types::Shdr& shdr = getSectionHeader(index);
442 return binaryCode +
ULEV(shdr.sh_offset);
447 {
return getSectionContent(getSectionIndex(name)); }
451 {
return getSectionContent(getSectionIndex(name)); }
453 static uint32_t getElfRelType(
typename Types::Word info);
454 static uint32_t getElfRelSym(
typename Types::Word info);
459 {
return ELF32_R_TYPE(info); }
463 {
return ELF32_R_SYM(info); }
467 {
return ELF64_R_TYPE(info); }
471 {
return ELF64_R_SYM(info); }
505 template<
typename Types>
529 ELFSECTID_VAL_MAX = UINT_MAX,
530 ELFSECTID_START = ELFSECTID_VAL_MAX-255,
531 ELFSECTID_SHSTRTAB = ELFSECTID_START,
541 ELFSECTID_STD_MAX = ELFSECTID_COMMENT,
542 ELFSECTID_OTHER_BUILTIN = ELFSECTID_STD_MAX+1,
543 ELFSECTID_NULL = ELFSECTID_VAL_MAX-2,
544 ELFSECTID_ABS = ELFSECTID_VAL_MAX-1,
545 ELFSECTID_UNDEF = ELFSECTID_VAL_MAX
576 cxuint maxBuiltinSection, ElfBinSectId extraSectionIndex);
579 template<
typename Types>
606 typename Types::Word align;
614 const cxbyte* _data,
typename Types::Word _align)
615 : type(
ElfRegionType::USER), dataFromPointer(true), size(_size),
616 align(_align), data(_data)
622 : type(
ElfRegionType::USER), dataFromPointer(false), size(_size),
623 align(_align), dataGen(contentGen)
628 const cxbyte* _data,
typename Types::Word _align)
629 : type(_type), dataFromPointer(true), size(_size),
630 align(_align), data(_data)
636 : type(_type), dataFromPointer(false), size(_size),
637 align(_align), dataGen(contentGen)
642 typename Types::Word _align,
const char* _name, uint32_t _type,
643 typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
644 typename Types::Word _addrBase = 0,
645 typename Types::Word _entSize = 0,
bool _zeroOffset =
false,
646 typename Types::Word _sectAlign = 0)
648 align(_align), data(_data)
650 section = {_name, _type, _flags, _link, _info, _addrBase,
651 _entSize, _zeroOffset, _sectAlign};
656 typename Types::Word _align,
const char* inName, uint32_t _type,
657 typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
658 typename Types::Word _addrBase = 0,
659 typename Types::Word _entSize = 0,
bool _zeroOffset =
false,
660 typename Types::Word _sectAlign = 0)
662 align(_align), dataGen(_data)
664 section = {inName, _type, _flags, _link, _info, _addrBase,
665 _entSize, _zeroOffset, _sectAlign};
675 cxuint maxBuiltinSection, ElfBinSectId startExtraIndex)
677 align(binSection.align), data(binSection.data)
680 typename Types::SectionFlags(binSection.
flags),
682 maxBuiltinSection, startExtraIndex)),
683 binSection.
info, 0,
typename Types::Word(binSection.
entSize), 0 };
689 sizeof(
typename Types::Word)); }
694 sizeof(
typename Types::Word)); }
717 ".dynsym", SHT_DYNSYM, SHF_ALLOC, 0, defInfo ?
BINGEN_DEFAULT : 0); }
722 ".hash", SHT_HASH, SHF_ALLOC, link); }
731 ".dynamic", SHT_DYNAMIC, SHF_ALLOC|SHF_WRITE, link); }
749 PHREGION_FILESTART = UINT_MAX
752 template<
typename Types>
772 template<
typename Types>
784 valueIsAddr(false), value(0), size(0)
790 typename Types::Word _value,
typename Types::Word _size)
791 : name(_name), sectionIndex(_sectionIndex), info(_info), other(_other),
792 valueIsAddr(_valueIsAddr), value(_value), size(_size)
802 cxuint maxBuiltinSection, ElfBinSectId startExtraIndex)
806 maxBuiltinSection, startExtraIndex);
807 info = binSymbol.
info;
808 other = binSymbol.
other;
810 value = binSymbol.
value;
811 size = binSymbol.
size;
821 template<
typename Types>
826 bool addNullSym, addNullDynSym;
829 uint16_t shStrTab, strTab, dynStr;
830 cxuint shdrTabRegion, phdrTabRegion;
831 uint16_t sectionsNum;
832 typename Types::Word size;
834 std::vector<ElfRegionTemplate<Types> > regions;
835 std::unique_ptr<typename Types::Word[]> regionOffsets;
836 std::unique_ptr<typename Types::Word[]> regionAddresses;
837 std::unique_ptr<cxuint[]> sectionRegions;
838 std::vector<ElfProgramHeaderTemplate<Types> > progHeaders;
839 std::vector<ElfSymbolTemplate<Types> > symbols;
840 std::vector<ElfSymbolTemplate<Types> > dynSymbols;
841 std::vector<ElfNote> notes;
842 std::vector<int32_t> dynamics;
843 std::unique_ptr<typename Types::Word[]> dynamicValues;
845 std::unique_ptr<uint32_t[]> hashCodes;
860 bool addNullSym =
true,
bool addNullDynSym =
true,
861 bool addNullSection =
true,
cxuint addrCountingFromRegion = 0);
865 { this->header = header; }
877 { dynSymbols.clear(); }
880 { symbols.push_back(symbol); }
883 { dynSymbols.push_back(symbol); }
886 { notes.push_back(note); }
889 { dynamics.push_back(dynamicTag); }
892 { dynamics.insert(dynamics.end(), dynTags, dynTags + dynamicsNum); }
895 uint64_t countSize();
898 typename Types::Word getRegionOffset(
cxuint i)
const 899 {
return regionOffsets[i]; }
911 static typename Types::Word getRelInfo(
size_t symbolIndex, uint32_t rtype);
916 size_t symbolIndex, uint32_t rtype)
917 {
return ELF32_R_INFO(symbolIndex, rtype); }
921 size_t symbolIndex, uint32_t rtype)
922 {
return ELF64_R_INFO(symbolIndex, rtype); }
const char * getDynSymbolName(typename Types::Size index) const
get dynamic symbol name with specified index
Definition: ElfBinaries.h:315
const Types::Sym & getDynSymbol(typename Types::Size index) const
get dynamic symbol with specified index
Definition: ElfBinaries.h:294
const Types::Shdr & getSectionHeader(uint16_t index) const
get section header with specified index
Definition: ElfBinaries.h:236
uint32_t link
section link
Definition: ElfBinaries.h:601
ELF note structure.
Definition: ElfBinaries.h:735
uint32_t Word
word size in ELF
Definition: ElfBinaries.h:104
SymbolIndexMap::const_iterator getDynSymbolIterEnd() const
get end iterator of dynamic symbol index map
Definition: ElfBinaries.h:356
Elf64_Sym Sym
symbol header
Definition: ElfBinaries.h:130
if set in field then field has been ignored
Definition: ElfBinaries.h:51
void addDynamic(int32_t dynamicTag)
add dynamic
Definition: ElfBinaries.h:888
Elf64_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:127
const cxbyte * data
data content
Definition: ElfBinaries.h:553
cxbyte info
info
Definition: ElfBinaries.h:570
Types::Shdr & getSectionHeader(const char *name)
get section header with specified name
Definition: ElfBinaries.h:384
ELF binary class.
Definition: ElfBinaries.h:147
create map of symbols
Definition: ElfBinaries.h:71
Types::Size noteTableSize
size of note table
Definition: ElfBinaries.h:171
uint32_t type
section type
Definition: ElfBinaries.h:555
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:100
const Types::Ehdr & getHeader() const
get ELF binary header
Definition: ElfBinaries.h:224
const T * begin() const
get iterator to first element
Definition: Containers.h:253
static ElfRegionTemplate symtabSection(bool defInfo=true)
get symtab section
Definition: ElfBinaries.h:710
Elf32_Nhdr Nhdr
note header
Definition: ElfBinaries.h:110
Iter binaryMapFind(Iter begin, Iter end, const typename std::iterator_traits< Iter >::value_type::first_type &k)
binary find helper for array-map
Definition: Containers.h:440
size_t binaryCodeSize
binary code size
Definition: ElfBinaries.h:156
ElfRegionType type
type of region
Definition: ElfBinaries.h:582
fast and direct output buffer
Definition: InputOutput.h:350
const char * c_str() const
return C-style string pointer
Definition: CString.h:254
uint32_t info
section info
Definition: ElfBinaries.h:602
template of ElfRegion
Definition: ElfBinaries.h:580
static ElfRegionTemplate shstrtabSection()
get .shstrtab section
Definition: ElfBinaries.h:706
uint64_t flags
section flags
Definition: ElfBinaries.h:556
void addDynSymbol(const ElfSymbolTemplate< Types > &symbol)
add dynamic symbol
Definition: ElfBinaries.h:882
Types::Sym & getSymbol(typename Types::Size index)
get symbol with specified index
Definition: ElfBinaries.h:287
uint64_t value
symbol value
Definition: ElfBinaries.h:566
const Types::Sym & getDynSymbol(const char *name) const
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:396
Elf32_Rela Rela
relocation with addend
Definition: ElfBinaries.h:113
uint64_t size
symbol size
Definition: ElfBinaries.h:567
const cxbyte * desc
description
Definition: ElfBinaries.h:739
const Types::Dyn * getDynamicTable() const
get dynamic table
Definition: ElfBinaries.h:424
bool hasSectionMap() const
returns true if object has a section's index map
Definition: ElfBinaries.h:193
bool valueIsAddr
true if value should be treats as address
Definition: ElfBinaries.h:779
ELF 32-bit types.
Definition: ElfBinaries.h:101
ElfRegionTemplate< Elf32Types > ElfRegion32
32-bit region (for 32-bit elf)
Definition: ElfBinaries.h:744
Elf64_Rela Rela
relocation with addend
Definition: ElfBinaries.h:134
Binary generator exception class.
Definition: ElfBinaries.h:89
class ElfBinaryTemplate< Elf64Types > ElfBinary64
type for 64-bit ELF binary
Definition: ElfBinaries.h:483
Types::Nhdr * getNotes()
get note table
Definition: ElfBinaries.h:408
Elf64_Rel Rel
relocation
Definition: ElfBinaries.h:133
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for region
Definition: ElfBinaries.h:627
create map of sections
Definition: ElfBinaries.h:70
cxbyte * binaryCode
pointer to binary code
Definition: ElfBinaries.h:157
static ElfRegionTemplate sectionHeaderTable()
get program header table region
Definition: ElfBinaries.h:692
SymbolIndexMap::const_iterator getSymbolIterEnd() const
get end iterator of symbol index map
Definition: ElfBinaries.h:352
symbol structure to external usage (fo example in the binary generator input)
Definition: ElfBinaries.h:563
ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent *_data, typename Types::Word _align, const char *inName, uint32_t _type, typename Types::SectionFlags _flags, uint32_t _link=0, uint32_t _info=0, typename Types::Word _addrBase=0, typename Types::Word _entSize=0, bool _zeroOffset=false, typename Types::Word _sectAlign=0)
constructor for section with generator
Definition: ElfBinaries.h:655
cxbyte info
info
Definition: ElfBinaries.h:777
if set in field then field has been ignored
Definition: ElfBinaries.h:66
Types::Size dynSymbolsNum
dynamic symbols number
Definition: ElfBinaries.h:170
Types::Word addrBase
section address base
Definition: ElfBinaries.h:603
Elf64_Nhdr Nhdr
note header
Definition: ElfBinaries.h:131
bool dataFromPointer
true if content from pointer, otherwise will be generated from class
Definition: ElfBinaries.h:585
CString name
name of section
Definition: ElfBinaries.h:551
uint64_t align
region alignment
Definition: ElfBinaries.h:554
Elf64_Shdr Shdr
Section header.
Definition: ElfBinaries.h:128
Array< std::pair< const char *, size_t > > SymbolIndexMap
symbol index map
Definition: ElfBinaries.h:153
static ElfRegionTemplate programHeaderTable()
get program header table region
Definition: ElfBinaries.h:687
const cxbyte * getSectionContent(uint16_t index) const
get section content pointer
Definition: ElfBinaries.h:432
Types::Size symbolsNum
symbols number
Definition: ElfBinaries.h:169
Elf32_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:111
Types::Size dynamicEntSize
get dynamic entry size
Definition: ElfBinaries.h:175
an array class
Definition: Containers.h:41
Elf32_Sym Sym
symbol header
Definition: ElfBinaries.h:109
Types::Word entSize
entries size
Definition: ElfBinaries.h:604
if set in field then field has been ignored
Definition: ElfBinaries.h:56
ElfHeaderTemplate< Elf64Types > ElfHeader64
64-bit elf header
Definition: ElfBinaries.h:523
cxbyte * getBinaryCode()
get binary code
Definition: ElfBinaries.h:220
const std::pair< const char *, size_t > * const_iterator
type of constant iterator
Definition: Containers.h:45
void generate(std::ostream &os)
generate binary
Definition: ElfBinaries.h:905
const Types::Sym & getSymbol(const char *name) const
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:388
Types::Phdr & getProgramHeader(uint16_t index)
get program header with specified index
Definition: ElfBinaries.h:264
CString name
name
Definition: ElfBinaries.h:565
Types::Sym & getSymbol(const char *name)
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:392
static ElfRegionTemplate dynamicSection(uint16_t link)
get dynamic
Definition: ElfBinaries.h:729
void clearDynSymbols()
clear dynamic symbols
Definition: ElfBinaries.h:876
static ElfRegionTemplate hashSection(uint16_t link)
get hash section
Definition: ElfBinaries.h:720
const Types::Size getDynamicsNum() const
get dynamic entries number
Definition: ElfBinaries.h:416
size_t descSize
description size
Definition: ElfBinaries.h:738
uint16_t convertSectionId(cxuint sectionIndex, const uint16_t *builtinSections, cxuint maxBuiltinSection, ElfBinSectId extraSectionIndex)
convert section id to elf section id
ELF binary generator.
Definition: ElfBinaries.h:822
if set in field then field has been filled later
Definition: ElfBinaries.h:60
uint32_t info
section info
Definition: ElfBinaries.h:558
const char * getSymbolName(typename Types::Size index) const
get symbol name with specified index
Definition: ElfBinaries.h:308
uint32_t type
section type
Definition: ElfBinaries.h:599
section structure to external usage (for example in the binary generator input)
Definition: ElfBinaries.h:549
Types::Dyn * getDynamicTable()
get dynamic table
Definition: ElfBinaries.h:428
const Types::Sym & getSymbol(typename Types::Size index) const
get symbol with specified index
Definition: ElfBinaries.h:280
void addNote(const ElfNote ¬e)
add note
Definition: ElfBinaries.h:885
void addSymbol(const ElfSymbolTemplate< Types > &symbol)
add symbol
Definition: ElfBinaries.h:879
uint16_t getSectionHeadersNum() const
get section headers number
Definition: ElfBinaries.h:232
static ElfRegionTemplate noteSection()
get note section
Definition: ElfBinaries.h:725
cxbyte * symbolStringTable
pointer to symbol's string table
Definition: ElfBinaries.h:159
Types::Sym & getDynSymbol(typename Types::Size index)
get dynamic symbol with specified index
Definition: ElfBinaries.h:301
elf region content generator for elf region
Definition: ElfBinaries.h:495
const char * name
name
Definition: ElfBinaries.h:775
const char * getSectionName(uint16_t index) const
get section name with specified index
Definition: ElfBinaries.h:322
ElfSymbolTemplate< Elf64Types > ElfSymbol64
64-bit elf symbol
Definition: ElfBinaries.h:818
creation flags for ELF binaries
Definition: ElfBinaries.h:73
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for region with content generator
Definition: ElfBinaries.h:634
Types::Size getNotesSize() const
get size of notes in bytes
Definition: ElfBinaries.h:412
ElfRegionTemplate< Elf64Types > ElfRegion64
64-bit region (for 64-bit elf)
Definition: ElfBinaries.h:746
const char * name
section name
Definition: ElfBinaries.h:598
static const char * bitName
bitness name
Definition: ElfBinaries.h:116
SectionIndexMap::const_iterator getSectionIter(const char *name) const
get section iterator with specified name (requires section index map)
Definition: ElfBinaries.h:333
Types::Size dynamicsNum
get dynamic entries number
Definition: ElfBinaries.h:172
const Types::Shdr & getSectionHeader(const char *name) const
get section header with specified name
Definition: ElfBinaries.h:380
SymbolIndexMap symbolIndexMap
symbol's index map
Definition: ElfBinaries.h:166
ElfProgramHeaderTemplate< Elf64Types > ElfProgramHeader64
64-bit elf program header
Definition: ElfBinaries.h:769
SymbolIndexMap::const_iterator getSymbolIter(const char *name) const
get symbol iterator with specified name (requires symbol index map)
Definition: ElfBinaries.h:360
static ElfRegionTemplate dynsymSection(bool defInfo=true)
get dynsym section
Definition: ElfBinaries.h:715
size_t entSize
entries size
Definition: ElfBinaries.h:559
const cxbyte * getSectionContent(const char *name) const
get section content pointer
Definition: ElfBinaries.h:446
unsigned char cxbyte
unsigned byte
Definition: Config.h:229
void setHeader(const ElfHeaderTemplate< Types > &header)
set elf header
Definition: ElfBinaries.h:864
static const char * bitName
bitness name
Definition: ElfBinaries.h:137
Types::Ehdr & getHeader()
get ELF binary header
Definition: ElfBinaries.h:228
Flags creationFlags
creation flags holder
Definition: ElfBinaries.h:155
ElfSymbolTemplate(const BinSymbol &binSymbol, const uint16_t *builtinSections, cxuint maxBuiltinSection, ElfBinSectId startExtraIndex)
constructor for extra symbol
Definition: ElfBinaries.h:801
main namespace
Definition: AsmDefs.h:38
bool hasDynSymbolMap() const
returns true if object has a dynamic symbol's index map
Definition: ElfBinaries.h:201
uint16_t symbolEntSize
symbol entry size in a symbol's table
Definition: ElfBinaries.h:173
size_t size
size of content
Definition: ElfBinaries.h:552
uint16_t dynSymEntSize
dynamic symbol entry size in a dynamic symbol's table
Definition: ElfBinaries.h:174
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:136
cxbyte other
other
Definition: ElfBinaries.h:571
unsigned int cxuint
unsigned int
Definition: Config.h:237
if set in field then field has been ignored
Definition: ElfBinaries.h:61
size_t getSize() const
get size of binaries
Definition: ElfBinaries.h:205
void addDynamics(size_t dynamicsNum, const int32_t *dynTags)
add dynamic
Definition: ElfBinaries.h:891
const char * name
note name
Definition: ElfBinaries.h:737
ElfRegionTemplate(typename Types::Word _size, const cxbyte *_data, typename Types::Word _align, const char *_name, uint32_t _type, typename Types::SectionFlags _flags, uint32_t _link=0, uint32_t _info=0, typename Types::Word _addrBase=0, typename Types::Word _entSize=0, bool _zeroOffset=false, typename Types::Word _sectAlign=0)
constructor for section
Definition: ElfBinaries.h:641
cxuint ElfBinSectId
type for Elf BinSection Id (sectionIndex)
Definition: ElfBinaries.h:526
bool isElfBinary(size_t binarySize, const cxbyte *binary)
check whether binary data is is ELF binary
bool valueIsAddr
true if value should be treats as address
Definition: ElfBinaries.h:569
uint32_t Size
size used to return size value
Definition: ElfBinaries.h:103
const Types::Nhdr * getNotes() const
get note table
Definition: ElfBinaries.h:404
uint64_t SectionFlags
section flags
Definition: ElfBinaries.h:126
ElfProgramHeaderTemplate< Elf32Types > ElfProgramHeader32
32-bit elf program header
Definition: ElfBinaries.h:767
inlines for accessing memory words in LittleEndian and unaligned
const cxbyte * data
content from pointer
Definition: ElfBinaries.h:594
if set in field then field has been filled later
Definition: ElfBinaries.h:55
ElfSymbolTemplate(const char *_name, uint16_t _sectionIndex, cxbyte _info, cxbyte _other, bool _valueIsAddr, typename Types::Word _value, typename Types::Word _size)
constructor (to replace initializer list construction)
Definition: ElfBinaries.h:788
ELF symbol template.
Definition: ElfBinaries.h:773
Types::Word align
region alignment
Definition: ElfBinaries.h:591
Types::Size getDynSymbolsNum() const
get dynamic symbols number
Definition: ElfBinaries.h:276
cxbyte * dynSymTable
pointer to dynamic symbol table
Definition: ElfBinaries.h:162
uint32_t type
type
Definition: ElfBinaries.h:740
ElfHeaderTemplate< Elf32Types > ElfHeader32
32-bit elf header
Definition: ElfBinaries.h:521
virtual ~BinException() noexcept=default
destructor
SymbolIndexMap dynSymIndexMap
dynamic symbol's index map
Definition: ElfBinaries.h:167
uint16_t getProgramHeadersNum() const
get program headers number
Definition: ElfBinaries.h:252
Elf64_Phdr Phdr
program header
Definition: ElfBinaries.h:129
cxbyte * getSectionContent(const char *name)
get section content pointer
Definition: ElfBinaries.h:450
bool hasSymbolMap() const
returns true if object has a symbol's index map
Definition: ElfBinaries.h:197
Flags getCreationFlags() const
get creation flags
Definition: ElfBinaries.h:189
utilities for other libraries and programs
uint16_t sectionIndex
section index for which symbol is
Definition: ElfBinaries.h:776
ElfRegionType
type of Elf region
Definition: ElfBinaries.h:486
std::string message
message
Definition: Utilities.h:64
uint32_t SectionFlags
section flags
Definition: ElfBinaries.h:105
const cxbyte * getBinaryCode() const
get binary code
Definition: ElfBinaries.h:217
exception class
Definition: Utilities.h:61
cxbyte * sectionStringTable
pointer to section's string table
Definition: ElfBinaries.h:158
cxbyte other
other
Definition: ElfBinaries.h:778
const Types::Phdr & getProgramHeader(uint16_t index) const
get program header with specified index
Definition: ElfBinaries.h:256
Types::Word size
region size
Definition: ElfBinaries.h:590
static ElfRegionTemplate strtabSection()
get .strtab section
Definition: ElfBinaries.h:697
Elf32_Rel Rel
relocation
Definition: ElfBinaries.h:112
class ElfBinaryGenTemplate< Elf32Types > ElfBinaryGen32
type for 32-bit ELF binary generator
Definition: ElfBinaries.h:928
cxuint linkId
link section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:557
static ElfRegionTemplate dynstrSection()
get .dynstr section
Definition: ElfBinaries.h:701
cxbyte * getSectionContent(uint16_t index)
get section content pointer
Definition: ElfBinaries.h:439
if set in field then field has been filled later
Definition: ElfBinaries.h:65
Elf32_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:106
Types::Word size
symbol size
Definition: ElfBinaries.h:781
Types::Size getSymbolsNum() const
get symbols number
Definition: ElfBinaries.h:272
SectionIndexMap sectionIndexMap
section's index map
Definition: ElfBinaries.h:165
Bin exception class.
Definition: ElfBinaries.h:77
Types::Shdr & getSectionHeader(uint16_t index)
get section header with specified index
Definition: ElfBinaries.h:244
const ElfRegionContent * dataGen
content generator pointer
Definition: ElfBinaries.h:595
cxuint sectionId
section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:568
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:114
ElfSymbolTemplate< Elf32Types > ElfSymbol32
32-bit elf symbol
Definition: ElfBinaries.h:816
class ElfBinaryTemplate< Elf32Types > ElfBinary32
type for 32-bit ELF binary
Definition: ElfBinaries.h:481
ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for user region with content generator
Definition: ElfBinaries.h:620
function class that returns true if first C string is less than second
Definition: Utilities.h:313
Types::SectionFlags flags
section flags
Definition: ElfBinaries.h:600
SymbolIndexMap::const_iterator getDynSymbolIter(const char *name) const
get dynamic symbol iterator with specified name (requires dynamic symbol index map) ...
Definition: ElfBinaries.h:370
cxbyte * dynSymStringTable
pointer to dynamic symbol's string table
Definition: ElfBinaries.h:161
Array< std::pair< const char *, size_t > > SectionIndexMap
section index map
Definition: ElfBinaries.h:151
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:135
Types::Sym & getDynSymbol(const char *name)
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:400
Types::Word value
symbol value
Definition: ElfBinaries.h:780
Elf32_Shdr Shdr
Section header.
Definition: ElfBinaries.h:107
const T * end() const
get iterator to after last element
Definition: Containers.h:260
SectionIndexMap::const_iterator getSectionIterEnd() const
get end iterator if section index map
Definition: ElfBinaries.h:329
class ElfBinaryGenTemplate< Elf64Types > ElfBinaryGen64
type for 64-bit ELF binary generator
Definition: ElfBinaries.h:930
Elf32_Phdr Phdr
program header
Definition: ElfBinaries.h:108
ElfRegionTemplate(const BinSection &binSection, const uint16_t *builtinSections, cxuint maxBuiltinSection, ElfBinSectId startExtraIndex)
constructor for external section (BinSection)
Definition: ElfBinaries.h:674
BinException()=default
empty constructor
size_t Size
size used to return size value
Definition: ElfBinaries.h:124
if set in field then field has been filled later
Definition: ElfBinaries.h:50
cxbyte * dynamicTable
pointer to dynamic table
Definition: ElfBinaries.h:164
bool operator!() const
returns true if object is uninitialized
Definition: ElfBinaries.h:213
uint8_t ULEV(const uint8_t &t)
convert from/to little endian value from unaligned memory
simple C-string container
Definition: CString.h:38
ELF 32-bit types.
Definition: ElfBinaries.h:122
containers and other utils for other libraries and programs
const Types::Size getDynamicEntrySize() const
get dynamic entries size
Definition: ElfBinaries.h:420
void clearSymbols()
clear symbols
Definition: ElfBinaries.h:873
cxbyte * noteTable
pointer to note table
Definition: ElfBinaries.h:163
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:115
cxbyte * symbolTable
pointer to symbol table
Definition: ElfBinaries.h:160
create map of dynamic symbols
Definition: ElfBinaries.h:72
uint64_t Word
word size in ELF
Definition: ElfBinaries.h:125
Elf64_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:132
ElfRegionTemplate(typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for user region
Definition: ElfBinaries.h:613