Skip to content

Commit 4c22def

Browse files
committed
Fix segment-relative BSS mapping
Map the anonymous part of each PT_LOAD segment using the segment's load address instead of the initial reservation. This keeps .bss (including glibc 2.42's _dl_rtld_map) zeroed and located where ld.so expects.
1 parent a2bcfb1 commit 4c22def

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/elf.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ impl ElfHandle {
192192

193193
let prot = ph.prot_flags();
194194

195+
let seg_page_start = self.page_start(load_bias + vaddr);
195196
let total_map_size = self.page_align(vend) - self.page_start(vaddr);
196197
let file_map_size =
197198
self.page_align(core::cmp::min(fend, vend)) - self.page_start(vaddr);
@@ -204,18 +205,18 @@ impl ElfHandle {
204205
//
205206
// We do the following mmap for the file-backed portion:
206207
let mapping = unsafe {
207-
let addr = self.page_start(load_bias + vaddr);
208208
let offset = self.page_start(offset);
209209
let size = file_map_size;
210210

211211
log::trace!(
212-
"mmap [{ph}] [0x{addr:x}-0x{mend:x}] (vaddr=0x{vaddr:x}, offset=0x{offset:x})",
213-
mend = addr + size,
212+
"mmap [{ph}] [0x{start:x}-0x{end:x}] (vaddr=0x{vaddr:x}, offset=0x{offset:x})",
213+
start = seg_page_start,
214+
end = seg_page_start + size,
214215
ph = DisplayPFlags(ph),
215216
);
216217

217218
sys::mmap(
218-
addr as *mut c_void,
219+
seg_page_start as *mut c_void,
219220
size,
220221
prot,
221222
MAP_PRIVATE | MAP_FIXED,
@@ -243,16 +244,17 @@ impl ElfHandle {
243244

244245
if file_map_size < total_map_size {
245246
let mapping = unsafe {
246-
let addr = load_addr.add(file_map_size);
247+
let addr = seg_page_start + file_map_size;
247248
let size = total_map_size - file_map_size;
248249
log::trace!(
249-
"mmap [{ph}] [{addr:?}-0x{mend:x}] (vaddr=0x{vaddr:x}, anon)",
250-
mend = addr as usize + size,
250+
"mmap [{ph}] [0x{addr:x}-0x{mend:x}] (vaddr=0x{vaddr:x}, anon)",
251+
addr = addr,
252+
mend = addr + size,
251253
ph = DisplayPFlags(ph),
252254
);
253255

254256
sys::mmap(
255-
addr,
257+
addr as *mut c_void,
256258
size,
257259
prot,
258260
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,

0 commit comments

Comments
 (0)