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-2017 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  typedef Elf32_Rel Rel;
89  typedef Elf32_Rela Rela;
90  static const cxbyte ELFCLASS;
91  static const cxuint bitness;
92  static const char* bitName;
93  static const Word nobase = Word(0)-1;
94 };
95 
97 struct Elf64Types
98 {
99  typedef size_t Size;
100  typedef uint64_t Word;
101  typedef uint64_t SectionFlags;
102  typedef Elf64_Ehdr Ehdr;
103  typedef Elf64_Shdr Shdr;
104  typedef Elf64_Phdr Phdr;
105  typedef Elf64_Sym Sym;
106  typedef Elf64_Nhdr Nhdr;
107  typedef Elf64_Dyn Dyn;
108  typedef Elf64_Rel Rel;
109  typedef Elf64_Rela Rela;
110  static const cxbyte ELFCLASS;
111  static const cxuint bitness;
112  static const char* bitName;
113  static const Word nobase = Word(0)-1;
114 };
115 
117 
120 template<typename Types>
122 {
123 public:
128 protected:
130  size_t binaryCodeSize;
131  cxbyte* binaryCode;
134  cxbyte* symbolTable;
136  cxbyte* dynSymTable;
137  cxbyte* noteTable;
138  cxbyte* dynamicTable;
139  SectionIndexMap sectionIndexMap;
140  SymbolIndexMap symbolIndexMap;
141  SymbolIndexMap dynSymIndexMap;
142 
143  typename Types::Size symbolsNum;
144  typename Types::Size dynSymbolsNum;
145  typename Types::Size noteTableSize;
146  typename Types::Size dynamicsNum;
147  uint16_t symbolEntSize;
148  uint16_t dynSymEntSize;
149  typename Types::Size dynamicEntSize;
150 
151 public:
158  ElfBinaryTemplate(size_t binaryCodeSize, cxbyte* binaryCode,
159  Flags creationFlags = ELF_CREATE_ALL);
160  virtual ~ElfBinaryTemplate();
161 
164  { return creationFlags; }
165 
167  bool hasSectionMap() const
168  { return (creationFlags & ELF_CREATE_SECTIONMAP) != 0; }
169 
171  bool hasSymbolMap() const
172  { return (creationFlags & ELF_CREATE_SYMBOLMAP) != 0; }
173 
175  bool hasDynSymbolMap() const
176  { return (creationFlags & ELF_CREATE_DYNSYMMAP) != 0; }
177 
179  size_t getSize() const
180  { return binaryCodeSize; }
181 
183  operator bool() const
184  { return binaryCode!=nullptr; }
185 
187  bool operator!() const
188  { return binaryCode==nullptr; }
189 
191  const cxbyte* getBinaryCode() const
192  { return binaryCode; }
194  cxbyte* getBinaryCode()
195  { return binaryCode; }
196 
198  const typename Types::Ehdr& getHeader() const
199  { return *reinterpret_cast<const typename Types::Ehdr*>(binaryCode); }
200 
202  typename Types::Ehdr& getHeader()
203  { return *reinterpret_cast<typename Types::Ehdr*>(binaryCode); }
204 
206  uint16_t getSectionHeadersNum() const
207  { return ULEV(getHeader().e_shnum); }
208 
210  const typename Types::Shdr& getSectionHeader(uint16_t index) const
211  {
212  const typename Types::Ehdr& ehdr = getHeader();
213  return *reinterpret_cast<const typename Types::Shdr*>(binaryCode +
214  ULEV(ehdr.e_shoff) + size_t(ULEV(ehdr.e_shentsize))*index);
215  }
216 
218  typename Types::Shdr& getSectionHeader(uint16_t index)
219  {
220  const typename Types::Ehdr& ehdr = getHeader();
221  return *reinterpret_cast<typename Types::Shdr*>(binaryCode +
222  ULEV(ehdr.e_shoff) + size_t(ULEV(ehdr.e_shentsize))*index);
223  }
224 
226  uint16_t getProgramHeadersNum() const
227  { return ULEV(getHeader().e_phnum); }
228 
230  const typename Types::Phdr& getProgramHeader(uint16_t index) const
231  {
232  const typename Types::Ehdr& ehdr = getHeader();
233  return *reinterpret_cast<const typename Types::Phdr*>(binaryCode +
234  ULEV(ehdr.e_phoff) + size_t(ULEV(ehdr.e_phentsize))*index);
235  }
236 
238  typename Types::Phdr& getProgramHeader(uint16_t index)
239  {
240  const typename Types::Ehdr& ehdr = getHeader();
241  return *reinterpret_cast<typename Types::Phdr*>(binaryCode +
242  ULEV(ehdr.e_phoff) + size_t(ULEV(ehdr.e_phentsize))*index);
243  }
244 
246  typename Types::Size getSymbolsNum() const
247  { return symbolsNum; }
248 
250  typename Types::Size getDynSymbolsNum() const
251  { return dynSymbolsNum; }
252 
254  const typename Types::Sym& getSymbol(typename Types::Size index) const
255  {
256  return *reinterpret_cast<const typename Types::Sym*>(symbolTable +
257  size_t(index)*symbolEntSize);
258  }
259 
261  typename Types::Sym& getSymbol(typename Types::Size index)
262  {
263  return *reinterpret_cast<typename Types::Sym*>(
264  symbolTable + size_t(index)*symbolEntSize);
265  }
266 
268  const typename Types::Sym& getDynSymbol(typename Types::Size index) const
269  {
270  return *reinterpret_cast<const typename Types::Sym*>(dynSymTable +
271  size_t(index)*dynSymEntSize);
272  }
273 
275  typename Types::Sym& getDynSymbol(typename Types::Size index)
276  {
277  return *reinterpret_cast<typename Types::Sym*>(dynSymTable +
278  size_t(index)*dynSymEntSize);
279  }
280 
282  const char* getSymbolName(typename Types::Size index) const
283  {
284  const typename Types::Sym& sym = getSymbol(index);
285  return reinterpret_cast<const char*>(symbolStringTable + ULEV(sym.st_name));
286  }
287 
289  const char* getDynSymbolName(typename Types::Size index) const
290  {
291  const typename Types::Sym& sym = getDynSymbol(index);
292  return reinterpret_cast<const char*>(dynSymStringTable + ULEV(sym.st_name));
293  }
294 
296  const char* getSectionName(uint16_t index) const
297  {
298  const typename Types::Shdr& section = getSectionHeader(index);
299  return reinterpret_cast<const char*>(sectionStringTable + ULEV(section.sh_name));
300  }
301 
304  { return sectionIndexMap.end(); }
305 
308  {
310  sectionIndexMap.begin(), sectionIndexMap.end(), name, CStringLess());
311  if (it == sectionIndexMap.end())
312  throw Exception(std::string("Can't find Elf")+Types::bitName+" Section");
313  return it;
314  }
315 
317  uint16_t getSectionIndex(const char* name) const;
318 
320  typename Types::Size getSymbolIndex(const char* name) const;
321 
323  typename Types::Size getDynSymbolIndex(const char* name) const;
324 
327  { return symbolIndexMap.end(); }
328 
331  { return dynSymIndexMap.end(); }
332 
335  {
337  symbolIndexMap.begin(), symbolIndexMap.end(), name, CStringLess());
338  if (it == symbolIndexMap.end())
339  throw Exception(std::string("Can't find Elf")+Types::bitName+" Symbol");
340  return it;
341  }
342 
345  {
347  dynSymIndexMap.begin(), dynSymIndexMap.end(), name, CStringLess());
348  if (it == dynSymIndexMap.end())
349  throw Exception(std::string("Can't find Elf")+Types::bitName+" DynSymbol");
350  return it;
351  }
352 
354  const typename Types::Shdr& getSectionHeader(const char* name) const
355  { return getSectionHeader(getSectionIndex(name)); }
356 
358  typename Types::Shdr& getSectionHeader(const char* name)
359  { return getSectionHeader(getSectionIndex(name)); }
360 
362  const typename Types::Sym& getSymbol(const char* name) const
363  { return getSymbol(getSymbolIndex(name)); }
364 
366  typename Types::Sym& getSymbol(const char* name)
367  { return getSymbol(getSymbolIndex(name)); }
368 
370  const typename Types::Sym& getDynSymbol(const char* name) const
371  { return getDynSymbol(getDynSymbolIndex(name)); }
372 
374  typename Types::Sym& getDynSymbol(const char* name)
375  { return getDynSymbol(getDynSymbolIndex(name)); }
376 
378  const typename Types::Nhdr* getNotes() const
379  { return reinterpret_cast<typename Types::Nhdr*>(noteTable); }
380 
382  typename Types::Nhdr* getNotes()
383  { return reinterpret_cast<typename Types::Nhdr*>(noteTable); }
384 
386  typename Types::Size getNotesSize() const
387  { return noteTableSize; }
388 
390  const typename Types::Size getDynamicsNum() const
391  { return dynamicsNum; }
392 
394  const typename Types::Size getDynamicEntrySize() const
395  { return dynamicEntSize; }
396 
398  const typename Types::Dyn* getDynamicTable() const
399  { return reinterpret_cast<const typename Types::Dyn*>(dynamicTable); }
400 
402  typename Types::Dyn* getDynamicTable()
403  { return reinterpret_cast<typename Types::Dyn*>(dynamicTable); }
404 
406  const cxbyte* getSectionContent(uint16_t index) const
407  {
408  const typename Types::Shdr& shdr = getSectionHeader(index);
409  return binaryCode + ULEV(shdr.sh_offset);
410  }
411 
413  cxbyte* getSectionContent(uint16_t index)
414  {
415  typename Types::Shdr& shdr = getSectionHeader(index);
416  return binaryCode + ULEV(shdr.sh_offset);
417  }
418 
420  const cxbyte* getSectionContent(const char* name) const
421  { return getSectionContent(getSectionIndex(name)); }
422 
424  cxbyte* getSectionContent(const char* name)
425  { return getSectionContent(getSectionIndex(name)); }
426 };
427 
428 extern template class ElfBinaryTemplate<Elf32Types>;
429 extern template class ElfBinaryTemplate<Elf64Types>;
430 
432 extern bool isElfBinary(size_t binarySize, const cxbyte* binary);
433 
438 
440 enum class ElfRegionType: cxbyte
441 {
442  PHDR_TABLE,
443  SHDR_TABLE,
444  SECTION,
445  USER
446 };
447 
450 {
451 public:
452  virtual ~ElfRegionContent();
453 
455  virtual void operator()(FastOutputBuffer& fob) const = 0;
456 };
457 
459 template<typename Types>
461 {
462  typename Types::Word paddrBase;
463  typename Types::Word vaddrBase;
464  cxbyte osABI;
465  cxbyte abiVersion;
466  uint16_t type;
467  uint16_t machine;
468  uint32_t version;
469  cxuint entryRegion;
470  typename Types::Word entry;
471  uint32_t flags;
472 };
473 
478 
479 
480 enum: cxuint {
481  ELFSECTID_START = UINT_MAX-255,
482  ELFSECTID_SHSTRTAB = ELFSECTID_START,
483  ELFSECTID_STRTAB,
484  ELFSECTID_SYMTAB,
485  ELFSECTID_DYNSTR,
486  ELFSECTID_DYNSYM,
487  ELFSECTID_TEXT,
488  ELFSECTID_RODATA,
489  ELFSECTID_DATA,
490  ELFSECTID_BSS,
491  ELFSECTID_COMMENT,
492  ELFSECTID_STD_MAX = ELFSECTID_COMMENT,
493  ELFSECTID_OTHER_BUILTIN = ELFSECTID_STD_MAX+1,
494  ELFSECTID_NULL = UINT_MAX-2,
495  ELFSECTID_ABS = UINT_MAX-1,
496  ELFSECTID_UNDEF = UINT_MAX
497 };
498 
501 {
503  size_t size;
504  const cxbyte* data;
505  uint64_t align;
506  uint32_t type;
507  uint64_t flags;
508  cxuint linkId;
509  uint32_t info;
510  size_t entSize;
511 };
512 
514 struct BinSymbol
515 {
517  uint64_t value;
518  uint64_t size;
519  cxuint sectionId;
520  bool valueIsAddr;
521  cxbyte info;
522  cxbyte other;
523 };
524 
526 extern uint16_t convertSectionId(cxuint sectionIndex, const uint16_t* builtinSections,
527  cxuint maxBuiltinSection, cxuint extraSectionIndex);
528 
530 template<typename Types>
532 {
534 
537 
539 
541  typename Types::Word size;
542  typename Types::Word align;
543  union
544  {
545  const cxbyte* data;
547  };
548  struct {
549  const char* name;
550  uint32_t type;
551  typename Types::SectionFlags flags;
552  uint32_t link;
553  uint32_t info;
554  typename Types::Word addrBase;
555  typename Types::Word entSize;
556  bool zeroOffset;
557  typename Types::Word align;
558  } section;
559 
560  ElfRegionTemplate() : type(ElfRegionType::USER), dataFromPointer(false), size(0),
561  align(0), data(0)
562  { }
564  ElfRegionTemplate(typename Types::Word _size,
565  const cxbyte* _data, typename Types::Word _align)
566  : type(ElfRegionType::USER), dataFromPointer(true), size(_size),
567  align(_align), data(_data)
568  { }
569 
571  ElfRegionTemplate(typename Types::Word _size,
572  const ElfRegionContent* contentGen, typename Types::Word _align)
573  : type(ElfRegionType::USER), dataFromPointer(false), size(_size),
574  align(_align), dataGen(contentGen)
575  { }
576 
578  ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size,
579  const cxbyte* _data, typename Types::Word _align)
580  : type(_type), dataFromPointer(true), size(_size),
581  align(_align), data(_data)
582  { }
583 
585  ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size,
586  const ElfRegionContent* contentGen, typename Types::Word _align)
587  : type(_type), dataFromPointer(false), size(_size),
588  align(_align), dataGen(contentGen)
589  { }
590 
592  ElfRegionTemplate(typename Types::Word _size, const cxbyte* _data,
593  typename Types::Word _align, const char* _name, uint32_t _type,
594  typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
595  typename Types::Word _addrBase = 0,
596  typename Types::Word _entSize = 0, bool _zeroOffset = false,
597  typename Types::Word _sectAlign = 0)
598  : type(ElfRegionType::SECTION), dataFromPointer(true), size(_size),
599  align(_align), data(_data)
600  {
601  section = {_name, _type, _flags, _link, _info, _addrBase,
602  _entSize, _zeroOffset, _sectAlign};
603  }
604 
606  ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent* _data,
607  typename Types::Word _align, const char* inName, uint32_t _type,
608  typename Types::SectionFlags _flags, uint32_t _link = 0, uint32_t _info = 0,
609  typename Types::Word _addrBase = 0,
610  typename Types::Word _entSize = 0, bool _zeroOffset = false,
611  typename Types::Word _sectAlign = 0)
612  : type(ElfRegionType::SECTION), dataFromPointer(false), size(_size),
613  align(_align), dataGen(_data)
614  {
615  section = {inName, _type, _flags, _link, _info, _addrBase,
616  _entSize, _zeroOffset, _sectAlign};
617  }
619 
625  ElfRegionTemplate(const BinSection& binSection, const uint16_t* builtinSections,
626  cxuint maxBuiltinSection, cxuint startExtraIndex)
627  : type(ElfRegionType::SECTION), dataFromPointer(true), size(binSection.size),
628  align(binSection.align), data(binSection.data)
629  {
630  section = { binSection.name.c_str(), binSection.type,
631  typename Types::SectionFlags(binSection.flags),
632  uint32_t(convertSectionId(binSection.linkId, builtinSections,
633  maxBuiltinSection, startExtraIndex)),
634  binSection.info, 0, typename Types::Word(binSection.entSize), 0 };
635  }
636 
639  { return ElfRegionTemplate(ElfRegionType::PHDR_TABLE, 0, (const cxbyte*)nullptr,
640  sizeof(typename Types::Word)); }
641 
644  { return ElfRegionTemplate(ElfRegionType::SHDR_TABLE, 0, (const cxbyte*)nullptr,
645  sizeof(typename Types::Word)); }
646 
649  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".strtab", SHT_STRTAB, 0); }
650 
653  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".dynstr", SHT_STRTAB,
654  SHF_ALLOC); }
655 
658  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 1, ".shstrtab", SHT_STRTAB, 0); }
659 
662  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
663  ".symtab", SHT_SYMTAB, 0); }
664 
667  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
668  ".dynsym", SHT_DYNSYM, SHF_ALLOC); }
669 
671  static ElfRegionTemplate hashSection(uint16_t link)
672  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
673  ".hash", SHT_HASH, SHF_ALLOC, link); }
674 
677  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 4, ".note", SHT_NOTE, 0); }
678 
680  static ElfRegionTemplate dynamicSection(uint16_t link)
681  { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
682  ".dynamic", SHT_DYNAMIC, SHF_ALLOC|SHF_WRITE, link); }
683 };
684 
686 struct ElfNote
687 {
688  const char* name;
689  size_t descSize;
690  const cxbyte* desc;
691  uint32_t type;
692 };
693 
698 
699 enum: cxuint {
700  PHREGION_FILESTART = UINT_MAX
701 };
703 template<typename Types>
705 {
706  uint32_t type;
707  uint32_t flags;
708  cxuint regionStart;
709  cxuint regionsNum;
710  bool haveMemSize;
711  typename Types::Word paddrBase;
712  typename Types::Word vaddrBase;
713  typename Types::Word memSize;
714  typename Types::Word align;
715 };
716 
721 
723 template<typename Types>
725 {
726  const char* name;
727  uint16_t sectionIndex;
728  cxbyte info;
729  cxbyte other;
730  bool valueIsAddr;
731  typename Types::Word value;
732  typename Types::Word size;
733 
734  ElfSymbolTemplate() : name(nullptr), sectionIndex(0), info(0), other(0),
735  valueIsAddr(false), value(0), size(0)
736  { }
737 
739  ElfSymbolTemplate(const char* _name, uint16_t _sectionIndex,
740  cxbyte _info, cxbyte _other, bool _valueIsAddr,
741  typename Types::Word _value, typename Types::Word _size)
742  : name(_name), sectionIndex(_sectionIndex), info(_info), other(_other),
743  valueIsAddr(_valueIsAddr), value(_value), size(_size)
744  { }
746 
752  ElfSymbolTemplate(const BinSymbol& binSymbol, const uint16_t* builtinSections,
753  cxuint maxBuiltinSection, cxuint startExtraIndex)
754  {
755  name = binSymbol.name.c_str();
756  sectionIndex = convertSectionId(binSymbol.sectionId, builtinSections,
757  maxBuiltinSection, startExtraIndex);
758  info = binSymbol.info;
759  other = binSymbol.other;
760  valueIsAddr = binSymbol.valueIsAddr;
761  value = binSymbol.value;
762  size = binSymbol.size;
763  }
764 };
765 
770 
772 template<typename Types>
774 {
775 private:
776  bool sizeComputed;
777  bool addNullSym, addNullDynSym;
778  bool addNullSection;
779  cxuint addrStartRegion;
780  uint16_t shStrTab, strTab, dynStr;
781  cxuint shdrTabRegion, phdrTabRegion;
782  uint16_t sectionsNum;
783  typename Types::Word size;
785  std::vector<ElfRegionTemplate<Types> > regions;
786  std::unique_ptr<typename Types::Word[]> regionOffsets;
787  std::unique_ptr<typename Types::Word[]> regionAddresses;
788  std::unique_ptr<cxuint[]> sectionRegions;
789  std::vector<ElfProgramHeaderTemplate<Types> > progHeaders;
790  std::vector<ElfSymbolTemplate<Types> > symbols;
791  std::vector<ElfSymbolTemplate<Types> > dynSymbols;
792  std::vector<ElfNote> notes;
793  std::vector<int32_t> dynamics;
794  std::unique_ptr<typename Types::Word[]> dynamicValues;
795  uint32_t bucketsNum;
796  std::unique_ptr<uint32_t[]> hashCodes;
797  bool isHashDynSym;
798 
799  void computeSize();
800 public:
803 
810  explicit ElfBinaryGenTemplate(const ElfHeaderTemplate<Types>& header,
811  bool addNullSym = true, bool addNullDynSym = true,
812  bool addNullSection = true, cxuint addrCountingFromRegion = 0);
813 
816  { this->header = header; }
817 
819  void addRegion(const ElfRegionTemplate<Types>& region);
821  void addProgramHeader(const ElfProgramHeaderTemplate<Types>& progHeader);
822 
825  { symbols.push_back(symbol); }
828  { dynSymbols.push_back(symbol); }
830  void addNote(const ElfNote& note)
831  { notes.push_back(note); }
833  void addDynamic(int32_t dynamicTag)
834  { dynamics.push_back(dynamicTag); }
836  void addDynamics(size_t dynamicsNum, const int32_t* dynTags)
837  { dynamics.insert(dynamics.end(), dynTags, dynTags + dynamicsNum); }
838 
840  uint64_t countSize();
841 
843  void generate(FastOutputBuffer& fob);
844 
846  void generate(std::ostream& os)
847  {
848  FastOutputBuffer fob(256, os);
849  generate(fob);
850  }
851 };
852 
853 extern template class ElfBinaryGenTemplate<Elf32Types>;
854 extern template class ElfBinaryGenTemplate<Elf64Types>;
855 
860 
861 };
862 
863 #endif
const char * getDynSymbolName(typename Types::Size index) const
get dynamic symbol name with specified index
Definition: ElfBinaries.h:289
Types::Word memSize
size in memory
Definition: ElfBinaries.h:713
const Types::Sym & getDynSymbol(typename Types::Size index) const
get dynamic symbol with specified index
Definition: ElfBinaries.h:268
const Types::Shdr & getSectionHeader(uint16_t index) const
get section header with specified index
Definition: ElfBinaries.h:210
uint32_t link
section link
Definition: ElfBinaries.h:552
ELF note structure.
Definition: ElfBinaries.h:686
ElfSymbolTemplate(const BinSymbol &binSymbol, const uint16_t *builtinSections, cxuint maxBuiltinSection, cxuint startExtraIndex)
constructor for extra symbol
Definition: ElfBinaries.h:752
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:330
Elf64_Sym Sym
symbol header
Definition: ElfBinaries.h:105
program header table
void addDynamic(int32_t dynamicTag)
add dynamic
Definition: ElfBinaries.h:833
Elf64_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:102
const cxbyte * data
data content
Definition: ElfBinaries.h:504
cxbyte info
info
Definition: ElfBinaries.h:521
Types::Shdr & getSectionHeader(const char *name)
get section header with specified name
Definition: ElfBinaries.h:358
ELF binary class.
Definition: ElfBinaries.h:121
Types::Word paddrBase
physical address base
Definition: ElfBinaries.h:462
Types::Size noteTableSize
size of note table
Definition: ElfBinaries.h:145
Definition: Elf.h:69
uint32_t type
section type
Definition: ElfBinaries.h:506
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:198
const T * begin() const
get iterator to first element
Definition: Containers.h:249
Elf32_Nhdr Nhdr
note header
Definition: ElfBinaries.h:86
if set in field then field has been ignored
Definition: ElfBinaries.h:56
Types::Word vaddrBase
vaddr base
Definition: ElfBinaries.h:712
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:130
ElfRegionType type
type of region
Definition: ElfBinaries.h:533
fast and direct output buffer
Definition: InputOutput.h:350
const char * c_str() const
return C-style string pointer
Definition: CString.h:249
uint32_t info
section info
Definition: ElfBinaries.h:553
template of ElfRegion
Definition: ElfBinaries.h:531
static ElfRegionTemplate shstrtabSection()
get .shstrtab section
Definition: ElfBinaries.h:657
uint64_t flags
section flags
Definition: ElfBinaries.h:507
elf header template
Definition: ElfBinaries.h:460
void addDynSymbol(const ElfSymbolTemplate< Types > &symbol)
add dynamic symbol
Definition: ElfBinaries.h:827
Types::Sym & getSymbol(typename Types::Size index)
get symbol with specified index
Definition: ElfBinaries.h:261
uint64_t value
symbol value
Definition: ElfBinaries.h:517
const Types::Sym & getDynSymbol(const char *name) const
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:370
Elf32_Rela Rela
relocation with addend
Definition: ElfBinaries.h:89
uint64_t size
symbol size
Definition: ElfBinaries.h:518
const cxbyte * desc
description
Definition: ElfBinaries.h:690
const Types::Dyn * getDynamicTable() const
get dynamic table
Definition: ElfBinaries.h:398
bool hasSectionMap() const
returns true if object has a section&#39;s index map
Definition: ElfBinaries.h:167
bool valueIsAddr
true if value should be treats as address
Definition: ElfBinaries.h:730
ELF 32-bit types.
Definition: ElfBinaries.h:77
ElfRegionTemplate< Elf32Types > ElfRegion32
32-bit region (for 32-bit elf)
Definition: ElfBinaries.h:695
Definition: Elf.h:349
Elf64_Rela Rela
relocation with addend
Definition: ElfBinaries.h:109
section header table
bool haveMemSize
true if program header has memory size
Definition: ElfBinaries.h:710
class ElfBinaryTemplate< Elf64Types > ElfBinary64
type for 64-bit ELF binary
Definition: ElfBinaries.h:437
Types::Nhdr * getNotes()
get note table
Definition: ElfBinaries.h:382
Elf64_Rel Rel
relocation
Definition: ElfBinaries.h:108
static const Word nobase
address with zero base
Definition: ElfBinaries.h:93
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for region
Definition: ElfBinaries.h:578
cxbyte * binaryCode
pointer to binary code
Definition: ElfBinaries.h:131
static ElfRegionTemplate sectionHeaderTable()
get program header table region
Definition: ElfBinaries.h:643
SymbolIndexMap::const_iterator getSymbolIterEnd() const
get end iterator of symbol index map
Definition: ElfBinaries.h:326
symbol structure to external usage (fo example in the binary generator input)
Definition: ElfBinaries.h:514
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:606
cxbyte info
info
Definition: ElfBinaries.h:728
Types::Size dynSymbolsNum
dynamic symbols number
Definition: ElfBinaries.h:144
Types::Word addrBase
section address base
Definition: ElfBinaries.h:554
Elf64_Nhdr Nhdr
note header
Definition: ElfBinaries.h:106
bool dataFromPointer
true if content from pointer, otherwise will be generated from class
Definition: ElfBinaries.h:536
CString name
name of section
Definition: ElfBinaries.h:502
uint64_t align
region alignment
Definition: ElfBinaries.h:505
Elf64_Shdr Shdr
Section header.
Definition: ElfBinaries.h:103
Definition: Elf.h:451
Array< std::pair< const char *, size_t > > SymbolIndexMap
symbol index map
Definition: ElfBinaries.h:127
static ElfRegionTemplate programHeaderTable()
get program header table region
Definition: ElfBinaries.h:638
const cxbyte * getSectionContent(uint16_t index) const
get section content pointer
Definition: ElfBinaries.h:406
Types::Size symbolsNum
symbols number
Definition: ElfBinaries.h:143
Elf32_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:87
Types::Size dynamicEntSize
get dynamic entry size
Definition: ElfBinaries.h:149
an array class
Definition: Containers.h:38
Elf32_Sym Sym
symbol header
Definition: ElfBinaries.h:85
Types::Word entSize
entries size
Definition: ElfBinaries.h:555
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:465
uint32_t version
version
Definition: ElfBinaries.h:468
static ElfRegionTemplate symtabSection()
get symtab section
Definition: ElfBinaries.h:661
ElfHeaderTemplate< Elf64Types > ElfHeader64
64-bit elf header
Definition: ElfBinaries.h:477
create map of dynamic symbols
Definition: ElfBinaries.h:72
cxbyte * getBinaryCode()
get binary code
Definition: ElfBinaries.h:194
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:846
const Types::Sym & getSymbol(const char *name) const
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:362
Types::Phdr & getProgramHeader(uint16_t index)
get program header with specified index
Definition: ElfBinaries.h:238
Definition: Elf.h:458
CString name
name
Definition: ElfBinaries.h:516
Types::Sym & getSymbol(const char *name)
get symbol with specified name (requires symbol index map)
Definition: ElfBinaries.h:366
static ElfRegionTemplate dynamicSection(uint16_t link)
get dynamic
Definition: ElfBinaries.h:680
static ElfRegionTemplate hashSection(uint16_t link)
get hash section
Definition: ElfBinaries.h:671
const Types::Size getDynamicsNum() const
get dynamic entries number
Definition: ElfBinaries.h:390
Definition: Elf.h:605
size_t descSize
description size
Definition: ElfBinaries.h:689
ELF binary generator.
Definition: ElfBinaries.h:773
uint32_t info
section info
Definition: ElfBinaries.h:509
Definition: Elf.h:432
const char * getSymbolName(typename Types::Size index) const
get symbol name with specified index
Definition: ElfBinaries.h:282
uint32_t type
section type
Definition: ElfBinaries.h:550
section structure to external usage (for example in the binary generator input)
Definition: ElfBinaries.h:500
Types::Dyn * getDynamicTable()
get dynamic table
Definition: ElfBinaries.h:402
const Types::Sym & getSymbol(typename Types::Size index) const
get symbol with specified index
Definition: ElfBinaries.h:254
void addNote(const ElfNote &note)
add note
Definition: ElfBinaries.h:830
void addSymbol(const ElfSymbolTemplate< Types > &symbol)
add symbol
Definition: ElfBinaries.h:824
uint16_t getSectionHeadersNum() const
get section headers number
Definition: ElfBinaries.h:206
static ElfRegionTemplate noteSection()
get note section
Definition: ElfBinaries.h:676
cxbyte * symbolStringTable
pointer to symbol&#39;s string table
Definition: ElfBinaries.h:133
Types::Sym & getDynSymbol(typename Types::Size index)
get dynamic symbol with specified index
Definition: ElfBinaries.h:275
elf region content generator for elf region
Definition: ElfBinaries.h:449
const char * name
name
Definition: ElfBinaries.h:726
cxuint regionsNum
number of regions whose is in program header data
Definition: ElfBinaries.h:709
cxbyte osABI
os abi
Definition: ElfBinaries.h:464
const char * getSectionName(uint16_t index) const
get section name with specified index
Definition: ElfBinaries.h:296
ElfSymbolTemplate< Elf64Types > ElfSymbol64
64-bit elf symbol
Definition: ElfBinaries.h:769
ElfRegionTemplate(ElfRegionType _type, typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for region with content generator
Definition: ElfBinaries.h:585
Types::Size getNotesSize() const
get size of notes in bytes
Definition: ElfBinaries.h:386
ElfRegionTemplate< Elf64Types > ElfRegion64
64-bit region (for 64-bit elf)
Definition: ElfBinaries.h:697
const char * name
section name
Definition: ElfBinaries.h:549
input output utilities
static const char * bitName
bitness name
Definition: ElfBinaries.h:92
SectionIndexMap::const_iterator getSectionIter(const char *name) const
get section iterator with specified name (requires section index map)
Definition: ElfBinaries.h:307
Types::Size dynamicsNum
get dynamic entries number
Definition: ElfBinaries.h:146
const Types::Shdr & getSectionHeader(const char *name) const
get section header with specified name
Definition: ElfBinaries.h:354
SymbolIndexMap symbolIndexMap
symbol&#39;s index map
Definition: ElfBinaries.h:140
ElfProgramHeaderTemplate< Elf64Types > ElfProgramHeader64
64-bit elf program header
Definition: ElfBinaries.h:720
SymbolIndexMap::const_iterator getSymbolIter(const char *name) const
get symbol iterator with specified name (requires symbol index map)
Definition: ElfBinaries.h:334
size_t entSize
entries size
Definition: ElfBinaries.h:510
const cxbyte * getSectionContent(const char *name) const
get section content pointer
Definition: ElfBinaries.h:420
if set in field then field has been ignored
Definition: ElfBinaries.h:51
uint32_t flags
flags
Definition: ElfBinaries.h:471
void setHeader(const ElfHeaderTemplate< Types > &header)
set elf header
Definition: ElfBinaries.h:815
static const char * bitName
bitness name
Definition: ElfBinaries.h:112
Types::Ehdr & getHeader()
get ELF binary header
Definition: ElfBinaries.h:202
Flags creationFlags
creation flags holder
Definition: ElfBinaries.h:129
uint32_t flags
flags
Definition: ElfBinaries.h:707
Types::Word entry
entry offset relative to region
Definition: ElfBinaries.h:470
main namespace
Definition: AsmDefs.h:38
bool hasDynSymbolMap() const
returns true if object has a dynamic symbol&#39;s index map
Definition: ElfBinaries.h:175
uint16_t symbolEntSize
symbol entry size in a symbol&#39;s table
Definition: ElfBinaries.h:147
size_t size
size of content
Definition: ElfBinaries.h:503
uint16_t dynSymEntSize
dynamic symbol entry size in a dynamic symbol&#39;s table
Definition: ElfBinaries.h:148
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:111
if set in field then field has been filled later
Definition: ElfBinaries.h:55
if set in field then field has been filled later
Definition: ElfBinaries.h:50
cxbyte other
other
Definition: ElfBinaries.h:522
size_t getSize() const
get size of binaries
Definition: ElfBinaries.h:179
void addDynamics(size_t dynamicsNum, const int32_t *dynTags)
add dynamic
Definition: ElfBinaries.h:836
if set in field then field has been filled later
Definition: ElfBinaries.h:65
const char * name
note name
Definition: ElfBinaries.h:688
Definition: Elf.h:548
cxuint entryRegion
region in which is entry
Definition: ElfBinaries.h:469
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:592
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:520
uint32_t Size
size used to return size value
Definition: ElfBinaries.h:79
const Types::Nhdr * getNotes() const
get note table
Definition: ElfBinaries.h:378
uint64_t SectionFlags
section flags
Definition: ElfBinaries.h:101
ElfProgramHeaderTemplate< Elf32Types > ElfProgramHeader32
32-bit elf program header
Definition: ElfBinaries.h:718
inlines for accessing memory words in LittleEndian and unaligned
Types::Word vaddrBase
virtual address base
Definition: ElfBinaries.h:463
Definition: Elf.h:541
const cxbyte * data
content from pointer
Definition: ElfBinaries.h:545
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:739
ELF symbol template.
Definition: ElfBinaries.h:724
Types::Word align
region alignment
Definition: ElfBinaries.h:542
Types::Size getDynSymbolsNum() const
get dynamic symbols number
Definition: ElfBinaries.h:250
cxbyte * dynSymTable
pointer to dynamic symbol table
Definition: ElfBinaries.h:136
uint32_t type
type
Definition: ElfBinaries.h:691
ElfHeaderTemplate< Elf32Types > ElfHeader32
32-bit elf header
Definition: ElfBinaries.h:475
Definition: Elf.h:615
template of ELF program header
Definition: ElfBinaries.h:704
SymbolIndexMap dynSymIndexMap
dynamic symbol&#39;s index map
Definition: ElfBinaries.h:141
uint16_t getProgramHeadersNum() const
get program headers number
Definition: ElfBinaries.h:226
Elf64_Phdr Phdr
program header
Definition: ElfBinaries.h:104
cxbyte * getSectionContent(const char *name)
get section content pointer
Definition: ElfBinaries.h:424
bool hasSymbolMap() const
returns true if object has a symbol&#39;s index map
Definition: ElfBinaries.h:171
Flags getCreationFlags() const
get creation flags
Definition: ElfBinaries.h:163
if set in field then field has been ignored
Definition: ElfBinaries.h:61
utilities for other libraries and programs
uint16_t sectionIndex
section index for which symbol is
Definition: ElfBinaries.h:727
ElfRegionType
type of Elf region
Definition: ElfBinaries.h:440
create map of symbols
Definition: ElfBinaries.h:71
uint32_t SectionFlags
section flags
Definition: ElfBinaries.h:81
const cxbyte * getBinaryCode() const
get binary code
Definition: ElfBinaries.h:191
exception class
Definition: Utilities.h:58
cxbyte * sectionStringTable
pointer to section&#39;s string table
Definition: ElfBinaries.h:132
cxbyte other
other
Definition: ElfBinaries.h:729
const Types::Phdr & getProgramHeader(uint16_t index) const
get program header with specified index
Definition: ElfBinaries.h:230
Types::Word size
region size
Definition: ElfBinaries.h:541
static ElfRegionTemplate strtabSection()
get .strtab section
Definition: ElfBinaries.h:648
Elf32_Rel Rel
relocation
Definition: ElfBinaries.h:88
class ElfBinaryGenTemplate< Elf32Types > ElfBinaryGen32
type for 32-bit ELF binary generator
Definition: ElfBinaries.h:857
cxuint linkId
link section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:508
uint32_t type
type
Definition: ElfBinaries.h:706
static ElfRegionTemplate dynstrSection()
get .dynstr section
Definition: ElfBinaries.h:652
cxbyte * getSectionContent(uint16_t index)
get section content pointer
Definition: ElfBinaries.h:413
Elf32_Ehdr Ehdr
ELF header.
Definition: ElfBinaries.h:82
Types::Word size
symbol size
Definition: ElfBinaries.h:732
Types::Size getSymbolsNum() const
get symbols number
Definition: ElfBinaries.h:246
SectionIndexMap sectionIndexMap
section&#39;s index map
Definition: ElfBinaries.h:139
Types::Shdr & getSectionHeader(uint16_t index)
get section header with specified index
Definition: ElfBinaries.h:218
creation flags for ELF binaries
Definition: ElfBinaries.h:73
Definition: Elf.h:443
const ElfRegionContent * dataGen
content generator pointer
Definition: ElfBinaries.h:546
cxuint sectionId
section id (ELFSECTID_* or an extra section index)
Definition: ElfBinaries.h:519
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:90
ElfSymbolTemplate< Elf32Types > ElfSymbol32
32-bit elf symbol
Definition: ElfBinaries.h:767
class ElfBinaryTemplate< Elf32Types > ElfBinary32
type for 32-bit ELF binary
Definition: ElfBinaries.h:435
ElfRegionTemplate(typename Types::Word _size, const ElfRegionContent *contentGen, typename Types::Word _align)
constructor for user region with content generator
Definition: ElfBinaries.h:571
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:711
Types::SectionFlags flags
section flags
Definition: ElfBinaries.h:551
SymbolIndexMap::const_iterator getDynSymbolIter(const char *name) const
get dynamic symbol iterator with specified name (requires dynamic symbol index map) ...
Definition: ElfBinaries.h:344
Definition: Elf.h:489
cxbyte * dynSymStringTable
pointer to dynamic symbol&#39;s string table
Definition: ElfBinaries.h:135
Array< std::pair< const char *, size_t > > SectionIndexMap
section index map
Definition: ElfBinaries.h:125
if set in field then field has been filled later
Definition: ElfBinaries.h:60
static const cxbyte ELFCLASS
ELF class.
Definition: ElfBinaries.h:110
uint16_t machine
machine
Definition: ElfBinaries.h:467
uint16_t type
type
Definition: ElfBinaries.h:466
Definition: Elf.h:359
Types::Sym & getDynSymbol(const char *name)
get dynamic symbol with specified name (requires dynamic symbol index map)
Definition: ElfBinaries.h:374
Types::Word value
symbol value
Definition: ElfBinaries.h:731
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:303
class ElfBinaryGenTemplate< Elf64Types > ElfBinaryGen64
type for 64-bit ELF binary generator
Definition: ElfBinaries.h:859
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:99
Types::Word align
alignment
Definition: ElfBinaries.h:714
cxbyte * dynamicTable
pointer to dynamic table
Definition: ElfBinaries.h:138
bool operator!() const
returns true if object is uninitialized
Definition: ElfBinaries.h:187
create map of sections
Definition: ElfBinaries.h:70
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:666
simple C-string container
Definition: CString.h:38
if set in field then field has been ignored
Definition: ElfBinaries.h:66
ELF 32-bit types.
Definition: ElfBinaries.h:97
containers and other utils for other libraries and programs
const Types::Size getDynamicEntrySize() const
get dynamic entries size
Definition: ElfBinaries.h:394
cxbyte * noteTable
pointer to note table
Definition: ElfBinaries.h:137
static const cxuint bitness
ELF bitness.
Definition: ElfBinaries.h:91
cxbyte * symbolTable
pointer to symbol table
Definition: ElfBinaries.h:134
uint64_t Word
word size in ELF
Definition: ElfBinaries.h:100
Elf64_Dyn Dyn
dynamic entry
Definition: ElfBinaries.h:107
Definition: Elf.h:87
ElfRegionTemplate(typename Types::Word _size, const cxbyte *_data, typename Types::Word _align)
constructor for user region
Definition: ElfBinaries.h:564
ElfRegionTemplate(const BinSection &binSection, const uint16_t *builtinSections, cxuint maxBuiltinSection, cxuint startExtraIndex)
constructor for external section (BinSection)
Definition: ElfBinaries.h:625
Definition: Elf.h:254
cxuint regionStart
number of first region which is in program header data
Definition: ElfBinaries.h:708