Add `r--p` fallback pattern lookup of libart.so base for Android 10 (#497)

- When the Step 2 (r-xp) mode is not found, implement the lookup logic to fall back to the first r--p segment
- On android 10 Step 1 to Step 2 doesn't match any pattern, but r--p does have a libart.so address

- Log
findModuleBase(): Found 4 filtered map entries for libart.so:
findModuleBase():   0x70991e8000 r--p /apex/com.android.runtime/lib64/libart.so
findModuleBase():   0x7099327000 --xp /apex/com.android.runtime/lib64/libart.so
findModuleBase():   0x70997de000 rw-p /apex/com.android.runtime/lib64/libart.so
findModuleBase():   0x70997e1000 r--p /apex/com.android.runtime/lib64/libart.so
findModuleBase(): `r--p` -> `r-xp` pattern not found. Falling back to first `r-xp` entry.
findModuleBase(): `r-xp` pattern not found. Falling back to first `r--p` entry.
findModuleBase(): Found first `r--p` block at 0x70991e8000
findModuleBase(): get module base /apex/com.android.runtime/lib64/libart.so: 0x70991e8000
findModuleBase(): update path: /apex/com.android.runtime/lib64/libart.so
This commit is contained in:
dev 2026-01-19 06:56:46 +08:00 committed by GitHub
parent b6fb2f7855
commit 402d3984d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 12 additions and 0 deletions

View File

@ -454,6 +454,18 @@ bool ElfImg::findModuleBase() {
}
}
// Step 3 (Fallback): If the pattern was not found, find the first `r--p` entry.
if (!found_block) {
LOGD("`r-xp` pattern not found. Falling back to first `r--p` entry.");
for (const auto &entry : filtered_list) {
if (strcmp(entry.perms, "r--p") == 0) {
found_block = &entry;
LOGD("Found first `r--p` block at {:#x}", found_block->start_addr);
break; // Fallback found, exit loop.
}
}
}
if (!found_block) {
LOGE("Fatal: Could not determine a base address for {}", elf.data());
return false;