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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 64cae3b6070bf26b6716a82886fcb183f20213bf0c396501141e93c1e7951ffa
4
- data.tar.gz: 49793e2b2bf154c0d4ff70f1533130495a0161db418248fc39105997159c59c8
3
+ metadata.gz: 72b60be48f5040899d73767baf55e3e4338578e3301c91116a9769a396f28788
4
+ data.tar.gz: 454399ea53bcbd52931102451dfaac13da564ded12675829e92b80eff77668f2
5
5
  SHA512:
6
- metadata.gz: d6b6dc9f7caa90f2abe18013a778e4ede2206f848e377e3cfce635b83ffc75b4dbc66c9b318899040bffa9553e8f0820cab95f92af445adc783efbbe47e0395f
7
- data.tar.gz: b9566cc7487e8225e07f5ea7a29698e1d280969fde9f93ef0c0b1cd08d11595e92243883ed6123ef3918c1776003939c16a49d89aed6fc5da7a685e92a4a6a5a
6
+ metadata.gz: d8741f0b203ce8592936f3305305214fff490f64caa145dda380e3d65cbc95809868871c137ef68a674956438a3ea7eac8640b68707ad7146d98f5c90170fedb
7
+ data.tar.gz: b903bcccd2d07f03470c3915616f26b0d98027c5ffe79c63578b2aa1feb25123a990ea9617f4cc6b4d8796d3caf7832fe2aa6b5e8d52d91e89d9a4700a24497d
@@ -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::EM_SPARC,
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
- idx = find_gap(check_sz: false) { |prv, nxt| PatchELF::Helper.aligndown(nxt.mem_head) - prv.mem_tail }
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 = PatchELF::Helper.alignup(@request_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
- # We have to change align of LOAD segment since ld.so checks it.
164
- seg.header.p_align = Helper.page_size if seg.is_a?(ELFTools::Segments::LoadSegment)
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
@@ -2,5 +2,5 @@
2
2
 
3
3
  module PatchELF
4
4
  # Current gem version.
5
- VERSION = '1.6.2'
5
+ VERSION = '1.6.3'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: patchelf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - david942j