elftools 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70f9ff0d778b851c704b44d8c12d49ee95387ccc4f90a9417741d2ea81ed30d5
4
- data.tar.gz: 731f4292e74e277e3c34eba6f3380fab44c8ce165074841365128a2a704b2f85
3
+ metadata.gz: ab5e28fa0f434f6bbfe67e7799ba85fdd5e66aef685c9b299e948dcac916b21a
4
+ data.tar.gz: 70fbe96e62e6ebe036082959b3f0be0803bd7fe5cee42194686369d19529d35f
5
5
  SHA512:
6
- metadata.gz: 1e02ff06057fdfcad4b234239b2e2a4e0f07062a2b1802e38071e87a67287da5780321f739fd678daaa7495f02a12be6cb0dd7862073d9758daaaadac7c13209
7
- data.tar.gz: 70d4cd30ef739dfbcdc55c4b7e2645cf07feffebf5761b372e4399131a16f729f9ba64c745795263c4d6a9dc47fcbc5265cdc3b4819f97ea37d0994897524249
6
+ metadata.gz: 52bacdbdb8de7d6f3d0c28d52b7b4e8b75c69741381ae45877f9a5424af69a4ba299e28479851defc48884147aa87ae4ab5f7c9d86a7ef5515ae895dbc284d45
7
+ data.tar.gz: a06de74a09b59b5067e4d31cd12f5c377ef9dc936fe7fda3d906bd2e9107ad5d3e049914b2542a56c4cb0895b672a56d13106ad0c78c9511ae6af92e29943d15
data/README.md CHANGED
@@ -1,21 +1,23 @@
1
- [![Build Status](https://travis-ci.org/david942j/rbelftools.svg?branch=master)](https://travis-ci.org/david942j/rbelftools)
2
- [![Build Status](https://ci.appveyor.com/api/projects/status/sq5c4gli8ir95h6k?svg=true&retina=true)](https://ci.appveyor.com/project/david942j/rbelftools)
1
+ [![Build Status](https://github.com/david942j/rbelftools/workflows/build/badge.svg)](https://github.com/david942j/rbelftools/actions)
3
2
  [![Code Climate](https://codeclimate.com/github/david942j/rbelftools/badges/gpa.svg)](https://codeclimate.com/github/david942j/rbelftools)
4
3
  [![Issue Count](https://codeclimate.com/github/david942j/rbelftools/badges/issue_count.svg)](https://codeclimate.com/github/david942j/rbelftools)
5
4
  [![Test Coverage](https://codeclimate.com/github/david942j/rbelftools/badges/coverage.svg)](https://codeclimate.com/github/david942j/rbelftools/coverage)
6
5
  [![Inline docs](https://inch-ci.org/github/david942j/rbelftools.svg?branch=master)](https://inch-ci.org/github/david942j/rbelftools)
6
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/github/david942j/rbelftools/)
7
7
  [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](http://choosealicense.com/licenses/mit/)
8
8
 
9
9
  # rbelftools
10
- Pure ruby library for parsing and patching ELF files.
10
+ Pure Ruby library for parsing and patching ELF files.
11
11
 
12
12
  # Introduction
13
13
 
14
- ELF parser in pure ruby implementation. This work is inspired by [pyelftools](https://github.com/eliben/pyelftools) by [Eli Bendersky](https://github.com/eliben).
14
+ An ELF parser implemented in pure Ruby. This work is inspired by [pyelftools](https://github.com/eliben/pyelftools) by [Eli Bendersky](https://github.com/eliben).
15
15
 
16
- The motivation to create this repository is want to be a dependency of [pwntools-ruby](https://github.com/peter50216/pwntools-ruby). Since ELF parser is a big work, it should not be implemented directly in pwntools.
16
+ The original motivation to create this gem is to be a dependency of [pwntools-ruby](https://github.com/peter50216/pwntools-ruby). Since ELF parser is not an easy work, it should not be implemented directly in pwntools.
17
17
 
18
- **rbelftools**'s target is to create a nice ELF parsing library in ruby. More features remain a work in progress.
18
+ Now rbelftools is also used by the [Homebrew](https://github.com/Homebrew/brew) project: https://github.com/Homebrew/brew/tree/master/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/elftools-1.1.3/lib
19
+
20
+ **rbelftools**'s target is to create a nice ELF parsing library in Ruby. More features remain a work in progress.
19
21
 
20
22
  # Install
21
23
 
@@ -34,9 +36,10 @@ See example usage for more details.
34
36
 
35
37
  # Example Usage
36
38
 
37
- ## Start from file object
39
+ ## Start from a file object
38
40
  ```ruby
39
41
  require 'elftools'
42
+
40
43
  elf = ELFTools::ELFFile.new(File.open('spec/files/amd64.elf'))
41
44
  #=> #<ELFTools::ELFFile:0x00560b147f8328 @elf_class=64, @endian=:little, @stream=#<File:spec/files/amd64>>
42
45
 
@@ -48,6 +51,7 @@ elf.build_id
48
51
  ```
49
52
 
50
53
  ## Sections
54
+
51
55
  ```ruby
52
56
  elf.section_by_name('.dynstr')
53
57
  #=>
@@ -75,6 +79,7 @@ elf.section_by_name('.note.gnu.build-id').data
75
79
  ```
76
80
 
77
81
  ## Symbols
82
+
78
83
  ```ruby
79
84
  symtab_section = elf.section_by_name('.symtab')
80
85
  symtab_section.num_symbols
@@ -92,6 +97,7 @@ symbols.map(&:name).reject(&:empty?).first(5).join(' ')
92
97
  ```
93
98
 
94
99
  ## Segments
100
+
95
101
  ```ruby
96
102
  elf.segment_by_type(:note)
97
103
  #=>
@@ -165,14 +171,14 @@ elf.save('elf.patched')
165
171
  2. Fully tested
166
172
  Of course.
167
173
  3. Lazy loading on everything
168
- To use **rbelftools**, only need to pass the stream object of ELF file.
174
+ To use **rbelftools**, passing the stream object of an ELF file.
169
175
  **rbelftools** will read the stream object **as least times as possible** when parsing
170
176
  the file. Most information will not be fetched until you need it, which makes
171
177
  **rbelftools** efficient.
172
178
  4. To be a library
173
179
  **rbelftools** is designed to be a library for further usage.
174
180
  It will _not_ add any too trivial features.
175
- For example, to check if NX disabled, you can use
181
+ For example, to check whether NX is disabled, **rbelftools** provides
176
182
  `!elf.segment_by_type(:gnu_stack).executable?` but not `elf.nx?`
177
183
  5. Section and segment parser
178
184
  Providing common sections and segments parser. For example, `.symtab`, `.shstrtab`
@@ -42,119 +42,371 @@ module ELFTools
42
42
  DF_1_SYMINTPOSE = 0x00800000 # Object has individual interposers.
43
43
  DF_1_GLOBAUDIT = 0x01000000 # Global auditing required.
44
44
  DF_1_SINGLETON = 0x02000000 # Singleton symbols are used.
45
+ DF_1_STUB = 0x04000000 # :nodoc:
46
+ DF_1_PIE = 0x08000000 # Object is a position-independent executable.
47
+ DF_1_KMOD = 0x10000000 # :nodoc:
48
+ DF_1_WEAKFILTER = 0x20000000 # :nodoc:
49
+ DF_1_NOCOMMON = 0x40000000 # :nodoc:
45
50
  end
46
51
  include DF
47
52
 
48
53
  # Dynamic table types, records in +d_tag+.
49
54
  module DT
50
- DT_NULL = 0 # marks the end of the _DYNAMIC array
51
- DT_NEEDED = 1 # libraries need to be linked by loader
52
- DT_PLTRELSZ = 2 # total size of relocation entries
53
- DT_PLTGOT = 3 # address of procedure linkage table or global offset table
54
- DT_HASH = 4 # address of symbol hash table
55
- DT_STRTAB = 5 # address of string table
56
- DT_SYMTAB = 6 # address of symbol table
57
- DT_RELA = 7 # address of a relocation table
58
- DT_RELASZ = 8 # total size of the {DT_RELA} table
59
- DT_RELAENT = 9 # size of each entry in the {DT_RELA} table
60
- DT_STRSZ = 10 # total size of {DT_STRTAB}
61
- DT_SYMENT = 11 # size of each entry in {DT_SYMTAB}
62
- DT_INIT = 12 # where the initialization function is
63
- DT_FINI = 13 # where the termination function is
64
- DT_SONAME = 14 # the shared object name
65
- DT_RPATH = 15 # has been superseded by {DT_RUNPATH}
66
- DT_SYMBOLIC = 16 # has been superseded by the DF_SYMBOLIC flag
67
- DT_REL = 17 # similar to {DT_RELA}
68
- DT_RELSZ = 18 # total size of the {DT_REL} table
69
- DT_RELENT = 19 # size of each entry in the {DT_REL} table
70
- DT_PLTREL = 20 # type of relocation entry, either {DT_REL} or {DT_RELA}
71
- DT_DEBUG = 21 # for debugging
72
- DT_TEXTREL = 22 # has been superseded by the DF_TEXTREL flag
73
- DT_JMPREL = 23 # address of relocation entries that are associated solely with the procedure linkage table
74
- DT_BIND_NOW = 24 # if the loader needs to do relocate now, superseded by the DF_BIND_NOW flag
75
- DT_INIT_ARRAY = 25 # address init array
76
- DT_FINI_ARRAY = 26 # address of fini array
77
- DT_INIT_ARRAYSZ = 27 # total size of init array
78
- DT_FINI_ARRAYSZ = 28 # total size of fini array
79
- DT_RUNPATH = 29 # path of libraries for searching
80
- DT_FLAGS = 30 # flags
81
- DT_ENCODING = 32 # just a lower bound
55
+ DT_NULL = 0 # marks the end of the _DYNAMIC array
56
+ DT_NEEDED = 1 # libraries need to be linked by loader
57
+ DT_PLTRELSZ = 2 # total size of relocation entries
58
+ DT_PLTGOT = 3 # address of procedure linkage table or global offset table
59
+ DT_HASH = 4 # address of symbol hash table
60
+ DT_STRTAB = 5 # address of string table
61
+ DT_SYMTAB = 6 # address of symbol table
62
+ DT_RELA = 7 # address of a relocation table
63
+ DT_RELASZ = 8 # total size of the {DT_RELA} table
64
+ DT_RELAENT = 9 # size of each entry in the {DT_RELA} table
65
+ DT_STRSZ = 10 # total size of {DT_STRTAB}
66
+ DT_SYMENT = 11 # size of each entry in {DT_SYMTAB}
67
+ DT_INIT = 12 # where the initialization function is
68
+ DT_FINI = 13 # where the termination function is
69
+ DT_SONAME = 14 # the shared object name
70
+ DT_RPATH = 15 # has been superseded by {DT_RUNPATH}
71
+ DT_SYMBOLIC = 16 # has been superseded by the DF_SYMBOLIC flag
72
+ DT_REL = 17 # similar to {DT_RELA}
73
+ DT_RELSZ = 18 # total size of the {DT_REL} table
74
+ DT_RELENT = 19 # size of each entry in the {DT_REL} table
75
+ DT_PLTREL = 20 # type of relocation entry, either {DT_REL} or {DT_RELA}
76
+ DT_DEBUG = 21 # for debugging
77
+ DT_TEXTREL = 22 # has been superseded by the DF_TEXTREL flag
78
+ DT_JMPREL = 23 # address of relocation entries associated solely with procedure linkage table
79
+ DT_BIND_NOW = 24 # if the loader needs to do relocate now, superseded by the DF_BIND_NOW flag
80
+ DT_INIT_ARRAY = 25 # address init array
81
+ DT_FINI_ARRAY = 26 # address of fini array
82
+ DT_INIT_ARRAYSZ = 27 # total size of init array
83
+ DT_FINI_ARRAYSZ = 28 # total size of fini array
84
+ DT_RUNPATH = 29 # path of libraries for searching
85
+ DT_FLAGS = 30 # flags
86
+ DT_ENCODING = 32 # just a lower bound
87
+ DT_PREINIT_ARRAY = 32 # pre-initialization functions array
88
+ DT_PREINIT_ARRAYSZ = 33 # pre-initialization functions array size (bytes)
89
+ DT_SYMTAB_SHNDX = 34 # address of the +SHT_SYMTAB_SHNDX+ section associated with {DT_SYMTAB} table
90
+ DT_RELRSZ = 35 # :nodoc:
91
+ DT_RELR = 36 # :nodoc:
92
+ DT_RELRENT = 37 # :nodoc:
93
+
82
94
  # Values between {DT_LOOS} and {DT_HIOS} are reserved for operating system-specific semantics.
83
- DT_LOOS = 0x6000000d
84
- DT_HIOS = 0x6ffff000 # see {DT_LOOS}
95
+ DT_LOOS = 0x6000000d
96
+ DT_HIOS = 0x6ffff000 # see {DT_LOOS}
97
+
85
98
  # Values between {DT_VALRNGLO} and {DT_VALRNGHI} use the +d_un.d_val+ field of the dynamic structure.
86
- DT_VALRNGLO = 0x6ffffd00
87
- DT_VALRNGHI = 0x6ffffdff # see {DT_VALRNGLO}
99
+ DT_VALRNGLO = 0x6ffffd00
100
+ DT_VALRNGHI = 0x6ffffdff # see {DT_VALRNGLO}
101
+
88
102
  # Values between {DT_ADDRRNGLO} and {DT_ADDRRNGHI} use the +d_un.d_ptr+ field of the dynamic structure.
89
- DT_ADDRRNGLO = 0x6ffffe00
90
- DT_GNU_HASH = 0x6ffffef5 # the gnu hash
91
- DT_ADDRRNGHI = 0x6ffffeff # see {DT_ADDRRNGLO}
92
- DT_RELACOUNT = 0x6ffffff9 # relative relocation count
93
- DT_RELCOUNT = 0x6ffffffa # relative relocation count
94
- DT_FLAGS_1 = 0x6ffffffb # flags
95
- DT_VERDEF = 0x6ffffffc # address of version definition table
96
- DT_VERDEFNUM = 0x6ffffffd # number of entries in {DT_VERDEF}
97
- DT_VERNEED = 0x6ffffffe # address of version dependency table
98
- DT_VERNEEDNUM = 0x6fffffff # number of entries in {DT_VERNEED}
103
+ DT_ADDRRNGLO = 0x6ffffe00
104
+ DT_GNU_HASH = 0x6ffffef5 # the gnu hash
105
+ DT_TLSDESC_PLT = 0x6ffffef6 # :nodoc:
106
+ DT_TLSDESC_GOT = 0x6ffffef7 # :nodoc:
107
+ DT_GNU_CONFLICT = 0x6ffffef8 # :nodoc:
108
+ DT_GNU_LIBLIST = 0x6ffffef9 # :nodoc:
109
+ DT_CONFIG = 0x6ffffefa # :nodoc:
110
+ DT_DEPAUDIT = 0x6ffffefb # :nodoc:
111
+ DT_AUDIT = 0x6ffffefc # :nodoc:
112
+ DT_PLTPAD = 0x6ffffefd # :nodoc:
113
+ DT_MOVETAB = 0x6ffffefe # :nodoc:
114
+ DT_SYMINFO = 0x6ffffeff # :nodoc:
115
+ DT_ADDRRNGHI = 0x6ffffeff # see {DT_ADDRRNGLO}
116
+
117
+ DT_VERSYM = 0x6ffffff0 # section address of .gnu.version
118
+ DT_RELACOUNT = 0x6ffffff9 # relative relocation count
119
+ DT_RELCOUNT = 0x6ffffffa # relative relocation count
120
+ DT_FLAGS_1 = 0x6ffffffb # flags
121
+ DT_VERDEF = 0x6ffffffc # address of version definition table
122
+ DT_VERDEFNUM = 0x6ffffffd # number of entries in {DT_VERDEF}
123
+ DT_VERNEED = 0x6ffffffe # address of version dependency table
124
+ DT_VERNEEDNUM = 0x6fffffff # number of entries in {DT_VERNEED}
125
+
99
126
  # Values between {DT_LOPROC} and {DT_HIPROC} are reserved for processor-specific semantics.
100
- DT_LOPROC = 0x70000000
101
- DT_HIPROC = 0x7fffffff # see {DT_LOPROC}
127
+ DT_LOPROC = 0x70000000
128
+
129
+ DT_PPC_GOT = 0x70000000 # global offset table
130
+ DT_PPC_OPT = 0x70000001 # whether various optimisations are possible
131
+
132
+ DT_PPC64_GLINK = 0x70000000 # start of the .glink section
133
+ DT_PPC64_OPD = 0x70000001 # start of the .opd section
134
+ DT_PPC64_OPDSZ = 0x70000002 # size of the .opd section
135
+ DT_PPC64_OPT = 0x70000003 # whether various optimisations are possible
136
+
137
+ DT_SPARC_REGISTER = 0x70000000 # index of an +STT_SPARC_REGISTER+ symbol within the {DT_SYMTAB} table
138
+
139
+ DT_MIPS_RLD_VERSION = 0x70000001 # 32 bit version number for runtime linker interface
140
+ DT_MIPS_TIME_STAMP = 0x70000002 # time stamp
141
+ DT_MIPS_ICHECKSUM = 0x70000003 # checksum of external strings and common sizes
142
+ DT_MIPS_IVERSION = 0x70000004 # index of version string in string table
143
+ DT_MIPS_FLAGS = 0x70000005 # 32 bits of flags
144
+ DT_MIPS_BASE_ADDRESS = 0x70000006 # base address of the segment
145
+ DT_MIPS_MSYM = 0x70000007 # :nodoc:
146
+ DT_MIPS_CONFLICT = 0x70000008 # address of +.conflict+ section
147
+ DT_MIPS_LIBLIST = 0x70000009 # address of +.liblist+ section
148
+ DT_MIPS_LOCAL_GOTNO = 0x7000000a # number of local global offset table entries
149
+ DT_MIPS_CONFLICTNO = 0x7000000b # number of entries in the +.conflict+ section
150
+ DT_MIPS_LIBLISTNO = 0x70000010 # number of entries in the +.liblist+ section
151
+ DT_MIPS_SYMTABNO = 0x70000011 # number of entries in the +.dynsym+ section
152
+ DT_MIPS_UNREFEXTNO = 0x70000012 # index of first external dynamic symbol not referenced locally
153
+ DT_MIPS_GOTSYM = 0x70000013 # index of first dynamic symbol in global offset table
154
+ DT_MIPS_HIPAGENO = 0x70000014 # number of page table entries in global offset table
155
+ DT_MIPS_RLD_MAP = 0x70000016 # address of run time loader map, used for debugging
156
+ DT_MIPS_DELTA_CLASS = 0x70000017 # delta C++ class definition
157
+ DT_MIPS_DELTA_CLASS_NO = 0x70000018 # number of entries in {DT_MIPS_DELTA_CLASS}
158
+ DT_MIPS_DELTA_INSTANCE = 0x70000019 # delta C++ class instances
159
+ DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a # number of entries in {DT_MIPS_DELTA_INSTANCE}
160
+ DT_MIPS_DELTA_RELOC = 0x7000001b # delta relocations
161
+ DT_MIPS_DELTA_RELOC_NO = 0x7000001c # number of entries in {DT_MIPS_DELTA_RELOC}
162
+ DT_MIPS_DELTA_SYM = 0x7000001d # delta symbols that Delta relocations refer to
163
+ DT_MIPS_DELTA_SYM_NO = 0x7000001e # number of entries in {DT_MIPS_DELTA_SYM}
164
+ DT_MIPS_DELTA_CLASSSYM = 0x70000020 # delta symbols that hold class declarations
165
+ DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021 # number of entries in {DT_MIPS_DELTA_CLASSSYM}
166
+ DT_MIPS_CXX_FLAGS = 0x70000022 # flags indicating information about C++ flavor
167
+ DT_MIPS_PIXIE_INIT = 0x70000023 # :nodoc:
168
+ DT_MIPS_SYMBOL_LIB = 0x70000024 # address of +.MIPS.symlib+
169
+ DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025 # GOT index of the first PTE for a segment
170
+ DT_MIPS_LOCAL_GOTIDX = 0x70000026 # GOT index of the first PTE for a local symbol
171
+ DT_MIPS_HIDDEN_GOTIDX = 0x70000027 # GOT index of the first PTE for a hidden symbol
172
+ DT_MIPS_PROTECTED_GOTIDX = 0x70000028 # GOT index of the first PTE for a protected symbol
173
+ DT_MIPS_OPTIONS = 0x70000029 # address of +.MIPS.options+
174
+ DT_MIPS_INTERFACE = 0x7000002a # address of +.interface+
175
+ DT_MIPS_DYNSTR_ALIGN = 0x7000002b # :nodoc:
176
+ DT_MIPS_INTERFACE_SIZE = 0x7000002c # size of the +.interface+ section
177
+ DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d # size of +rld_text_resolve+ function stored in the GOT
178
+ DT_MIPS_PERF_SUFFIX = 0x7000002e # default suffix of DSO to be added by rld on +dlopen()+ calls
179
+ DT_MIPS_COMPACT_SIZE = 0x7000002f # size of compact relocation section (O32)
180
+ DT_MIPS_GP_VALUE = 0x70000030 # GP value for auxiliary GOTs
181
+ DT_MIPS_AUX_DYNAMIC = 0x70000031 # address of auxiliary +.dynamic+
182
+ DT_MIPS_PLTGOT = 0x70000032 # address of the base of the PLTGOT
183
+ DT_MIPS_RWPLT = 0x70000034 # base of a writable PLT
184
+ DT_MIPS_RLD_MAP_REL = 0x70000035 # relative offset of run time loader map
185
+ DT_MIPS_XHASH = 0x70000036 # GNU-style hash table with xlat
186
+
187
+ DT_AUXILIARY = 0x7ffffffd # :nodoc:
188
+ DT_USED = 0x7ffffffe # :nodoc:
189
+ DT_FILTER = 0x7ffffffe # :nodoc:
190
+
191
+ DT_HIPROC = 0x7fffffff # see {DT_LOPROC}
102
192
  end
103
193
  include DT
104
194
 
105
195
  # These constants define the various ELF target machines.
106
196
  module EM
107
- EM_NONE = 0 # none
108
- EM_M32 = 1 # AT&T WE 32100
109
- EM_SPARC = 2 # SPARC
110
- EM_386 = 3 # Intel 80386
111
- EM_68K = 4 # Motorola 68000
112
- EM_88K = 5 # Motorola 88000
113
- EM_486 = 6 # Intel 80486
114
- EM_860 = 7 # Intel 80860
115
- EM_MIPS = 8 # MIPS R3000 (officially, big-endian only)
197
+ EM_NONE = 0 # none
198
+ EM_M32 = 1 # AT&T WE 32100
199
+ EM_SPARC = 2 # SPARC
200
+ EM_386 = 3 # Intel 80386
201
+ EM_68K = 4 # Motorola 68000
202
+ EM_88K = 5 # Motorola 88000
203
+ EM_486 = 6 # Intel 80486
204
+ EM_860 = 7 # Intel 80860
205
+ EM_MIPS = 8 # MIPS R3000 (officially, big-endian only)
206
+ EM_S370 = 9 # IBM System/370
116
207
 
117
208
  # Next two are historical and binaries and
118
209
  # modules of these types will be rejected by Linux.
119
- EM_MIPS_RS3_LE = 10 # MIPS R3000 little-endian
120
- EM_MIPS_RS4_BE = 10 # MIPS R4000 big-endian
121
-
122
- EM_PARISC = 15 # HPPA
123
- EM_SPARC32PLUS = 18 # Sun's "v8plus"
124
- EM_PPC = 20 # PowerPC
125
- EM_PPC64 = 21 # PowerPC64
126
- EM_SPU = 23 # Cell BE SPU
127
- EM_ARM = 40 # ARM 32 bit
128
- EM_SH = 42 # SuperH
129
- EM_SPARCV9 = 43 # SPARC v9 64-bit
130
- EM_H8_300 = 46 # Renesas H8/300
131
- EM_IA_64 = 50 # HP/Intel IA-64
132
- EM_X86_64 = 62 # AMD x86-64
133
- EM_S390 = 22 # IBM S/390
134
- EM_CRIS = 76 # Axis Communications 32-bit embedded processor
135
- EM_M32R = 88 # Renesas M32R
136
- EM_MN10300 = 89 # Panasonic/MEI MN10300, AM33
137
- EM_OPENRISC = 92 # OpenRISC 32-bit embedded processor
138
- EM_BLACKFIN = 106 # ADI Blackfin Processor
139
- EM_ALTERA_NIOS2 = 113 # Altera Nios II soft-core processor
140
- EM_TI_C6000 = 140 # TI C6X DSPs
141
- EM_AARCH64 = 183 # ARM 64 bit
142
- EM_TILEPRO = 188 # Tilera TILEPro
143
- EM_MICROBLAZE = 189 # Xilinx MicroBlaze
144
- EM_TILEGX = 191 # Tilera TILE-Gx
145
- EM_BPF = 247 # Linux BPF - in-kernel virtual machine
146
- EM_FRV = 0x5441 # Fujitsu FR-V
147
- EM_AVR32 = 0x18ad # Atmel AVR32
210
+ EM_MIPS_RS3_LE = 10 # MIPS R3000 little-endian
211
+ EM_MIPS_RS4_BE = 10 # MIPS R4000 big-endian
212
+
213
+ EM_PARISC = 15 # HPPA
214
+ EM_VPP500 = 17 # Fujitsu VPP500 (also some older versions of PowerPC)
215
+ EM_SPARC32PLUS = 18 # Sun's "v8plus"
216
+ EM_960 = 19 # Intel 80960
217
+ EM_PPC = 20 # PowerPC
218
+ EM_PPC64 = 21 # PowerPC64
219
+ EM_S390 = 22 # IBM S/390
220
+ EM_SPU = 23 # Cell BE SPU
221
+ EM_V800 = 36 # NEC V800 series
222
+ EM_FR20 = 37 # Fujitsu FR20
223
+ EM_RH32 = 38 # TRW RH32
224
+ EM_RCE = 39 # Motorola M*Core
225
+ EM_ARM = 40 # ARM 32 bit
226
+ EM_SH = 42 # SuperH
227
+ EM_SPARCV9 = 43 # SPARC v9 64-bit
228
+ EM_TRICORE = 44 # Siemens Tricore embedded processor
229
+ EM_ARC = 45 # ARC Cores
230
+ EM_H8_300 = 46 # Renesas H8/300
231
+ EM_H8_300H = 47 # Renesas H8/300H
232
+ EM_H8S = 48 # Renesas H8S
233
+ EM_H8_500 = 49 # Renesas H8/500H
234
+ EM_IA_64 = 50 # HP/Intel IA-64
235
+ EM_MIPS_X = 51 # Stanford MIPS-X
236
+ EM_COLDFIRE = 52 # Motorola Coldfire
237
+ EM_68HC12 = 53 # Motorola M68HC12
238
+ EM_MMA = 54 # Fujitsu Multimedia Accelerator
239
+ EM_PCP = 55 # Siemens PCP
240
+ EM_NCPU = 56 # Sony nCPU embedded RISC processor
241
+ EM_NDR1 = 57 # Denso NDR1 microprocessor
242
+ EM_STARCORE = 58 # Motorola Star*Core processor
243
+ EM_ME16 = 59 # Toyota ME16 processor
244
+ EM_ST100 = 60 # STMicroelectronics ST100 processor
245
+ EM_TINYJ = 61 # Advanced Logic Corp. TinyJ embedded processor
246
+ EM_X86_64 = 62 # AMD x86-64
247
+ EM_PDSP = 63 # Sony DSP Processor
248
+ EM_PDP10 = 64 # Digital Equipment Corp. PDP-10
249
+ EM_PDP11 = 65 # Digital Equipment Corp. PDP-11
250
+ EM_FX66 = 66 # Siemens FX66 microcontroller
251
+ EM_ST9PLUS = 67 # STMicroelectronics ST9+ 8/16 bit microcontroller
252
+ EM_ST7 = 68 # STMicroelectronics ST7 8-bit microcontroller
253
+ EM_68HC16 = 69 # Motorola MC68HC16 Microcontroller
254
+ EM_68HC11 = 70 # Motorola MC68HC11 Microcontroller
255
+ EM_68HC08 = 71 # Motorola MC68HC08 Microcontroller
256
+ EM_68HC05 = 72 # Motorola MC68HC05 Microcontroller
257
+ EM_SVX = 73 # Silicon Graphics SVx
258
+ EM_ST19 = 74 # STMicroelectronics ST19 8-bit cpu
259
+ EM_VAX = 75 # Digital VAX
260
+ EM_CRIS = 76 # Axis Communications 32-bit embedded processor
261
+ EM_JAVELIN = 77 # Infineon Technologies 32-bit embedded cpu
262
+ EM_FIREPATH = 78 # Element 14 64-bit DSP processor
263
+ EM_ZSP = 79 # LSI Logic's 16-bit DSP processor
264
+ EM_MMIX = 80 # Donald Knuth's educational 64-bit processor
265
+ EM_HUANY = 81 # Harvard's machine-independent format
266
+ EM_PRISM = 82 # SiTera Prism
267
+ EM_AVR = 83 # Atmel AVR 8-bit microcontroller
268
+ EM_FR30 = 84 # Fujitsu FR30
269
+ EM_D10V = 85 # Mitsubishi D10V
270
+ EM_D30V = 86 # Mitsubishi D30V
271
+ EM_V850 = 87 # Renesas V850
272
+ EM_M32R = 88 # Renesas M32R
273
+ EM_MN10300 = 89 # Matsushita MN10300
274
+ EM_MN10200 = 90 # Matsushita MN10200
275
+ EM_PJ = 91 # picoJava
276
+ EM_OPENRISC = 92 # OpenRISC 32-bit embedded processor
277
+ EM_ARC_COMPACT = 93 # ARC International ARCompact processor
278
+ EM_XTENSA = 94 # Tensilica Xtensa Architecture
279
+ EM_VIDEOCORE = 95 # Alphamosaic VideoCore processor
280
+ EM_TMM_GPP = 96 # Thompson Multimedia General Purpose Processor
281
+ EM_NS32K = 97 # National Semiconductor 32000 series
282
+ EM_TPC = 98 # Tenor Network TPC processor
283
+ EM_SNP1K = 99 # Trebia SNP 1000 processor
284
+ EM_ST200 = 100 # STMicroelectronics ST200 microcontroller
285
+ EM_IP2K = 101 # Ubicom IP2022 micro controller
286
+ EM_MAX = 102 # MAX Processor
287
+ EM_CR = 103 # National Semiconductor CompactRISC
288
+ EM_F2MC16 = 104 # Fujitsu F2MC16
289
+ EM_MSP430 = 105 # TI msp430 micro controller
290
+ EM_BLACKFIN = 106 # ADI Blackfin Processor
291
+ EM_SE_C33 = 107 # S1C33 Family of Seiko Epson processors
292
+ EM_SEP = 108 # Sharp embedded microprocessor
293
+ EM_ARCA = 109 # Arca RISC Microprocessor
294
+ EM_UNICORE = 110 # Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University
295
+ EM_EXCESS = 111 # eXcess: 16/32/64-bit configurable embedded CPU
296
+ EM_DXP = 112 # Icera Semiconductor Inc. Deep Execution Processor
297
+ EM_ALTERA_NIOS2 = 113 # Altera Nios II soft-core processor
298
+ EM_CRX = 114 # National Semiconductor CRX
299
+ EM_XGATE = 115 # Motorola XGATE embedded processor
300
+ EM_C116 = 116 # Infineon C16x/XC16x processor
301
+ EM_M16C = 117 # Renesas M16C series microprocessors
302
+ EM_DSPIC30F = 118 # Microchip Technology dsPIC30F Digital Signal Controller
303
+ EM_CE = 119 # Freescale Communication Engine RISC core
304
+ EM_M32C = 120 # Freescale Communication Engine RISC core
305
+ EM_TSK3000 = 131 # Altium TSK3000 core
306
+ EM_RS08 = 132 # Freescale RS08 embedded processor
307
+ EM_SHARC = 133 # Analog Devices SHARC family of 32-bit DSP processors
308
+ EM_ECOG2 = 134 # Cyan Technology eCOG2 microprocessor
309
+ EM_SCORE7 = 135 # Sunplus S+core7 RISC processor
310
+ EM_DSP24 = 136 # New Japan Radio (NJR) 24-bit DSP Processor
311
+ EM_VIDEOCORE3 = 137 # Broadcom VideoCore III processor
312
+ EM_LATTICEMICO32 = 138 # RISC processor for Lattice FPGA architecture
313
+ EM_SE_C17 = 139 # Seiko Epson C17 family
314
+ EM_TI_C6000 = 140 # The Texas Instruments TMS320C6000 DSP family
315
+ EM_TI_C2000 = 141 # The Texas Instruments TMS320C2000 DSP family
316
+ EM_TI_C5500 = 142 # The Texas Instruments TMS320C55x DSP family
317
+ EM_TI_ARP32 = 143 # Texas Instruments Application Specific RISC Processor, 32bit fetch
318
+ EM_TI_PRU = 144 # Texas Instruments Programmable Realtime Unit
319
+ EM_MMDSP_PLUS = 160 # STMicroelectronics 64bit VLIW Data Signal Processor
320
+ EM_CYPRESS_M8C = 161 # Cypress M8C microprocessor
321
+ EM_R32C = 162 # Renesas R32C series microprocessors
322
+ EM_TRIMEDIA = 163 # NXP Semiconductors TriMedia architecture family
323
+ EM_QDSP6 = 164 # QUALCOMM DSP6 Processor
324
+ EM_8051 = 165 # Intel 8051 and variants
325
+ EM_STXP7X = 166 # STMicroelectronics STxP7x family
326
+ EM_NDS32 = 167 # Andes Technology compact code size embedded RISC processor family
327
+ EM_ECOG1 = 168 # Cyan Technology eCOG1X family
328
+ EM_ECOG1X = 168 # Cyan Technology eCOG1X family
329
+ EM_MAXQ30 = 169 # Dallas Semiconductor MAXQ30 Core Micro-controllers
330
+ EM_XIMO16 = 170 # New Japan Radio (NJR) 16-bit DSP Processor
331
+ EM_MANIK = 171 # M2000 Reconfigurable RISC Microprocessor
332
+ EM_CRAYNV2 = 172 # Cray Inc. NV2 vector architecture
333
+ EM_RX = 173 # Renesas RX family
334
+ EM_METAG = 174 # Imagination Technologies Meta processor architecture
335
+ EM_MCST_ELBRUS = 175 # MCST Elbrus general purpose hardware architecture
336
+ EM_ECOG16 = 176 # Cyan Technology eCOG16 family
337
+ EM_CR16 = 177 # National Semiconductor CompactRISC 16-bit processor
338
+ EM_ETPU = 178 # Freescale Extended Time Processing Unit
339
+ EM_SLE9X = 179 # Infineon Technologies SLE9X core
340
+ EM_L1OM = 180 # Intel L1OM
341
+ EM_K1OM = 181 # Intel K1OM
342
+ EM_AARCH64 = 183 # ARM 64 bit
343
+ EM_AVR32 = 185 # Atmel Corporation 32-bit microprocessor family
344
+ EM_STM8 = 186 # STMicroeletronics STM8 8-bit microcontroller
345
+ EM_TILE64 = 187 # Tilera TILE64 multicore architecture family
346
+ EM_TILEPRO = 188 # Tilera TILEPro
347
+ EM_MICROBLAZE = 189 # Xilinx MicroBlaze
348
+ EM_CUDA = 190 # NVIDIA CUDA architecture
349
+ EM_TILEGX = 191 # Tilera TILE-Gx
350
+ EM_CLOUDSHIELD = 192 # CloudShield architecture family
351
+ EM_COREA_1ST = 193 # KIPO-KAIST Core-A 1st generation processor family
352
+ EM_COREA_2ND = 194 # KIPO-KAIST Core-A 2nd generation processor family
353
+ EM_ARC_COMPACT2 = 195 # Synopsys ARCompact V2
354
+ EM_OPEN8 = 196 # Open8 8-bit RISC soft processor core
355
+ EM_RL78 = 197 # Renesas RL78 family
356
+ EM_VIDEOCORE5 = 198 # Broadcom VideoCore V processor
357
+ EM_78K0R = 199 # Renesas 78K0R
358
+ EM_56800EX = 200 # Freescale 56800EX Digital Signal Controller (DSC)
359
+ EM_BA1 = 201 # Beyond BA1 CPU architecture
360
+ EM_BA2 = 202 # Beyond BA2 CPU architecture
361
+ EM_XCORE = 203 # XMOS xCORE processor family
362
+ EM_MCHP_PIC = 204 # Microchip 8-bit PIC(r) family
363
+ EM_INTELGT = 205 # Intel Graphics Technology
364
+ EM_KM32 = 210 # KM211 KM32 32-bit processor
365
+ EM_KMX32 = 211 # KM211 KMX32 32-bit processor
366
+ EM_KMX16 = 212 # KM211 KMX16 16-bit processor
367
+ EM_KMX8 = 213 # KM211 KMX8 8-bit processor
368
+ EM_KVARC = 214 # KM211 KVARC processor
369
+ EM_CDP = 215 # Paneve CDP architecture family
370
+ EM_COGE = 216 # Cognitive Smart Memory Processor
371
+ EM_COOL = 217 # Bluechip Systems CoolEngine
372
+ EM_NORC = 218 # Nanoradio Optimized RISC
373
+ EM_CSR_KALIMBA = 219 # CSR Kalimba architecture family
374
+ EM_Z80 = 220 # Zilog Z80
375
+ EM_VISIUM = 221 # Controls and Data Services VISIUMcore processor
376
+ EM_FT32 = 222 # FTDI Chip FT32 high performance 32-bit RISC architecture
377
+ EM_MOXIE = 223 # Moxie processor family
378
+ EM_AMDGPU = 224 # AMD GPU architecture
379
+ EM_LANAI = 244 # Lanai 32-bit processor
380
+ EM_CEVA = 245 # CEVA Processor Architecture Family
381
+ EM_CEVA_X2 = 246 # CEVA X2 Processor Family
382
+ EM_BPF = 247 # Linux BPF - in-kernel virtual machine
383
+ EM_GRAPHCORE_IPU = 248 # Graphcore Intelligent Processing Unit
384
+ EM_IMG1 = 249 # Imagination Technologies
385
+ EM_NFP = 250 # Netronome Flow Processor (NFP)
386
+ EM_VE = 251 # NEC Vector Engine
387
+ EM_CSKY = 252 # C-SKY processor family
388
+ EM_ARC_COMPACT3_64 = 253 # Synopsys ARCv2.3 64-bit
389
+ EM_MCS6502 = 254 # MOS Technology MCS 6502 processor
390
+ EM_ARC_COMPACT3 = 255 # Synopsys ARCv2.3 32-bit
391
+ EM_KVX = 256 # Kalray VLIW core of the MPPA processor family
392
+ EM_65816 = 257 # WDC 65816/65C816
393
+ EM_LOONGARCH = 258 # LoongArch
394
+ EM_KF32 = 259 # ChipON KungFu32
395
+ EM_U16_U8CORE = 260 # LAPIS nX-U16/U8
396
+ EM_TACHYUM = 261 # Tachyum
397
+ EM_56800EF = 262 # NXP 56800EF Digital Signal Controller (DSC)
398
+
399
+ EM_FRV = 0x5441 # Fujitsu FR-V
148
400
 
149
401
  # This is an interim value that we will use until the committee comes up with a final number.
150
- EM_ALPHA = 0x9026
402
+ EM_ALPHA = 0x9026
151
403
 
152
404
  # Bogus old m32r magic number, used by old tools.
153
- EM_CYGNUS_M32R = 0x9041
405
+ EM_CYGNUS_M32R = 0x9041
154
406
  # This is the old interim value for S/390 architecture
155
- EM_S390_OLD = 0xA390
407
+ EM_S390_OLD = 0xA390
156
408
  # Also Panasonic/MEI MN10300, AM33
157
- EM_CYGNUS_MN10300 = 0xbeef
409
+ EM_CYGNUS_MN10300 = 0xbeef
158
410
 
159
411
  # Return the architecture name according to +val+.
160
412
  # Used by {ELFTools::ELFFile#machine}.
@@ -190,7 +442,7 @@ module ELFTools
190
442
  end
191
443
  include EM
192
444
 
193
- # This module defines elf file types.
445
+ # This module defines ELF file types.
194
446
  module ET
195
447
  ET_NONE = 0 # no file type
196
448
  ET_REL = 1 # relocatable file
@@ -212,47 +464,211 @@ module ELFTools
212
464
  end
213
465
  include ET
214
466
 
467
+ # Program header permission flags, records bitwise OR value in +p_flags+.
468
+ module PF
469
+ PF_X = 1 # executable
470
+ PF_W = 2 # writable
471
+ PF_R = 4 # readable
472
+ end
473
+ include PF
474
+
215
475
  # Program header types, records in +p_type+.
216
476
  module PT
217
- PT_NULL = 0 # null segment
218
- PT_LOAD = 1 # segment to be load
219
- PT_DYNAMIC = 2 # dynamic tags
220
- PT_INTERP = 3 # interpreter, same as .interp section
221
- PT_NOTE = 4 # same as .note* section
222
- PT_SHLIB = 5 # reserved
223
- PT_PHDR = 6 # where program header starts
224
- PT_TLS = 7 # thread local storage segment
225
- PT_LOOS = 0x60000000 # OS-specific
226
- PT_HIOS = 0x6fffffff # OS-specific
477
+ PT_NULL = 0 # null segment
478
+ PT_LOAD = 1 # segment to be load
479
+ PT_DYNAMIC = 2 # dynamic tags
480
+ PT_INTERP = 3 # interpreter, same as .interp section
481
+ PT_NOTE = 4 # same as .note* section
482
+ PT_SHLIB = 5 # reserved
483
+ PT_PHDR = 6 # where program header starts
484
+ PT_TLS = 7 # thread local storage segment
485
+
486
+ PT_LOOS = 0x60000000 # OS-specific
487
+ PT_GNU_EH_FRAME = 0x6474e550 # for exception handler
488
+ PT_GNU_STACK = 0x6474e551 # permission of stack
489
+ PT_GNU_RELRO = 0x6474e552 # read only after relocation
490
+ PT_GNU_PROPERTY = 0x6474e553 # GNU property
491
+ PT_GNU_MBIND_HI = 0x6474f554 # Mbind segments (upper bound)
492
+ PT_GNU_MBIND_LO = 0x6474e555 # Mbind segments (lower bound)
493
+ PT_OPENBSD_RANDOMIZE = 0x65a3dbe6 # Fill with random data
494
+ PT_OPENBSD_WXNEEDED = 0x65a3dbe7 # Program does W^X violations
495
+ PT_OPENBSD_BOOTDATA = 0x65a41be6 # Section for boot arguments
496
+ PT_HIOS = 0x6fffffff # OS-specific
497
+
227
498
  # Values between {PT_LOPROC} and {PT_HIPROC} are reserved for processor-specific semantics.
228
- PT_LOPROC = 0x70000000
229
- PT_HIPROC = 0x7fffffff # see {PT_LOPROC}
230
- PT_GNU_EH_FRAME = 0x6474e550 # for exception handler
231
- PT_GNU_STACK = 0x6474e551 # permission of stack
232
- PT_GNU_RELRO = 0x6474e552 # read only after relocation
499
+ PT_LOPROC = 0x70000000
500
+
501
+ PT_ARM_ARCHEXT = 0x70000000 # platform architecture compatibility information
502
+ PT_ARM_EXIDX = 0x70000001 # exception unwind tables
503
+
504
+ PT_MIPS_REGINFO = 0x70000000 # register usage information
505
+ PT_MIPS_RTPROC = 0x70000001 # runtime procedure table
506
+ PT_MIPS_OPTIONS = 0x70000002 # +.MIPS.options+ section
507
+ PT_MIPS_ABIFLAGS = 0x70000003 # +.MIPS.abiflags+ section
508
+
509
+ PT_AARCH64_ARCHEXT = 0x70000000 # platform architecture compatibility information
510
+ PT_AARCH64_UNWIND = 0x70000001 # exception unwind tables
511
+
512
+ PT_S390_PGSTE = 0x70000000 # 4k page table size
513
+
514
+ PT_HIPROC = 0x7fffffff # see {PT_LOPROC}
233
515
  end
234
516
  include PT
235
517
 
518
+ # Special indices to section. These are used when there is no valid index to section header.
519
+ # The meaning of these values is left upto the embedding header.
520
+ module SHN
521
+ SHN_UNDEF = 0 # undefined section
522
+ SHN_LORESERVE = 0xff00 # start of reserved indices
523
+
524
+ # Values between {SHN_LOPROC} and {SHN_HIPROC} are reserved for processor-specific semantics.
525
+ SHN_LOPROC = 0xff00
526
+
527
+ SHN_MIPS_ACOMMON = 0xff00 # defined and allocated common symbol
528
+ SHN_MIPS_TEXT = 0xff01 # defined and allocated text symbol
529
+ SHN_MIPS_DATA = 0xff02 # defined and allocated data symbol
530
+ SHN_MIPS_SCOMMON = 0xff03 # small common symbol
531
+ SHN_MIPS_SUNDEFINED = 0xff04 # small undefined symbol
532
+
533
+ SHN_X86_64_LCOMMON = 0xff02 # large common symbol
534
+
535
+ SHN_HIPROC = 0xff1f # see {SHN_LOPROC}
536
+
537
+ # Values between {SHN_LOOS} and {SHN_HIOS} are reserved for operating system-specific semantics.
538
+ SHN_LOOS = 0xff20
539
+ SHN_HIOS = 0xff3f # see {SHN_LOOS}
540
+ SHN_ABS = 0xfff1 # specifies absolute values for the corresponding reference
541
+ SHN_COMMON = 0xfff2 # symbols defined relative to this section are common symbols
542
+ SHN_XINDEX = 0xffff # escape value indicating that the actual section header index is too large to fit
543
+ SHN_HIRESERVE = 0xffff # end of reserved indices
544
+ end
545
+ include SHN
546
+
547
+ # Section flag mask types, records in +sh_flag+.
548
+ module SHF
549
+ SHF_WRITE = (1 << 0) # Writable
550
+ SHF_ALLOC = (1 << 1) # Occupies memory during execution
551
+ SHF_EXECINSTR = (1 << 2) # Executable
552
+ SHF_MERGE = (1 << 4) # Might be merged
553
+ SHF_STRINGS = (1 << 5) # Contains nul-terminated strings
554
+ SHF_INFO_LINK = (1 << 6) # `sh_info' contains SHT index
555
+ SHF_LINK_ORDER = (1 << 7) # Preserve order after combining
556
+ SHF_OS_NONCONFORMING = (1 << 8) # Non-standard OS specific handling required
557
+ SHF_GROUP = (1 << 9) # Section is member of a group.
558
+ SHF_TLS = (1 << 10) # Section hold thread-local data.
559
+ SHF_COMPRESSED = (1 << 11) # Section with compressed data.
560
+ SHF_MASKOS = 0x0ff00000 # OS-specific.
561
+ SHF_MASKPROC = 0xf0000000 # Processor-specific
562
+ SHF_GNU_RETAIN = (1 << 21) # Not to be GCed by linker.
563
+ SHF_GNU_MBIND = (1 << 24) # Mbind section
564
+ SHF_ORDERED = (1 << 30) # Special ordering requirement
565
+ SHF_EXCLUDE = (1 << 31) # Section is excluded unless referenced or allocated (Solaris).
566
+ end
567
+ include SHF
568
+
236
569
  # Section header types, records in +sh_type+.
237
570
  module SHT
238
- SHT_NULL = 0 # null section
239
- SHT_PROGBITS = 1 # information defined by program itself
240
- SHT_SYMTAB = 2 # symbol table section
241
- SHT_STRTAB = 3 # string table section
242
- SHT_RELA = 4 # relocation with addends
243
- SHT_HASH = 5 # symbol hash table
244
- SHT_DYNAMIC = 6 # information of dynamic linking
245
- SHT_NOTE = 7 # note section
246
- SHT_NOBITS = 8 # section occupies no space
247
- SHT_REL = 9 # relocation
248
- SHT_SHLIB = 10 # reserved
249
- SHT_DYNSYM = 11 # symbols for dynamic
571
+ SHT_NULL = 0 # null section
572
+ SHT_PROGBITS = 1 # information defined by program itself
573
+ SHT_SYMTAB = 2 # symbol table section
574
+ SHT_STRTAB = 3 # string table section
575
+ SHT_RELA = 4 # relocation with addends
576
+ SHT_HASH = 5 # symbol hash table
577
+ SHT_DYNAMIC = 6 # information of dynamic linking
578
+ SHT_NOTE = 7 # section for notes
579
+ SHT_NOBITS = 8 # section occupies no space
580
+ SHT_REL = 9 # relocation
581
+ SHT_SHLIB = 10 # reserved
582
+ SHT_DYNSYM = 11 # symbols for dynamic
583
+ SHT_INIT_ARRAY = 14 # array of initialization functions
584
+ SHT_FINI_ARRAY = 15 # array of termination functions
585
+ SHT_PREINIT_ARRAY = 16 # array of functions that are invoked before all other initialization functions
586
+ SHT_GROUP = 17 # section group
587
+ SHT_SYMTAB_SHNDX = 18 # indices for SHN_XINDEX entries
588
+ SHT_RELR = 19 # RELR relative relocations
589
+
590
+ # Values between {SHT_LOOS} and {SHT_HIOS} are reserved for operating system-specific semantics.
591
+ SHT_LOOS = 0x60000000
592
+ SHT_GNU_INCREMENTAL_INPUTS = 0x6fff4700 # incremental build data
593
+ SHT_GNU_INCREMENTAL_SYMTAB = 0x6fff4701 # incremental build data
594
+ SHT_GNU_INCREMENTAL_RELOCS = 0x6fff4702 # incremental build data
595
+ SHT_GNU_INCREMENTAL_GOT_PLT = 0x6fff4703 # incremental build data
596
+ SHT_GNU_ATTRIBUTES = 0x6ffffff5 # object attributes
597
+ SHT_GNU_HASH = 0x6ffffff6 # GNU style symbol hash table
598
+ SHT_GNU_LIBLIST = 0x6ffffff7 # list of prelink dependencies
599
+ SHT_SUNW_verdef = 0x6ffffffd # versions defined by file
600
+ SHT_GNU_verdef = 0x6ffffffd # versions defined by file
601
+ SHT_SUNW_verneed = 0x6ffffffe # versions needed by file
602
+ SHT_GNU_verneed = 0x6ffffffe # versions needed by file
603
+ SHT_SUNW_versym = 0x6fffffff # symbol versions
604
+ SHT_GNU_versym = 0x6fffffff # symbol versions
605
+ SHT_HIOS = 0x6fffffff # see {SHT_LOOS}
606
+
250
607
  # Values between {SHT_LOPROC} and {SHT_HIPROC} are reserved for processor-specific semantics.
251
- SHT_LOPROC = 0x70000000
252
- SHT_HIPROC = 0x7fffffff # see {SHT_LOPROC}
608
+ SHT_LOPROC = 0x70000000
609
+
610
+ SHT_SPARC_GOTDATA = 0x70000000 # :nodoc:
611
+
612
+ SHT_ARM_EXIDX = 0x70000001 # exception index table
613
+ SHT_ARM_PREEMPTMAP = 0x70000002 # BPABI DLL dynamic linking pre-emption map
614
+ SHT_ARM_ATTRIBUTES = 0x70000003 # object file compatibility attributes
615
+ SHT_ARM_DEBUGOVERLAY = 0x70000004 # support for debugging overlaid programs
616
+ SHT_ARM_OVERLAYSECTION = 0x70000005 # support for debugging overlaid programs
617
+
618
+ SHT_X86_64_UNWIND = 0x70000001 # x86_64 unwind information
619
+
620
+ SHT_MIPS_LIBLIST = 0x70000000 # set of dynamic shared objects
621
+ SHT_MIPS_MSYM = 0x70000001 # :nodoc:
622
+ SHT_MIPS_CONFLICT = 0x70000002 # list of symbols whose definitions conflict with shared objects
623
+ SHT_MIPS_GPTAB = 0x70000003 # global pointer table
624
+ SHT_MIPS_UCODE = 0x70000004 # microcode information
625
+ SHT_MIPS_DEBUG = 0x70000005 # register usage information
626
+ SHT_MIPS_REGINFO = 0x70000006 # section contains register usage information
627
+ SHT_MIPS_PACKAGE = 0x70000007 # :nodoc:
628
+ SHT_MIPS_PACKSYM = 0x70000008 # :nodoc:
629
+ SHT_MIPS_RELD = 0x70000009 # :nodoc:
630
+ SHT_MIPS_IFACE = 0x7000000b # interface information
631
+ SHT_MIPS_CONTENT = 0x7000000c # description of contents of another section
632
+ SHT_MIPS_OPTIONS = 0x7000000d # miscellaneous options
633
+ SHT_MIPS_SHDR = 0x70000010 # :nodoc:
634
+ SHT_MIPS_FDESC = 0x70000011 # :nodoc:
635
+ SHT_MIPS_EXTSYM = 0x70000012 # :nodoc:
636
+ SHT_MIPS_DENSE = 0x70000013 # :nodoc:
637
+ SHT_MIPS_PDESC = 0x70000014 # :nodoc:
638
+ SHT_MIPS_LOCSYM = 0x70000015 # :nodoc:
639
+ SHT_MIPS_AUXSYM = 0x70000016 # :nodoc:
640
+ SHT_MIPS_OPTSYM = 0x70000017 # :nodoc:
641
+ SHT_MIPS_LOCSTR = 0x70000018 # :nodoc:
642
+ SHT_MIPS_LINE = 0x70000019 # :nodoc:
643
+ SHT_MIPS_RFDESC = 0x7000001a # :nodoc:
644
+ SHT_MIPS_DELTASYM = 0x7000001b # delta C++ symbol table
645
+ SHT_MIPS_DELTAINST = 0x7000001c # delta C++ instance table
646
+ SHT_MIPS_DELTACLASS = 0x7000001d # delta C++ class table
647
+ SHT_MIPS_DWARF = 0x7000001e # DWARF debugging section
648
+ SHT_MIPS_DELTADECL = 0x7000001f # delta C++ declarations
649
+ SHT_MIPS_SYMBOL_LIB = 0x70000020 # list of libraries the binary depends on
650
+ SHT_MIPS_EVENTS = 0x70000021 # events section
651
+ SHT_MIPS_TRANSLATE = 0x70000022 # :nodoc:
652
+ SHT_MIPS_PIXIE = 0x70000023 # :nodoc:
653
+ SHT_MIPS_XLATE = 0x70000024 # address translation table
654
+ SHT_MIPS_XLATE_DEBUG = 0x70000025 # SGI internal address translation table
655
+ SHT_MIPS_WHIRL = 0x70000026 # intermediate code
656
+ SHT_MIPS_EH_REGION = 0x70000027 # C++ exception handling region info
657
+ SHT_MIPS_PDR_EXCEPTION = 0x70000029 # runtime procedure descriptor table exception information
658
+ SHT_MIPS_ABIFLAGS = 0x7000002a # ABI related flags
659
+ SHT_MIPS_XHASH = 0x7000002b # GNU style symbol hash table with xlat
660
+
661
+ SHT_AARCH64_ATTRIBUTES = 0x70000003 # :nodoc:
662
+
663
+ SHT_CSKY_ATTRIBUTES = 0x70000001 # object file compatibility attributes
664
+
665
+ SHT_ORDERED = 0x7fffffff # :nodoc:
666
+
667
+ SHT_HIPROC = 0x7fffffff # see {SHT_LOPROC}
668
+
253
669
  # Values between {SHT_LOUSER} and {SHT_HIUSER} are reserved for application programs.
254
- SHT_LOUSER = 0x80000000
255
- SHT_HIUSER = 0xffffffff # see {SHT_LOUSER}
670
+ SHT_LOUSER = 0x80000000
671
+ SHT_HIUSER = 0xffffffff # see {SHT_LOUSER}
256
672
  end
257
673
  include SHT
258
674
 
@@ -279,7 +695,9 @@ module ELFTools
279
695
  STT_FILE = 4 # Symbol's name is file name
280
696
  STT_COMMON = 5 # Symbol is a common data object
281
697
  STT_TLS = 6 # Symbol is thread-local data object
282
- STT_NUM = 7 # Number of defined types.
698
+ STT_NUM = 7 # Deprecated.
699
+ STT_RELC = 8 # Complex relocation expression
700
+ STT_SRELC = 9 # Signed Complex relocation expression
283
701
 
284
702
  # GNU extension: symbol value points to a function which is called
285
703
  # at runtime to determine the final value of the symbol.
@@ -297,6 +715,7 @@ module ELFTools
297
715
  # ARM: a THUMB function. This is not defined in ARM ELF Specification but
298
716
  # used by the GNU tool-chain.
299
717
  STT_ARM_TFUNC = 13
718
+ STT_ARM_16BIT = 15 # ARM: a THUMB label.
300
719
  end
301
720
  include STT
302
721
  end
@@ -56,7 +56,7 @@ module ELFTools
56
56
  note = section.notes.first
57
57
  return nil if note.nil?
58
58
 
59
- note.desc.unpack('H*').first
59
+ note.desc.unpack1('H*')
60
60
  end
61
61
 
62
62
  # Get machine architecture.
@@ -318,7 +318,7 @@ module ELFTools
318
318
  patches.each do |pos, val|
319
319
  all[pos, val.size] = val
320
320
  end
321
- IO.binwrite(filename, all)
321
+ File.binwrite(filename, all)
322
322
  end
323
323
 
324
324
  private
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'delegate'
4
+
3
5
  module ELFTools
4
6
  # A helper class for {ELFTools} easy to implement
5
7
  # 'lazy loading' objects.
6
8
  # Mainly used when loading sections, segments, and
7
9
  # symbols.
8
- class LazyArray
10
+ class LazyArray < SimpleDelegator
9
11
  # Instantiate a {LazyArray} object.
10
12
  # @param [Integer] size
11
13
  # The size of array.
@@ -26,7 +28,7 @@ module ELFTools
26
28
  # p arr[3]
27
29
  # # 9
28
30
  def initialize(size, &block)
29
- @internal = Array.new(size)
31
+ super(Array.new(size))
30
32
  @block = block
31
33
  end
32
34
 
@@ -39,9 +41,9 @@ module ELFTools
39
41
  # return type of block given in {#initialize}.
40
42
  def [](i)
41
43
  # XXX: support negative index?
42
- return nil unless i.between?(0, @internal.size - 1)
44
+ return nil unless i.between?(0, __getobj__.size - 1)
43
45
 
44
- @internal[i] ||= @block.call(i)
46
+ __getobj__[i] ||= @block.call(i)
45
47
  end
46
48
  end
47
49
  end
@@ -11,9 +11,9 @@ module ELFTools
11
11
  # The base structure to define common methods.
12
12
  class ELFStruct < BinData::Record
13
13
  # DRY. Many fields have different type in different arch.
14
- CHOICE_SIZE_T = {
15
- selection: :elf_class, choices: { 32 => :uint32, 64 => :uint64 }
16
- }.freeze
14
+ CHOICE_SIZE_T = proc do |t = 'uint'|
15
+ { selection: :elf_class, choices: { 32 => :"#{t}32", 64 => :"#{t}64" }, copy_on_change: true }
16
+ end
17
17
 
18
18
  attr_accessor :elf_class # @return [Integer] 32 or 64.
19
19
  attr_accessor :offset # @return [Integer] The file offset of this header.
@@ -24,6 +24,9 @@ module ELFTools
24
24
  @patches ||= {}
25
25
  end
26
26
 
27
+ # BinData hash(Snapshot) that behaves like HashWithIndifferentAccess
28
+ alias to_h snapshot
29
+
27
30
  class << self
28
31
  # Hooks the constructor.
29
32
  #
@@ -51,7 +54,7 @@ module ELFTools
51
54
  # Gets the endianness of current class.
52
55
  # @return [:little, :big] The endianness.
53
56
  def self_endian
54
- bindata_name[-2..-1] == 'be' ? :big : :little
57
+ bindata_name[-2..] == 'be' ? :big : :little
55
58
  end
56
59
 
57
60
  # Packs an integer to string.
@@ -89,9 +92,9 @@ module ELFTools
89
92
  uint16 :e_machine
90
93
  uint32 :e_version
91
94
  # entry point
92
- choice :e_entry, **CHOICE_SIZE_T
93
- choice :e_phoff, **CHOICE_SIZE_T
94
- choice :e_shoff, **CHOICE_SIZE_T
95
+ choice :e_entry, **CHOICE_SIZE_T['uint']
96
+ choice :e_phoff, **CHOICE_SIZE_T['uint']
97
+ choice :e_shoff, **CHOICE_SIZE_T['uint']
95
98
  uint32 :e_flags
96
99
  uint16 :e_ehsize # size of this header
97
100
  uint16 :e_phentsize # size of each segment
@@ -106,14 +109,14 @@ module ELFTools
106
109
  endian :big_and_little
107
110
  uint32 :sh_name
108
111
  uint32 :sh_type
109
- choice :sh_flags, **CHOICE_SIZE_T
110
- choice :sh_addr, **CHOICE_SIZE_T
111
- choice :sh_offset, **CHOICE_SIZE_T
112
- choice :sh_size, **CHOICE_SIZE_T
112
+ choice :sh_flags, **CHOICE_SIZE_T['uint']
113
+ choice :sh_addr, **CHOICE_SIZE_T['uint']
114
+ choice :sh_offset, **CHOICE_SIZE_T['uint']
115
+ choice :sh_size, **CHOICE_SIZE_T['uint']
113
116
  uint32 :sh_link
114
117
  uint32 :sh_info
115
- choice :sh_addralign, **CHOICE_SIZE_T
116
- choice :sh_entsize, **CHOICE_SIZE_T
118
+ choice :sh_addralign, **CHOICE_SIZE_T['uint']
119
+ choice :sh_entsize, **CHOICE_SIZE_T['uint']
117
120
  end
118
121
 
119
122
  # Program header structure for 32-bit.
@@ -187,25 +190,30 @@ module ELFTools
187
190
  # Dynamic tag header.
188
191
  class ELF_Dyn < ELFStruct
189
192
  endian :big_and_little
190
- choice :d_tag, selection: :elf_class, choices: { 32 => :int32, 64 => :int64 }
193
+ choice :d_tag, **CHOICE_SIZE_T['int']
191
194
  # This is an union type named +d_un+ in original source,
192
195
  # simplify it to be +d_val+ here.
193
- choice :d_val, **CHOICE_SIZE_T
196
+ choice :d_val, **CHOICE_SIZE_T['uint']
194
197
  end
195
198
 
196
199
  # Rel header in .rel section.
197
200
  class ELF_Rel < ELFStruct
198
201
  endian :big_and_little
199
- choice :r_offset, **CHOICE_SIZE_T
200
- choice :r_info, **CHOICE_SIZE_T
202
+ choice :r_offset, **CHOICE_SIZE_T['uint']
203
+ choice :r_info, **CHOICE_SIZE_T['uint']
204
+
205
+ # Compatibility with ELF_Rela, both can be used interchangeably
206
+ def r_addend
207
+ nil
208
+ end
201
209
  end
202
210
 
203
211
  # Rela header in .rela section.
204
212
  class ELF_Rela < ELFStruct
205
213
  endian :big_and_little
206
- choice :r_offset, **CHOICE_SIZE_T
207
- choice :r_info, **CHOICE_SIZE_T
208
- choice :r_addend, selection: :elf_class, choices: { 32 => :int32, 64 => :int64 }
214
+ choice :r_offset, **CHOICE_SIZE_T['uint']
215
+ choice :r_info, **CHOICE_SIZE_T['uint']
216
+ choice :r_addend, **CHOICE_SIZE_T['int']
209
217
  end
210
218
  end
211
219
  end
data/lib/elftools/util.rb CHANGED
@@ -44,7 +44,7 @@ module ELFTools
44
44
  end
45
45
  val = val.to_s.upcase
46
46
  prefix = module_name.split('::')[-1]
47
- val = prefix + '_' + val unless val.start_with?(prefix)
47
+ val = "#{prefix}_#{val}" unless val.start_with?(prefix)
48
48
  val = val.to_sym
49
49
  raise ArgumentError, "No constants in #{module_name} named \"#{val}\"" unless mod.const_defined?(val)
50
50
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ELFTools
4
4
  # Current gem version
5
- VERSION = '1.1.2'
5
+ VERSION = '1.2.0'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elftools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - david942j
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-03 00:00:00.000000000 Z
11
+ date: 2022-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: os
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: pry
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +86,28 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0.59'
89
+ version: '1'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0.59'
96
+ version: '1'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0.17'
103
+ version: '0.21'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0.17'
110
+ version: '0.21'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: yard
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -145,7 +159,8 @@ files:
145
159
  homepage: https://github.com/david942j/rbelftools
146
160
  licenses:
147
161
  - MIT
148
- metadata: {}
162
+ metadata:
163
+ rubygems_mfa_required: 'true'
149
164
  post_install_message:
150
165
  rdoc_options: []
151
166
  require_paths:
@@ -154,14 +169,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
169
  requirements:
155
170
  - - ">="
156
171
  - !ruby/object:Gem::Version
157
- version: '2.3'
172
+ version: '2.6'
158
173
  required_rubygems_version: !ruby/object:Gem::Requirement
159
174
  requirements:
160
175
  - - ">="
161
176
  - !ruby/object:Gem::Version
162
177
  version: '0'
163
178
  requirements: []
164
- rubygems_version: 3.0.3
179
+ rubygems_version: 3.1.6
165
180
  signing_key:
166
181
  specification_version: 4
167
182
  summary: ELFTools - Pure ruby library for parsing and patching ELF files