1fac669cf3
- Find libraries in LD_LIBRARY_PATH if relative path is found in debug link_map - Skip main executable - Skip /system/bin/linker and [vdso] - Only set proc->e_machine once, as it might be set wrongly if we later try to load library that we couldn't find
60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
diff --git a/sysdeps/linux-gnu/proc.c b/sysdeps/linux-gnu/proc.c
|
|
index 953fd86..bdb96cb 100644
|
|
--- a/sysdeps/linux-gnu/proc.c
|
|
+++ b/sysdeps/linux-gnu/proc.c
|
|
@@ -524,9 +524,53 @@ crawl_linkmap(struct process *proc, struct lt_r_debug_64 *dbg)
|
|
|| strcmp(lib_name, "linux-vdso.so.1") == 0
|
|
|| strcmp(lib_name, "linux-gate.so.1") == 0
|
|
|| strcmp(lib_name, "linux-vdso32.so.1") == 0
|
|
- || strcmp(lib_name, "linux-vdso64.so.1") == 0)
|
|
+ || strcmp(lib_name, "linux-vdso64.so.1") == 0
|
|
+ || strcmp(lib_name, "[vdso]") == 0
|
|
+ /* Android linker includes itself in list of libraries
|
|
+ * on GNU linker it appears as empty string */
|
|
+ || strcmp(lib_name, "/system/bin/linker") == 0
|
|
+ || strcmp(lib_name, "/system/bin/linker64") == 0)
|
|
continue;
|
|
|
|
+ /* On Android main executable is included in library list
|
|
+ * On GNU it appears as empty string */
|
|
+ if (rlm.l_prev == 0 && strstr(lib_name, ".so") == NULL) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ /* Android < 6 provides just library name without full path,
|
|
+ * will find full path ourselves */
|
|
+ if (lib_name[0] != '/') {
|
|
+ char local_path[1024];
|
|
+ /* Include path from LD_LIBRARY_PATH */
|
|
+ const char *path = getenv("LD_LIBRARY_PATH");
|
|
+ if (path) {
|
|
+ strlcpy(local_path, path, sizeof(local_path));
|
|
+ } else {
|
|
+ local_path[0] = '\0';
|
|
+ }
|
|
+ /* Include default path (hardcoded in /system/bin/linker) */
|
|
+ strlcat(
|
|
+ local_path,
|
|
+ select_32_64(proc, ":/vendor/lib:/system/lib", ":/vendor/lib64:/system/lib64"),
|
|
+ sizeof(local_path)
|
|
+ );
|
|
+
|
|
+ char *local_path_ptr = local_path;
|
|
+ const char *tested_path;
|
|
+ char full_lib_name[BUFSIZ];
|
|
+ while ((tested_path = strsep(&local_path_ptr, ":"))) {
|
|
+ if (tested_path[0] == '\0') {
|
|
+ continue;
|
|
+ }
|
|
+ snprintf(full_lib_name, sizeof(full_lib_name), "%s/%s", tested_path, lib_name);
|
|
+ if (access(full_lib_name, F_OK) == 0) {
|
|
+ strlcpy(lib_name, full_lib_name, sizeof(lib_name));
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
/* Do we have that library already? */
|
|
if (proc_each_library(proc, NULL, library_with_key_cb, &key))
|
|
continue;
|