linker: LoadSegments: Factor out ZeroFillSegment()
This is a preparatory patch for 16KiB app compat. No functional change
is introduced.
Bug: 339709616
Test: atest -c linker-unit-tests
Change-Id: If24c85b565c305e36bae97525087328aea7813b4
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index 06373ad..a842dfd 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -878,6 +878,25 @@
return true;
}
+void ElfReader::ZeroFillSegment(const ElfW(Phdr)* phdr) {
+ ElfW(Addr) seg_start = phdr->p_vaddr + load_bias_;
+ uint64_t unextended_seg_file_end = seg_start + phdr->p_filesz;
+
+ // If the segment is writable, and does not end on a page boundary,
+ // zero-fill it until the page limit.
+ //
+ // Do not attempt to zero the extended region past the first partial page,
+ // since doing so may:
+ // 1) Result in a SIGBUS, as the region is not backed by the underlying
+ // file.
+ // 2) Break the COW backing, faulting in new anon pages for a region
+ // that will not be used.
+ if ((phdr->p_flags & PF_W) != 0 && page_offset(unextended_seg_file_end) > 0) {
+ memset(reinterpret_cast<void*>(unextended_seg_file_end), 0,
+ kPageSize - page_offset(unextended_seg_file_end));
+ }
+}
+
bool ElfReader::LoadSegments() {
size_t min_palign = phdr_table_get_minimum_alignment(phdr_table_, phdr_num_);
// Only enforce this on 16 KB systems. Apps may rely on undefined behavior
@@ -950,22 +969,9 @@
}
}
- // if the segment is writable, and does not end on a page boundary,
- // zero-fill it until the page limit.
- //
- // Do not attempt to zero the extended region past the first partial page,
- // since doing so may:
- // 1) Result in a SIGBUS, as the region is not backed by the underlying
- // file.
- // 2) Break the COW backing, faulting in new anon pages for a region
- // that will not be used.
+ ZeroFillSegment(phdr);
uint64_t unextended_seg_file_end = seg_start + phdr->p_filesz;
- if ((phdr->p_flags & PF_W) != 0 && page_offset(unextended_seg_file_end) > 0) {
- memset(reinterpret_cast<void*>(unextended_seg_file_end), 0,
- kPageSize - page_offset(unextended_seg_file_end));
- }
-
// Pages may be brought in due to readahead.
// Drop the padding (zero) pages, to avoid reclaim work later.
//