patchelf 1.6.2 → 1.6.3
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/patchelf/helper.rb +7 -1
- data/lib/patchelf/mm.rb +19 -4
- data/lib/patchelf/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 72b60be48f5040899d73767baf55e3e4338578e3301c91116a9769a396f28788
|
|
4
|
+
data.tar.gz: 454399ea53bcbd52931102451dfaac13da564ded12675829e92b80eff77668f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d8741f0b203ce8592936f3305305214fff490f64caa145dda380e3d65cbc95809868871c137ef68a674956438a3ea7eac8640b68707ad7146d98f5c90170fedb
|
|
7
|
+
data.tar.gz: b903bcccd2d07f03470c3915616f26b0d98027c5ffe79c63578b2aa1feb25123a990ea9617f4cc6b4d8796d3caf7832fe2aa6b5e8d52d91e89d9a4700a24497d
|
data/lib/patchelf/helper.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'elftools/constants'
|
|
4
|
+
|
|
3
5
|
module PatchELF
|
|
4
6
|
# Helper methods for internal usage.
|
|
5
7
|
module Helper
|
|
@@ -17,7 +19,8 @@ module PatchELF
|
|
|
17
19
|
def page_size(e_machine = nil)
|
|
18
20
|
# Different architectures have different minimum section alignments.
|
|
19
21
|
case e_machine
|
|
20
|
-
when ELFTools::Constants::
|
|
22
|
+
when ELFTools::Constants::EM_ALPHA,
|
|
23
|
+
ELFTools::Constants::EM_IA_64,
|
|
21
24
|
ELFTools::Constants::EM_MIPS,
|
|
22
25
|
ELFTools::Constants::EM_PPC,
|
|
23
26
|
ELFTools::Constants::EM_PPC64,
|
|
@@ -25,6 +28,9 @@ module PatchELF
|
|
|
25
28
|
ELFTools::Constants::EM_TILEGX,
|
|
26
29
|
ELFTools::Constants::EM_LOONGARCH
|
|
27
30
|
0x10000
|
|
31
|
+
when ELFTools::Constants::EM_SPARC,
|
|
32
|
+
ELFTools::Constants::EM_SPARCV9
|
|
33
|
+
0x2000
|
|
28
34
|
else
|
|
29
35
|
0x1000
|
|
30
36
|
end
|
data/lib/patchelf/mm.rb
CHANGED
|
@@ -105,12 +105,19 @@ module PatchELF
|
|
|
105
105
|
#=>
|
|
106
106
|
# | 1 | | 2 |
|
|
107
107
|
# | 1 | | 2 |
|
|
108
|
-
|
|
108
|
+
extension = PatchELF::Helper.alignup(@request_size, page_size)
|
|
109
|
+
idx = find_gap(check_sz: false) do |prv, nxt|
|
|
110
|
+
gap = PatchELF::Helper.aligndown(nxt.mem_head, page_size) - prv.mem_tail
|
|
111
|
+
# Forward growth moves the entire mapping back by the rounded extension.
|
|
112
|
+
next 0 if !writable?(prv) && gap < extension
|
|
113
|
+
|
|
114
|
+
gap
|
|
115
|
+
end
|
|
109
116
|
return false if idx.nil?
|
|
110
117
|
|
|
111
118
|
loads = load_segments
|
|
112
119
|
@threshold = loads[idx].file_head
|
|
113
|
-
@extend_size =
|
|
120
|
+
@extend_size = extension
|
|
114
121
|
shift_attributes
|
|
115
122
|
# prefer backward than forward
|
|
116
123
|
return extend_backward?(loads[idx - 1]) if writable?(loads[idx - 1])
|
|
@@ -160,8 +167,12 @@ module PatchELF
|
|
|
160
167
|
next unless seg.header.p_offset >= threshold
|
|
161
168
|
|
|
162
169
|
seg.header.p_offset += extend_size
|
|
163
|
-
#
|
|
164
|
-
|
|
170
|
+
# Preserve a valid alignment; ld.so requires LOAD addresses to be congruent.
|
|
171
|
+
next unless seg.is_a?(ELFTools::Segments::LoadSegment) &&
|
|
172
|
+
seg.header.p_align.nonzero? &&
|
|
173
|
+
((seg.header.p_vaddr - seg.header.p_offset) % seg.header.p_align).nonzero?
|
|
174
|
+
|
|
175
|
+
seg.header.p_align = page_size
|
|
165
176
|
end
|
|
166
177
|
|
|
167
178
|
@elf.header.e_shoff += extend_size if @elf.header.e_shoff >= threshold
|
|
@@ -179,6 +190,10 @@ module PatchELF
|
|
|
179
190
|
end
|
|
180
191
|
end
|
|
181
192
|
|
|
193
|
+
def page_size
|
|
194
|
+
Helper.page_size(@elf.header.e_machine)
|
|
195
|
+
end
|
|
196
|
+
|
|
182
197
|
def abnormal_elf(msg)
|
|
183
198
|
raise ArgumentError, msg
|
|
184
199
|
end
|
data/lib/patchelf/version.rb
CHANGED