Android PATH and ld path

xiaoxiao2021-02-28  65

Android PATH environment variable is set by init process.

system/core/init/init.cpp:

add_environment("PATH", _PATH_DEFPATH)

_PATH_DEFPATH is defined in bionic/libc/include/paths.h :

#define _PATH_DEFPATH "/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"

ld path is set by linker

bionic/linker/linker.cpp

static const char* const kDefaultLdPaths[] = { #if defined(__LP64__) "/system/lib64", "/vendor/lib64", "/system/vendor/lib64", #else "/system/lib", "/vendor/lib", "/system/vendor/lib", #endif nullptr }; static const char* const kAsanDefaultLdPaths[] = { #if defined(__LP64__) "/data/lib64", "/system/lib64", "/data/vendor/lib64", "/vendor/lib64", #else "/data/lib", "/system/lib", "/data/vendor/lib", "/vendor/lib", #endif nullptr }; static void init_default_namespace() { g_default_namespace.set_name("(default)"); g_default_namespace.set_isolated(false); const char *interp = phdr_table_get_interpreter_name(somain->phdr, somain->phnum, somain->load_bias); const char* bname = basename(interp); if (bname && (strcmp(bname, "linker_asan") == 0 || strcmp(bname, "linker_asan64") == 0)) { g_default_ld_paths = kAsanDefaultLdPaths; } else { g_default_ld_paths = kDefaultLdPaths; } std::vector<std::string> ld_default_paths; for (size_t i = 0; g_default_ld_paths[i] != nullptr; ++i) { ld_default_paths.push_back(g_default_ld_paths[i]); } g_default_namespace.set_default_library_paths(std::move(ld_default_paths)); };

It’s no need to set LD_LIBRARY_PATH. If execute a 64-bit application program by setting LD_LIBRARY_PATH=/system/lib:/system/lib64, this program will find needed so from /system/lib firstly. Since so is 32-bit in /system/lib, this program cannot execute normally.

转载请注明原文地址: https://www.6miu.com/read-52054.html

最新回复(0)