CLRX  1
An unofficial OpenCL extensions designed for Radeon GPUs
ElfBinaries.h
Go to the documentation of this file.
1 /*
2  * CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3  * Copyright (C) 2014-2016 Mateusz Szpakowski
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
23 #ifndef __CLRX_ELFBINARIES_H__
24 #define __CLRX_ELFBINARIES_H__
25 
26 #include <CLRX/Config.h>
27 #include <cstddef>
28 #include <cstdint>
29 #include <climits>
30 #include <string>
31 #include <utility>
32 #include <ostream>
33 #include <CLRX/amdbin/Elf.h>
34 #include <CLRX/utils/MemAccess.h>
35 #include <CLRX/utils/Utilities.h>
36 #include <CLRX/utils/Containers.h>
37 #include <CLRX/utils/InputOutput.h>
38 
39 /* INFO: in this file is used ULEV function for conversion
40  * from LittleEndian and unaligned access to other memory access policy and endianness
41  * Please use this function whenever you want to get or set word in ELF binary,
42  * because ELF binaries can be unaligned in memory (as inner binaries).
43  */
44 
46 namespace CLRX
47 {
48 
49 enum: cxuint {
50  BINGEN_DEFAULT = UINT_MAX,
51  BINGEN_NOTSUPPLIED = UINT_MAX-1
52 };
53 
54 enum: uint64_t {
55  BINGEN64_DEFAULT = UINT64_MAX,
56  BINGEN64_NOTSUPPLIED = UINT64_MAX-1
57 };
58 
59 enum: uint16_t {
60  BINGEN16_DEFAULT = UINT16_MAX,
61  BINGEN16_NOTSUPPLIED = UINT16_MAX-1
62 };
63 
64 enum: uint8_t {
65  BINGEN8_DEFAULT = UINT8_MAX,
66  BINGEN8_NOTSUPPLIED = UINT8_MAX-1
67 };
68 
69 enum : Flags {
74 };
75 
77 struct Elf32Types
78 {
79  typedef uint32_t Size;
80  typedef uint32_t Word;
81  typedef uint32_t SectionFlags;
82  typedef Elf32_Ehdr Ehdr;
83  typedef Elf32_Shdr Shdr;
84  typedef Elf32_Phdr Phdr;
85  typedef Elf32_Sym Sym;
86  typedef Elf32_Nhdr Nhdr;
87  typedef Elf32_Dyn Dyn;
88  static const cxbyte ELFCLASS;
89  static const cxuint bitness;
90  static const char* bitName;
91  static const Word nobase = Word(0)-1;
92 };
93 
95 struct Elf64Types
96 {
97  typedef size_t Size;
98  typedef uint64_t Word;
99  typedef uint64_t SectionFlags;
100  typedef Elf64_Ehdr Ehdr;
101  typedef Elf64_Shdr Shdr;
102  typedef Elf64_Phdr Phdr;
103  typedef Elf64_Sym Sym;
104  typedef Elf64_Nhdr Nhdr;
105  typedef Elf64_Dyn Dyn;
106  static const cxbyte ELFCLASS;
107  static const cxuint bitness;
108  static const char* bitName;
109  static const Word nobase = Word(0)-1;
110 };
111 
113 
116 template<typename Types>
118 {
119 public:
124 protected:
126  size_t binaryCodeSize;
127  cxbyte* binaryCode;
130  cxbyte* symbolTable;
132  cxbyte* dynSymTable;
133  cxbyte* noteTable;
134  cxbyte* dynamicTable;
135  SectionIndexMap sectionIndexMap;
136  SymbolIndexMap symbolIndexMap;
137  SymbolIndexMap dynSymIndexMap;
138 
139  typename Types::Size symbolsNum;
140  typename Types::Size dynSymbolsNum;
141  typename Types::Size noteTableSize;
142  typename Types::Size dynamicsNum;
143  uint16_t symbolEntSize;
144  uint16_t dynSymEntSize;
145  typename Types::Size dynamicEntSize;
146 
147 public:
154  ElfBinaryTemplate(size_t binaryCodeSize, cxbyte* binaryCode,
155  Flags creationFlags = ELF_CREATE_ALL);
156  virtual ~ElfBinaryTemplate();
157 
160  { return creationFlags; }
161 
163  bool hasSectionMap() const
164  { return (creationFlags & ELF_CREATE_SECTIONMAP) != 0; }
165 
167  bool hasSymbolMap() const
168  { return (creationFlags & ELF_CREATE_SYMBOLMAP) != 0; }
169 
171  bool hasDynSymbolMap() const
172  { return (creationFlags & ELF_CREATE_DYNSYMMAP) != 0; }
173 
175  size_t getSize() const
176  { return binaryCodeSize; }
177 
179  operator bool() const
180  { return binaryCode!=nullptr; }
181 
183  bool operator!() const
184  { return binaryCode==nullptr; }
185 
187  const cxbyte* getBinaryCode() const
188  { return binaryCode; }
190  cxbyte* getBinaryCode()
191  { return binaryCode; }
192 
194  const typename Types::Ehdr& getHeader() const
195  { return *reinterpret_cast<const typename Types::Ehdr*>(binaryCode); }
196 
198  typename Types::Ehdr& getHeader()
199  { return *reinterpret_cast<typename Types::Ehdr*>(binaryCode); }
200 
202  uint16_t getSectionHeadersNum() const
203  { return ULEV(getHeader().e_shnum); }
204 
206  const typename Types::Shdr& getSectionHeader(uint16_t index) const
207  {
208  const typename Types::Ehdr& ehdr = getHeader();
209  return *reinterpret_cast<const typename Types::Shdr*>(binaryCode +
210  ULEV(ehdr.e_shoff) + size_t(ULEV(ehdr.e_shentsize))*index);
211  }
212 
214  typename Types::Shdr& getSectionHeader(uint16_t index)
215  {
216  const typename Types::Ehdr& ehdr = getHeader();
217  return *reinterpret_cast<typename Types::Shdr*>(binaryCode +
218  ULEV(ehdr.e_shoff) + size_t(ULEV(ehdr.e_shentsize))*index);
219  }
220 
222  uint16_t getProgramHeadersNum() const
223  { return ULEV(getHeader().e_phnum); }
224 
226  const typename Types::Phdr& getProgramHeader(uint16_t index) const
227  {
228  const typename Types::Ehdr& ehdr = getHeader();
229  return *reinterpret_cast<const typename Types::Phdr*>(binaryCode +
230  ULEV(ehdr.e_phoff) + size_t(ULEV(ehdr.e_phentsize))*index);
231  }
232 
234  typename Types::Phdr& getProgramHeader(uint16_t index)
235  {
236  const typename Types::Ehdr& ehdr = getHeader();
237  return *reinterpret_cast<typename Types::Phdr*>(binaryCode +
238  ULEV(ehdr.e_phoff) + size_t(ULEV(ehdr.e_phentsize))*index);
239  }
240 
242  typename Types::Size getSymbolsNum() const
243  { return symbolsNum; }
244 
246  typename Types::Size getDynSymbolsNum() const
247  { return dynSymbolsNum; }
248 
250  const typename Types::Sym& getSymbol(typename Types::Size index) const
251  {
252  return *reinterpret_cast<const typename Types::Sym*>(symbolTable +
253  size_t(index)*symbolEntSize);
254  }
255 
257  typename Types::Sym& getSymbol(typename Types::Size index)
258  {
259  return *reinterpret_cast<typename Types::Sym*>(
260  symbolTable + size_t(index)*symbolEntSize);
261  }
262 
264  const typename Types::Sym& getDynSymbol(typename Types::Size index) const
265  {
266  return *reinterpret_cast<const typename Types::Sym*>(dynSymTable +
267  size_t(index)*dynSymEntSize);
268  }
269 
271  typename Types::Sym& getDynSymbol(typename Types::Size index)
272  {
273  return *reinterpret_cast<typename Types::Sym*>(dynSymTable +
274  size_t(index)*dynSymEntSize);
275  }
276 
278  const char* getSymbolName(typename Types::Size index) const
279  {
280  const typename Types::Sym& sym = getSymbol(index);
281  return reinterpret_cast<const char*>(symbolStringTable + ULEV(sym.st_name));
282  }
283 
285  const char* getDynSymbolName(typename Types::Size index) const
286  {
287  const typename Types::Sym& sym = getDynSymbol(index);
288  return reinterpret_cast<const char*>(dynSymStringTable + ULEV(sym.st_name));
289  }
290 
292  const char* getSectionName(uint16_t index) const
293  {
294  const typename Types::Shdr& section = getSectionHeader(index);
295  return reinterpret_cast<const char*>(sectionStringTable + ULEV(section.sh_name));
296  }
297 
300  { return sectionIndexMap.end(); }
301 
304  {
306  sectionIndexMap.begin(), sectionIndexMap.end(), name, CStringLess());
307  if (it == sectionIndexMap.end())
308  throw Exception(std::string("Can't find Elf")+Types::bitName+" Section");
309  return it;
310  }
311 
313  uint16_t getSectionIndex(const char* name) const;
314 
316  typename Types::Size getSymbolIndex(const char* name) const;
317 
319  typename Types::Size getDynSymbolIndex(const char* name) const;
320 
323  { return symbolIndexMap.end(); }
324 
327  { return dynSymIndexMap.end(); }
328 
331  {
333  symbolIndexMap.begin(), symbolIndexMap.end(), name, CStringLess());
334  if (it == symbolIndexMap.end())
335  throw Exception(std::string("Can't find Elf")+Types::bitName+" Symbol");
336  return it;
337  }
338 
341  {
343  dynSymIndexMap.begin(), dynSymIndexMap.end(), name, CStringLess());
344  if (it == dynSymIndexMap.end())
345  throw Exception(std::string("Can't find Elf")+Types::bitName+" DynSymbol");
346  return it;
347  }
348 
350  const typename Types::Shdr& getSectionHeader(const char* name) const
351  { return getSectionHeader(getSectionIndex(name)); }
352 
354  typename Types::Shdr& getSectionHeader(const char* name)
355  { return getSectionHeader(getSectionIndex(name)); }
356 
358  const typename Types::Sym& getSymbol(const char* name) const
359  { return getSymbol(getSymbolIndex(name)); }
360 
362  typename Types::Sym& getSymbol(const char* name)
363  { return getSymbol(getSymbolIndex(name)); }
364 
366  const typename Types::Sym& getDynSymbol(const char* name) const
367  { return getDynSymbol(getDynSymbolIndex(name)); }
368 
370  typename Types::Sym& getDynSymbol(const char* name)
371  { return getDynSymbol(getDynSymbolIndex(name)); }
372 
374  const typename Types::Nhdr* getNotes() const
375  { return reinterpret_cast<typename Types::Nhdr*>(noteTable); }
376 
378  typename Types::Nhdr* getNotes()
379  { return reinterpret_cast<typename Types::Nhdr*>(noteTable); }
380 
381  typename Types::Size getNotesSize() const
382  { return noteTableSize; }
383 
385  const typename Types::Size getDynamicsNum() const
386  { return dynamicsNum; }
387 
389  const typename Types::Size getDynamicEntrySize() const
390  { return dynamicEntSize; }
391 
393  const typename Types::Dyn* getDynamicTable() const
394  { return reinterpret_cast<const typename Types::Dyn*>(dynamicTable); }
395 
397  typename Types::Dyn* getDynamicTable()
398  { return reinterpret_cast<typename Types::Dyn*>(dynamicTable); }
399 
401  const cxbyte* getSectionContent(uint16_t index) const
402  {
403  const typename Types::Shdr& shdr = getSectionHeader(index);
404  return binaryCode + ULEV(shdr.sh_offset);
405  }
406 
408  cxbyte* getSectionContent(uint16_t index)
409  {
410  typename Types::Shdr& shdr = getSectionHeader(index);
411  return binaryCode + ULEV(shdr.sh_offset);
412  }
413 
415  const cxbyte* getSectionContent(const char* name) const
416  { return getSectionContent(getSectionIndex(name)); }
417 
419  cxbyte* getSectionContent(const char* name)
420  { return getSectionContent(getSectionIndex(name)); }
421 };
422 
423 extern template class ElfBinaryTemplate<Elf32Types>;
424 extern template class ElfBinaryTemplate<Elf64Types>;
425 
427 extern bool isElfBinary(size_t binarySize, const cxbyte* binary);
428 
433 
435 enum class ElfRegionType: cxbyte
436 {
437  PHDR_TABLE,
438  SHDR_TABLE,
439  SECTION,
440  USER
441 };
442 
445 {
446 public:
447  virtual ~ElfRegionContent();
448 
450  virtual void operator()(FastOutputBuffer& fob) const = 0;
451 };
452 
454 template<typename Types>
456 {
457  typename Types::Word paddrBase;
458  typename Types::Word vaddrBase;
459  cxbyte osABI;
460  cxbyte abiVersion;
461  uint16_t type;
462  uint16_t machine;
463  uint32_t version;
464  cxuint entryRegion;
465  typename Types::Word entry;
466  uint32_t flags;
467 };
468 
473 
474 
475 enum: cxuint {
476  ELFSECTID_START = UINT_MAX-255,
477  ELFSECTID_SHSTRTAB = ELFSECTID_START,
478  ELFSECTID_STRTAB,
479  ELFSECTID_SYMTAB,
480  ELFSECTID_DYNSTR,
481  ELFSECTID_DYNSYM,
482  ELFSECTID_TEXT,
483  ELFSECTID_RODATA,
484  ELFSECTID_DATA,
485  ELFSECTID_BSS,
486  ELFSECTID_COMMENT,
487  ELFSECTID_STD_MAX = ELFSECTID_COMMENT,
488  ELFSECTID_OTHER_BUILTIN = ELFSECTID_STD_MAX+1,
489  ELFSECTID_NULL = UINT_MAX-2,
490  ELFSECTID_ABS = UINT_MAX-1,
491  ELFSECTID_UNDEF = UINT_MAX
492 };
493 
496 {
498  size_t size;
499  const cxbyte* data;
500  uint64_t align;
501  uint32_t type;
502  uint64_t flags;
503  cxuint linkId;
504  uint32_t info;
505  size_t entSize;
506 };
507 
509 struct BinSymbol
510 {
512  uint64_t value;
513  uint64_t size;
514  cxuint sectionId;
515  bool valueIsAddr;
516  cxbyte info;
517  cxbyte other;
518 };
519 
521 extern uint16_t convertSectionId(cxuint sectionIndex, const uint16_t* builtinSections,
522  cxuint maxBuiltinSection, cxuint extraSectionIndex);
523 
525 template<typename Types>
527 {
529 
532 
534 
536  typename Types::Word size;
537  typename Types::Word align;
538  union
539  {
540  const cxbyte* data;
542  };
543  struct {
544  const char* name;
545  uint32_t type;
546  typename Types::SectionFlags flags;
547  uint32_t link;
548  uint32_t info;
549  typename Types::Word addrBase;
550  typename Types::Word entSize;
551  bool zeroOffset;
552  typename Types::Word align;
553  } section;
554 
555  ElfRegionTemplate() : type(ElfRegionType::USER), dataFromPointer(false), size(0),
556  align(0), data(0)
557  { }
559  ElfRegionTemplate(typename Types::Word _size,
560  const cxbyte* _data, typename Types::Word _align)
561  : type(ElfRegionType::USER), dataFromPointer(true), size(_size),
562  align(_align), data(_data)
563  { }
564 
566  ElfRegionTemplate(typename Types::Word _size,
567  const ElfRegionContent* contentGen, typename Types::Word _align)
568  : type(ElfRegionType::USER), dataFromPointer(false), size(_size),
569  align(_align), dataGen(contentGen)
570  { }
571 
573  ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size,
574  const cxbyte* _data, typename Types::Word _align)
575  : type(_type), dataFromPointer(true), size(_size),
576  align(_align), data(_data)
577  { }
578 
580  ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size,
581  const ElfRegionContent* contentGen, typename Types::Word _align)
582  : type(_type), dataFromPointer(false), size(_size),
583  align(_align), dataGen(contentGen)
584  { }
585 
587  ElfRegionTemplate(typename Types::Word _size, const cxbyte* _data,
588  typename Types::Word _align, const char* _name, uint32_t _type,
589  typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
590  typename Types::Word _addrBase = 0,
591  typename Types::Word _entSize = 0, bool _zeroOffset = false,
592  typename Types::Word _sectAlign = 0)
593  : type(ElfRegionType::SECTION), dataFromPointer(true), size(_size),
594  align(_align), data(_data)
595  {
596  section = {_name, _type, _flags, _link, _info, _addrBase,
597  _entSize, _zeroOffset, _sectAlign};
598  }
599 
601  ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent* _data,
602  typename Types::Word _align, const char* inName, uint32_t _type,
603  typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
604  typename Types::Word _addrBase = 0,
605  typename Types::Word _entSize = 0, bool _zeroOffset = false,
606  typename Types::Word _sectAlign = 0)
607  : type(ElfRegionType::SECTION), dataFromPointer(false), size(_size),
608  align(_align), dataGen(_data)
609  {
610  section = {inName, _type, _flags, _link, _info, _addrBase,
611  _entSize, _zeroOffset, _sectAlign};
612  }
614 
620  ElfRegionTemplate(const BinSection& binSection, const uint16_t* builtinSections,
621  cxuint maxBuiltinSection, cxuint startExtraIndex)
622  : type(ElfRegionType::SECTION), dataFromPointer(true), size(binSection.size),
623  align(binSection.align), data(binSection.data)
624  {
625  section = { binSection.name.c_str(), binSection.type,
626  typename Types::SectionFlags(binSection.flags),
627  uint32_t(convertSectionId(binSection.linkId, builtinSections,
628  maxBuiltinSection, startExtraIndex)),
629  binSection.info, 0, typename Types::Word(binSection.entSize), 0 };
630  }
631 
634  { return ElfRegionTemplate(ElfRegionType::PHDR_TABLE, 0, (const cxbyte*)nullptr,
635  sizeof(typename Types::Word)); }
636 
639  { return ElfRegionTemplate(ElfRegionType::SHDR_TABLE, 0, (const cxbyte*)nullptr,
640  sizeof(typename Types::Word)); }
641 
644  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".strtab", SHT_STRTAB, 0); }
645 
648  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".dynstr", SHT_STRTAB,
649  SHF_ALLOC); }
650 
653  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".shstrtab", SHT_STRTAB, 0); }
654 
657  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
658  ".symtab", SHT_SYMTAB, 0); }
659 
662  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
663  ".dynsym", SHT_DYNSYM, SHF_ALLOC); }
664 
666  static ElfRegionTemplate hashSection(uint16_t link)
667  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
668  ".hash", SHT_HASH, SHF_ALLOC, link); }
669 
672  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 4, ".note", SHT_NOTE, 0); }
673 
675  static ElfRegionTemplate dynamicSection(uint16_t link)
676  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
677  ".dynamic", SHT_DYNAMIC, SHF_ALLOC|SHF_WRITE, link); }
678 };
679 
680 struct ElfNote
681 {
682  const char* name;
683  size_t descSize;
684  const cxbyte* desc;
685  uint32_t type;
686 };
687 
692 
693 enum: cxuint {
694  PHREGION_FILESTART = UINT_MAX
695 };
697 template<typename Types>
699 {
700  uint32_t type;
701  uint32_t flags;
702  cxuint regionStart;
703  cxuint regionsNum;
704  bool haveMemSize;
705  typename Types::Word paddrBase;
706  typename Types::Word vaddrBase;
707  typename Types::Word memSize;
708  typename Types::Word align;
709 };
710 
715 
717 template<typename Types>
719 {
720  const char* name;
721  uint16_t sectionIndex;
722  cxbyte info;
723  cxbyte other;
724  bool valueIsAddr;
725  typename Types::Word value;
726  typename Types::Word size;
727 
728  ElfSymbolTemplate() : name(nullptr), sectionIndex(0), info(0), other(0),
729  valueIsAddr(false), value(0), size(0)
730  { }
731 
733  ElfSymbolTemplate(const char* _name, uint16_t _sectionIndex,
734  cxbyte _info, cxbyte _other, bool _valueIsAddr,
735  typename Types::Word _value, typename Types::Word _size)
736  : name(_name), sectionIndex(_sectionIndex), info(_info), other(_other),
737  valueIsAddr(_valueIsAddr), value(_value), size(_size)
738  { }
740 
746  ElfSymbolTemplate(const BinSymbol& binSymbol, const uint16_t* builtinSections,
747  cxuint maxBuiltinSection, cxuint startExtraIndex)
748  {
749  name = binSymbol.name.c_str();
750  sectionIndex = convertSectionId(binSymbol.sectionId, builtinSections,
751  maxBuiltinSection, startExtraIndex);
752  info = binSymbol.info;
753  other = binSymbol.other;
754  valueIsAddr = binSymbol.valueIsAddr;
755  value = binSymbol.value;
756  size = binSymbol.size;
757  }
758 };
759 
764 
766 template<typename Types>
768 {
769 private:
770  bool sizeComputed;
771  bool addNullSym, addNullDynSym;
772  bool addNullSection;
773  cxuint addrStartRegion;
774  uint16_t shStrTab, strTab, dynStr;
775  cxuint shdrTabRegion, phdrTabRegion;
776  uint16_t sectionsNum;
777  typename Types::Word size;
779  std::vector<ElfRegionTemplate<Types> > regions;
780  std::unique_ptr<typename Types::Word[]> regionOffsets;
781  std::unique_ptr<typename Types::Word[]> regionAddresses;
782  std::unique_ptr<cxuint[]> sectionRegions;
783  std::vector<ElfProgramHeaderTemplate<Types> > progHeaders;
784  std::vector<ElfSymbolTemplate<Types> > symbols;
785  std::vector<ElfSymbolTemplate<Types> > dynSymbols;
786  std::vector<ElfNote> notes;
787  std::vector<int32_t> dynamics;
788  std::unique_ptr<typename Types::Word[]> dynamicValues;
789  uint32_t bucketsNum;
790  std::unique_ptr<uint32_t[]> hashCodes;
791  bool isHashDynSym;
792 
793  void computeSize();
794 public:
797 
804  explicit ElfBinaryGenTemplate(const ElfHeaderTemplate<Types>& header,
805  bool addNullSym = true, bool addNullDynSym = true,
806  bool addNullSection = true, cxuint addrCountingFromRegion = 0);
807 
810  { this->header = header; }
811 
813  void addRegion(const ElfRegionTemplate<Types>& region);
815  void addProgramHeader(const ElfProgramHeaderTemplate<Types>& progHeader);
816 
819  { symbols.push_back(symbol); }
822  { dynSymbols.push_back(symbol); }
824  void addNote(const ElfNote& note)
825  { notes.push_back(note); }
827  void addDynamic(int32_t dynamicTag)
828  { dynamics.push_back(dynamicTag); }
830  void addDynamics(size_t dynamicsNum, const int32_t* dynTags)
831  { dynamics.insert(dynamics.end(), dynTags, dynTags + dynamicsNum); }
832 
834  uint64_t countSize();
835 
837  void generate(FastOutputBuffer& fob);
838 
840  void generate(std::ostream& os)
841  {
842  FastOutputBuffer fob(256, os);
843  generate(fob);
844  }
845 };
846 
847 extern template class ElfBinaryGenTemplate<Elf32Types>;
848 extern template class ElfBinaryGenTemplate<Elf64Types>;
849 
854 
855 };
856 
857 #endif
const char * getDynSymbolName(typename Types::Size index) const
get dynamic symbol name with specified index
Definition: ElfBinaries.h:285
Types::Word memSize
size in memory
Definition: ElfBinaries.h:707
const Types::Sym & getDynSymbol(typename Types::Size index) const
get dynamic symbol with specified index
Definition: ElfBinaries.h:264
const Types::Shdr & getSectionHeader(uint16_t index) const
get section header with specified index
Definition: ElfBinaries.h:206
uint32_t link
section link
Definition: ElfBinaries.h:547
Definition: ElfBinaries.h:680
ElfSymbolTemplate(const BinSymbol &binSymbol, const uint16_t *builtinSections, cxuint maxBuiltinSection, cxuint startExtraIndex)
constructor for extra symbol
Definition: ElfBinaries.h:746
uint32_t Word
word size in ELF
Definition: ElfBinaries.h:80
SymbolIndexMap::const_iterator getDynSymbolIterEnd() const
get end iterator of dynamic symbol index map
Definition: ElfBinaries.h:326
Elf64_Sym Sym
symbol header
Definition: ElfBinaries.h:103
program header table
void addDynamic(int32_t dynamicTag)
add dynamic
Definition: ElfBinaries.h:827
Elf64_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:100
if set in field then field has been ignored
Definition: ElfBinaries.h:56
const cxbyte * data
data content
Definition: ElfBinaries.h:499
cxbyte info
info
Definition: ElfBinaries.h:516
Types::Shdr & getSectionHeader(const char *name)
get section header with specified name
Definition: ElfBinaries.h:354
ELF binary class.
Definition: ElfBinaries.h:117
Types::Word paddrBase
physical address base
Definition: ElfBinaries.h:457
Types::Size noteTableSize
size of note table
Definition: ElfBinaries.h:141
Definition: Elf.h:69
uint32_t type
section type
Definition: ElfBinaries.h:501
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:97
Definition: Elf.h:240
const Types::Ehdr & getHeader() const
get ELF binary header
Definition: ElfBinaries.h:194
const T * begin() const
get iterator to first element
Definition: Containers.h:249
Elf32_Nhdr Nhdr
note header
Definition: ElfBinaries.h:86
Types::Word vaddrBase
vaddr base
Definition: ElfBinaries.h:706
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:385
size_t binaryCodeSize
binary code size
Definition: ElfBinaries.h:126
ElfRegionType type
type of region
Definition: ElfBinaries.h:528
fast and direct output buffer
Definition: InputOutput.h:350
const char * c_str() const
return C-style string pointer
Definition: CString.h:245
uint32_t info
section info
Definition: ElfBinaries.h:548
template of ElfRegion
Definition: ElfBinaries.h:526
static ElfRegionTemplate shstrtabSection()
get .shstrtab section
Definition: ElfBinaries.h:652
uint64_t flags
section flags
Definition: ElfBinaries.h:502
elf header template
Definition: ElfBinaries.h:455
void addDynSymbol(const ElfSymbolTemplate< Types > &symbol)
add dynamic symbol
Definition: ElfBinaries.h:821
Types::Sym & getSymbol(typename Types::Size index)
get symbol with specified index
Definition: ElfBinaries.h:257
uint64_t value
symbol value
Definition: ElfBinaries.h:512
const Types::Sym & getDynSymbol(const char *name) const
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:366
uint64_t size
symbol size
Definition: ElfBinaries.h:513
const Types::Dyn * getDynamicTable() const
get dynamic table
Definition: ElfBinaries.h:393
bool hasSectionMap() const
returns true if object has a section&#39;s index map
Definition: ElfBinaries.h:163
bool valueIsAddr
true if value should be treats as address
Definition: ElfBinaries.h:724
ELF 32-bit types.
Definition: ElfBinaries.h:77
ElfRegionTemplate< Elf32Types > ElfRegion32
32-bit region (for 32-bit elf)
Definition: ElfBinaries.h:689
Definition: Elf.h:349
section header table
bool haveMemSize
true if program header has memory size
Definition: ElfBinaries.h:704
class ElfBinaryTemplate< Elf64Types > ElfBinary64
type for 64-bit ELF binary
Definition: ElfBinaries.h:432
Types::Nhdr * getNotes()
get note table
Definition: ElfBinaries.h:378
static const Word nobase
address with zero base
Definition: ElfBinaries.h:91
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for region
Definition: ElfBinaries.h:573
cxbyte * binaryCode
pointer to binary code
Definition: ElfBinaries.h:127
static ElfRegionTemplate sectionHeaderTable()
get program header table region
Definition: ElfBinaries.h:638
if set in field then field has been filled later
Definition: ElfBinaries.h:50
SymbolIndexMap::const_iterator getSymbolIterEnd() const
get end iterator of symbol index map
Definition: ElfBinaries.h:322
symbol structure to external usage (fo example in the binary generator input)
Definition: ElfBinaries.h:509
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:601
cxbyte info
info
Definition: ElfBinaries.h:722
Types::Size dynSymbolsNum
dynamic symbols number
Definition: ElfBinaries.h:140
Types::Word addrBase
section address base
Definition: ElfBinaries.h:549
Elf64_Nhdr Nhdr
note header
Definition: ElfBinaries.h:104
bool dataFromPointer
true if content from pointer, otherwise will be generated from class
Definition: ElfBinaries.h:531
CString name
name of section
Definition: ElfBinaries.h:497
uint64_t align
region alignment
Definition: ElfBinaries.h:500
Elf64_Shdr Shdr
Section header.
Definition: ElfBinaries.h:101
Array< std::pair< const char *, size_t > > SymbolIndexMap
symbol index map
Definition: ElfBinaries.h:123
static ElfRegionTemplate programHeaderTable()
get program header table region
Definition: ElfBinaries.h:633
const cxbyte * getSectionContent(uint16_t index) const
get section content pointer
Definition: ElfBinaries.h:401
Types::Size symbolsNum
symbols number
Definition: ElfBinaries.h:139
if set in field then field has been filled later
Definition: ElfBinaries.h:60
Elf32_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:87
Types::Size dynamicEntSize
get dynamic entry size
Definition: ElfBinaries.h:145
an array class
Definition: Containers.h:38
Elf32_Sym Sym
symbol header
Definition: ElfBinaries.h:85
Types::Word entSize
entries size
Definition: ElfBinaries.h:550
uint16_t convertSectionId(cxuint sectionIndex, const uint16_t *builtinSections, cxuint maxBuiltinSection, cxuint extraSectionIndex)
convert section id to elf section id
cxbyte abiVersion
ABI version.
Definition: ElfBinaries.h:460
uint32_t version
version
Definition: ElfBinaries.h:463
static ElfRegionTemplate symtabSection()
get symtab section
Definition: ElfBinaries.h:656
ElfHeaderTemplate< Elf64Types > ElfHeader64
64-bit elf header
Definition: ElfBinaries.h:472
cxbyte * getBinaryCode()
get binary code
Definition: ElfBinaries.h:190
const std::pair< const char *, size_t > * const_iterator
type of constant iterator
Definition: Containers.h:42
void generate(std::ostream &os)
generate binary
Definition: ElfBinaries.h:840
const Types::Sym & getSymbol(const char *name) const
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:358
Types::Phdr & getProgramHeader(uint16_t index)
get program header with specified index
Definition: ElfBinaries.h:234
CString name
name
Definition: ElfBinaries.h:511
Types::Sym & getSymbol(const char *name)
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:362
static ElfRegionTemplate dynamicSection(uint16_t link)
get dynamic
Definition: ElfBinaries.h:675
static ElfRegionTemplate hashSection(uint16_t link)
get hash section
Definition: ElfBinaries.h:666
const Types::Size getDynamicsNum() const
get dynamic entries number
Definition: ElfBinaries.h:385
Definition: Elf.h:605
create map of sections
Definition: ElfBinaries.h:70
if set in field then field has been ignored
Definition: ElfBinaries.h:66
ELF binary generator.
Definition: ElfBinaries.h:767
uint32_t info
section info
Definition: ElfBinaries.h:504
const char * getSymbolName(typename Types::Size index) const
get symbol name with specified index
Definition: ElfBinaries.h:278
uint32_t type
section type
Definition: ElfBinaries.h:545
section structure to external usage (for example in the binary generator input)
Definition: ElfBinaries.h:495
Types::Dyn * getDynamicTable()
get dynamic table
Definition: ElfBinaries.h:397
const Types::Sym & getSymbol(typename Types::Size index) const
get symbol with specified index
Definition: ElfBinaries.h:250
void addNote(const ElfNote &note)
add note
Definition: ElfBinaries.h:824
void addSymbol(const ElfSymbolTemplate< Types > &symbol)
add symbol
Definition: ElfBinaries.h:818
uint16_t getSectionHeadersNum() const
get section headers number
Definition: ElfBinaries.h:202
static ElfRegionTemplate noteSection()
get note section
Definition: ElfBinaries.h:671
cxbyte * symbolStringTable
pointer to symbol&#39;s string table
Definition: ElfBinaries.h:129
Types::Sym & getDynSymbol(typename Types::Size index)
get dynamic symbol with specified index
Definition: ElfBinaries.h:271
elf region content generator for elf region
Definition: ElfBinaries.h:444
const char * name
name
Definition: ElfBinaries.h:720
cxuint regionsNum
number of regions whose is in program header data
Definition: ElfBinaries.h:703
cxbyte osABI
os abi
Definition: ElfBinaries.h:459
const char * getSectionName(uint16_t index) const
get section name with specified index
Definition: ElfBinaries.h:292
ElfSymbolTemplate< Elf64Types > ElfSymbol64
64-bit elf symbol
Definition: ElfBinaries.h:763
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for region with content generator
Definition: ElfBinaries.h:580
ElfRegionTemplate< Elf64Types > ElfRegion64
64-bit region (for 64-bit elf)
Definition: ElfBinaries.h:691
const char * name
section name
Definition: ElfBinaries.h:544
input output utilities
static const char * bitName
bitness name
Definition: ElfBinaries.h:90
SectionIndexMap::const_iterator getSectionIter(const char *name) const
get section iterator with specified name (requires section index map)
Definition: ElfBinaries.h:303
Types::Size dynamicsNum
get dynamic entries number
Definition: ElfBinaries.h:142
const Types::Shdr & getSectionHeader(const char *name) const
get section header with specified name
Definition: ElfBinaries.h:350
SymbolIndexMap symbolIndexMap
symbol&#39;s index map
Definition: ElfBinaries.h:136
ElfProgramHeaderTemplate< Elf64Types > ElfProgramHeader64
64-bit elf program header
Definition: ElfBinaries.h:714
SymbolIndexMap::const_iterator getSymbolIter(const char *name) const
get symbol iterator with specified name (requires symbol index map)
Definition: ElfBinaries.h:330
size_t entSize
entries size
Definition: ElfBinaries.h:505
const cxbyte * getSectionContent(const char *name) const
get section content pointer
Definition: ElfBinaries.h:415
uint32_t flags
flags
Definition: ElfBinaries.h:466
void setHeader(const ElfHeaderTemplate< Types > &header)
set elf header
Definition: ElfBinaries.h:809
static const char * bitName
bitness name
Definition: ElfBinaries.h:108
Types::Ehdr & getHeader()
get ELF binary header
Definition: ElfBinaries.h:198
Flags creationFlags
creation flags holder
Definition: ElfBinaries.h:125
uint32_t flags
flags
Definition: ElfBinaries.h:701
Types::Word entry
entry offset relative to region
Definition: ElfBinaries.h:465
main namespace
Definition: AsmFormats.h:41
bool hasDynSymbolMap() const
returns true if object has a dynamic symbol&#39;s index map
Definition: ElfBinaries.h:171
uint16_t symbolEntSize
symbol entry size in a symbol&#39;s table
Definition: ElfBinaries.h:143
size_t size
size of content
Definition: ElfBinaries.h:498
uint16_t dynSymEntSize
dynamic symbol entry size in a dynamic symbol&#39;s table
Definition: ElfBinaries.h:144
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:107
cxbyte other
other
Definition: ElfBinaries.h:517
size_t getSize() const
get size of binaries
Definition: ElfBinaries.h:175
void addDynamics(size_t dynamicsNum, const int32_t *dynTags)
add dynamic
Definition: ElfBinaries.h:830
Definition: Elf.h:548
cxuint entryRegion
region in which is entry
Definition: ElfBinaries.h:464
creation flags for ELF binaries
Definition: ElfBinaries.h:73
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:587
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:515
uint32_t Size
size used to return size value
Definition: ElfBinaries.h:79
const Types::Nhdr * getNotes() const
get note table
Definition: ElfBinaries.h:374
uint64_t SectionFlags
section flags
Definition: ElfBinaries.h:99
ElfProgramHeaderTemplate< Elf32Types > ElfProgramHeader32
32-bit elf program header
Definition: ElfBinaries.h:712
inlines for accessing memory words in LittleEndian and unaligned
Types::Word vaddrBase
virtual address base
Definition: ElfBinaries.h:458
Definition: Elf.h:541
const cxbyte * data
content from pointer
Definition: ElfBinaries.h:540
if set in field then field has been filled later
Definition: ElfBinaries.h:65
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:733
ELF symbol template.
Definition: ElfBinaries.h:718
Types::Word align
region alignment
Definition: ElfBinaries.h:537
Types::Size getDynSymbolsNum() const
get dynamic symbols number
Definition: ElfBinaries.h:246
cxbyte * dynSymTable
pointer to dynamic symbol table
Definition: ElfBinaries.h:132
ElfHeaderTemplate< Elf32Types > ElfHeader32
32-bit elf header
Definition: ElfBinaries.h:470
Definition: Elf.h:615
template of ELF program header
Definition: ElfBinaries.h:698
SymbolIndexMap dynSymIndexMap
dynamic symbol&#39;s index map
Definition: ElfBinaries.h:137
uint16_t getProgramHeadersNum() const
get program headers number
Definition: ElfBinaries.h:222
Elf64_Phdr Phdr
program header
Definition: ElfBinaries.h:102
cxbyte * getSectionContent(const char *name)
get section content pointer
Definition: ElfBinaries.h:419
bool hasSymbolMap() const
returns true if object has a symbol&#39;s index map
Definition: ElfBinaries.h:167
Flags getCreationFlags() const
get creation flags
Definition: ElfBinaries.h:159
if set in field then field has been filled later
Definition: ElfBinaries.h:55
utilities for other libraries and programs
uint16_t sectionIndex
section index for which symbol is
Definition: ElfBinaries.h:721
ElfRegionType
type of Elf region
Definition: ElfBinaries.h:435
uint32_t SectionFlags
section flags
Definition: ElfBinaries.h:81
const cxbyte * getBinaryCode() const
get binary code
Definition: ElfBinaries.h:187
exception class
Definition: Utilities.h:58
cxbyte * sectionStringTable
pointer to section&#39;s string table
Definition: ElfBinaries.h:128
cxbyte other
other
Definition: ElfBinaries.h:723
const Types::Phdr & getProgramHeader(uint16_t index) const
get program header with specified index
Definition: ElfBinaries.h:226
Types::Word size
region size
Definition: ElfBinaries.h:536
static ElfRegionTemplate strtabSection()
get .strtab section
Definition: ElfBinaries.h:643
if set in field then field has been ignored
Definition: ElfBinaries.h:51
class ElfBinaryGenTemplate< Elf32Types > ElfBinaryGen32
type for 32-bit ELF binary generator
Definition: ElfBinaries.h:851
cxuint linkId
link section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:503
uint32_t type
type
Definition: ElfBinaries.h:700
static ElfRegionTemplate dynstrSection()
get .dynstr section
Definition: ElfBinaries.h:647
cxbyte * getSectionContent(uint16_t index)
get section content pointer
Definition: ElfBinaries.h:408
Elf32_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:82
Types::Word size
symbol size
Definition: ElfBinaries.h:726
Types::Size getSymbolsNum() const
get symbols number
Definition: ElfBinaries.h:242
SectionIndexMap sectionIndexMap
section&#39;s index map
Definition: ElfBinaries.h:135
Types::Shdr & getSectionHeader(uint16_t index)
get section header with specified index
Definition: ElfBinaries.h:214
create map of symbols
Definition: ElfBinaries.h:71
const ElfRegionContent * dataGen
content generator pointer
Definition: ElfBinaries.h:541
cxuint sectionId
section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:514
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:88
create map of dynamic symbols
Definition: ElfBinaries.h:72
ElfSymbolTemplate< Elf32Types > ElfSymbol32
32-bit elf symbol
Definition: ElfBinaries.h:761
class ElfBinaryTemplate< Elf32Types > ElfBinary32
type for 32-bit ELF binary
Definition: ElfBinaries.h:430
ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for user region with content generator
Definition: ElfBinaries.h:566
function class that returns true if first C string is less than second
Definition: Utilities.h:298
Types::Word paddrBase
paddr base
Definition: ElfBinaries.h:705
Types::SectionFlags flags
section flags
Definition: ElfBinaries.h:546
SymbolIndexMap::const_iterator getDynSymbolIter(const char *name) const
get dynamic symbol iterator with specified name (requires dynamic symbol index map) ...
Definition: ElfBinaries.h:340
Definition: Elf.h:489
cxbyte * dynSymStringTable
pointer to dynamic symbol&#39;s string table
Definition: ElfBinaries.h:131
Array< std::pair< const char *, size_t > > SectionIndexMap
section index map
Definition: ElfBinaries.h:121
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:106
uint16_t machine
machine
Definition: ElfBinaries.h:462
uint16_t type
type
Definition: ElfBinaries.h:461
Definition: Elf.h:359
Types::Sym & getDynSymbol(const char *name)
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:370
Types::Word value
symbol value
Definition: ElfBinaries.h:725
Elf32_Shdr Shdr
Section header.
Definition: ElfBinaries.h:83
const T * end() const
get iterator to after last element
Definition: Containers.h:256
SectionIndexMap::const_iterator getSectionIterEnd() const
get end iterator if section index map
Definition: ElfBinaries.h:299
class ElfBinaryGenTemplate< Elf64Types > ElfBinaryGen64
type for 64-bit ELF binary generator
Definition: ElfBinaries.h:853
Elf32_Phdr Phdr
program header
Definition: ElfBinaries.h:84
Definition: Elf.h:477
size_t Size
size used to return size value
Definition: ElfBinaries.h:97
Types::Word align
alignment
Definition: ElfBinaries.h:708
cxbyte * dynamicTable
pointer to dynamic table
Definition: ElfBinaries.h:134
bool operator!() const
returns true if object is uninitialized
Definition: ElfBinaries.h:183
if set in field then field has been ignored
Definition: ElfBinaries.h:61
uint8_t ULEV(const uint8_t &t)
convert from/to little endian value from unaligned memory
static ElfRegionTemplate dynsymSection()
get dynsym section
Definition: ElfBinaries.h:661
simple C-string container
Definition: CString.h:38
ELF 32-bit types.
Definition: ElfBinaries.h:95
containers and other utils for other libraries and programs
const Types::Size getDynamicEntrySize() const
get dynamic entries size
Definition: ElfBinaries.h:389
cxbyte * noteTable
pointer to note table
Definition: ElfBinaries.h:133
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:89
cxbyte * symbolTable
pointer to symbol table
Definition: ElfBinaries.h:130
uint64_t Word
word size in ELF
Definition: ElfBinaries.h:98
Elf64_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:105
Definition: Elf.h:87
ElfRegionTemplate(typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for user region
Definition: ElfBinaries.h:559
ElfRegionTemplate(const BinSection &binSection, const uint16_t *builtinSections, cxuint maxBuiltinSection, cxuint startExtraIndex)
constructor for external section (BinSection)
Definition: ElfBinaries.h:620
Definition: Elf.h:254
cxuint regionStart
number of first region which is in program header data
Definition: ElfBinaries.h:702