elftools 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/elftools/dynamic.rb +12 -0
- data/lib/elftools/elf_file.rb +3 -6
- data/lib/elftools/segments/load_segment.rb +89 -0
- data/lib/elftools/segments/segments.rb +2 -0
- data/lib/elftools/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37252d63c99fd7133d5abc0fc0e8c8685d3197840eaad1ddee1ba83b36e5dee7
|
4
|
+
data.tar.gz: 7c092256e8b730ba2e58d8dc6f5000024cf88ee8229f71727c5194a358d07bf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03ca86ad044a3ed27c1b635f1ad4170a5906f8f3b41b5162934b16784475a3ce3b731b9734665b72803cb293f6eeb8e90cfc703a5b77adebc0b625842d7b3a95
|
7
|
+
data.tar.gz: 44a0470006720e81dfc7096b9cbb076120100db888603cd7107091372b3277d2a0f806089812505d86a0f58f44148e477906289cc49689d21d0ec57950ffee1e
|
data/lib/elftools/dynamic.rb
CHANGED
@@ -64,6 +64,18 @@ module ELFTools
|
|
64
64
|
each_tags.find { |tag| tag.header.d_tag == type }
|
65
65
|
end
|
66
66
|
|
67
|
+
# Get tags of specific type.
|
68
|
+
# @param [Integer, Symbol, String] type
|
69
|
+
# Constant value, symbol, or string of type
|
70
|
+
# is acceptable. See examples for more information.
|
71
|
+
# @return [Array<ELFTools::Dynamic::Tag>] The desired tags.
|
72
|
+
#
|
73
|
+
# @see #tag_by_type
|
74
|
+
def tags_by_type(type)
|
75
|
+
type = Util.to_constant(Constants::DT, type)
|
76
|
+
each_tags.select { |tag| tag.header.d_tag == type }
|
77
|
+
end
|
78
|
+
|
67
79
|
# Get the +n+-th tag.
|
68
80
|
#
|
69
81
|
# Tags are lazy loaded.
|
data/lib/elftools/elf_file.rb
CHANGED
@@ -282,18 +282,15 @@ module ELFTools
|
|
282
282
|
#
|
283
283
|
# This method should work no matter ELF is a PIE or not.
|
284
284
|
# This method refers from (actually equals to) binutils/readelf.c#offset_from_vma.
|
285
|
-
# @param [Integer] vma The address
|
286
|
-
# @return [Integer]
|
285
|
+
# @param [Integer] vma The virtual address to be queried.
|
286
|
+
# @return [Integer] Related file offset.
|
287
287
|
# @example
|
288
288
|
# elf = ELFTools::ELFFile.new(File.open('/bin/cat'))
|
289
289
|
# elf.offset_from_vma(0x401337)
|
290
290
|
# #=> 4919 # 0x1337
|
291
291
|
def offset_from_vma(vma, size = 0)
|
292
292
|
segments_by_type(:load) do |seg|
|
293
|
-
|
294
|
-
vma + size <= seg.header.p_vaddr + seg.header.p_filesz
|
295
|
-
return vma - seg.header.p_vaddr + seg.header.p_offset
|
296
|
-
end
|
293
|
+
return seg.vma_to_offset(vma) if seg.vma_in?(vma, size)
|
297
294
|
end
|
298
295
|
end
|
299
296
|
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'elftools/segments/segment'
|
2
|
+
|
3
|
+
module ELFTools
|
4
|
+
module Segments
|
5
|
+
# For DT_LOAD segment.
|
6
|
+
# Able to query between file offset and virtual memory address.
|
7
|
+
class LoadSegment < Segment
|
8
|
+
# Returns the start of this segment.
|
9
|
+
# @return [Integer]
|
10
|
+
# The file offset.
|
11
|
+
def file_head
|
12
|
+
header.p_offset.to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns size in file.
|
16
|
+
# @return [Integer]
|
17
|
+
# The size.
|
18
|
+
def size
|
19
|
+
header.p_filesz.to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the end of this segment.
|
23
|
+
# @return [Integer]
|
24
|
+
# The file offset.
|
25
|
+
def file_tail
|
26
|
+
file_head + size
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the start virtual address of this segment.
|
30
|
+
# @return [Integer]
|
31
|
+
# The vma.
|
32
|
+
def mem_head
|
33
|
+
header.p_vaddr.to_i
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns size in memory.
|
37
|
+
# @return [Integer]
|
38
|
+
# The size.
|
39
|
+
def mem_size
|
40
|
+
header.p_memsz.to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the end virtual address of this segment.
|
44
|
+
# @return [Integer]
|
45
|
+
# The vma.
|
46
|
+
def mem_tail
|
47
|
+
mem_head + mem_size
|
48
|
+
end
|
49
|
+
|
50
|
+
# Query if the given file offset located in this segment.
|
51
|
+
# @param [Integer] offset
|
52
|
+
# File offset.
|
53
|
+
# @param [Integer] size
|
54
|
+
# Size.
|
55
|
+
# @return [Boolean]
|
56
|
+
def offset_in?(offset, size = 0)
|
57
|
+
file_head <= offset && offset + size < file_tail
|
58
|
+
end
|
59
|
+
|
60
|
+
# Convert file offset into virtual memory address.
|
61
|
+
# @param [Integer] offset
|
62
|
+
# File offset.
|
63
|
+
# @return [Integer]
|
64
|
+
def offset_to_vma(offset)
|
65
|
+
# XXX: What if file_head is not aligned with p_vaddr (which is invalid according to ELF spec)?
|
66
|
+
offset - file_head + header.p_vaddr
|
67
|
+
end
|
68
|
+
|
69
|
+
# Query if the given virtual memory address located in this segment.
|
70
|
+
# @param [Integer] vma
|
71
|
+
# Virtual memory address.
|
72
|
+
# @param [Integer] size
|
73
|
+
# Size.
|
74
|
+
# @return [Boolean]
|
75
|
+
def vma_in?(vma, size = 0)
|
76
|
+
vma >= (header.p_vaddr & -header.p_align) &&
|
77
|
+
vma + size <= mem_tail
|
78
|
+
end
|
79
|
+
|
80
|
+
# Convert virtual memory address into file offset.
|
81
|
+
# @param [Integer] vma
|
82
|
+
# Virtual memory address.
|
83
|
+
# @return [Integer]
|
84
|
+
def vma_to_offset(vma)
|
85
|
+
vma - header.p_vaddr + header.p_offset
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -4,6 +4,7 @@ require 'elftools/segments/segment'
|
|
4
4
|
|
5
5
|
require 'elftools/segments/dynamic_segment'
|
6
6
|
require 'elftools/segments/interp_segment'
|
7
|
+
require 'elftools/segments/load_segment'
|
7
8
|
require 'elftools/segments/note_segment'
|
8
9
|
|
9
10
|
module ELFTools
|
@@ -20,6 +21,7 @@ module ELFTools
|
|
20
21
|
klass = case header.p_type
|
21
22
|
when Constants::PT_DYNAMIC then DynamicSegment
|
22
23
|
when Constants::PT_INTERP then InterpSegment
|
24
|
+
when Constants::PT_LOAD then LoadSegment
|
23
25
|
when Constants::PT_NOTE then NoteSegment
|
24
26
|
else Segment
|
25
27
|
end
|
data/lib/elftools/version.rb
CHANGED
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.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- david942j
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- lib/elftools/sections/sym_tab_section.rb
|
136
136
|
- lib/elftools/segments/dynamic_segment.rb
|
137
137
|
- lib/elftools/segments/interp_segment.rb
|
138
|
+
- lib/elftools/segments/load_segment.rb
|
138
139
|
- lib/elftools/segments/note_segment.rb
|
139
140
|
- lib/elftools/segments/segment.rb
|
140
141
|
- lib/elftools/segments/segments.rb
|