os::init_system_properties_values()
-
//Linux版(jdk7/hotspot/src/os/linux/vm/os_linux.cpp) void os::init_system_properties_values() { // char arch[12]; // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); // The next steps are taken in the product version: // // Obtain the JAVA_HOME value from the location of libjvm[_g].so. // This library should be located at: // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm[_g].so. // // If "/jre/lib/" appears at the right place in the path, then we // assume libjvm[_g].so is installed in a JDK and we use this path. // // Otherwise exit with message: "Could not create the Java virtual machine." // // The following extra steps are taken in the debugging version: // // If "/jre/lib/" does NOT appear at the right place in the path // instead of exit check for $JAVA_HOME environment variable. // // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>, // then we append a fake suffix "hotspot/libjvm[_g].so" to this path so // it looks like libjvm[_g].so is installed there // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm[_g].so. // // Otherwise exit. // // Important note: if the location of libjvm.so changes this // code needs to be changed accordingly. // The next few definitions allow the code to be verbatim: #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n)) #define getenv(n) ::getenv(n) /* * See ld(1): * The linker uses the following search paths to locate required * shared libraries: * 1: ... * ... * 7: The default directories, normally /lib and /usr/lib. */ #if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" #else #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" #define REG_DIR "/usr/java/packages" { /* sysclasspath, java_home, dll_dir */ { char *home_path; char *dll_path; char *pslash; char buf[MAXPATHLEN]; os::jvm_path(buf, sizeof(buf)); // Found the full path to libjvm.so. // Now cut the path to <java_home>/jre if we can. *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ pslash = strrchr(buf, '/'); if (pslash != NULL) *pslash = '\0'; /* get rid of /{client|server|hotspot} */ dll_path = malloc(strlen(buf) + 1); if (dll_path == NULL) return; strcpy(dll_path, buf); Arguments::set_dll_dir(dll_path); if (pslash != NULL) { pslash = strrchr(buf, '/'); if (pslash != NULL) { *pslash = '\0'; /* get rid of /<arch> */ pslash = strrchr(buf, '/'); if (pslash != NULL) *pslash = '\0'; /* get rid of /lib */ } } home_path = malloc(strlen(buf) + 1); if (home_path == NULL) return; strcpy(home_path, buf); Arguments::set_java_home(home_path); if (!set_boot_path('/', ':')) return; } /* * Where to look for native libraries * * Note: Due to a legacy implementation, most of the library path * is set in the launcher. This was to accomodate linking restrictions * on legacy Linux implementations (which are no longer supported). * Eventually, all the library path setting will be done here. * * However, to prevent the proliferation of improperly built native * libraries, the new path component /usr/java/packages is added here. * Eventually, all the library path setting will be done here. */ { char *ld_library_path; /* * Construct the invariant part of ld_library_path. Note that the * space for the colon and the trailing null are provided by the * nulls included by the sizeof operator (so actually we allocate * a byte more than necessary). */ ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); /* * Get the user setting of LD_LIBRARY_PATH, and prepended it. It * should always exist (until the legacy problem cited above is * addressed). */ char *v = getenv("LD_LIBRARY_PATH"); if (v != NULL) { char *t = ld_library_path; /* That's +1 for the colon and +1 for the trailing '\0' */ ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); sprintf(ld_library_path, "%s:%s", v, t); } Arguments::set_library_path(ld_library_path); } /* * Extensions directories. * * Note that the space for the colon and the trailing null are provided * by the nulls included by the sizeof operator (so actually one byte more * than necessary is allocated). */ { char *buf = malloc(strlen(Arguments::get_java_home()) + sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR)); sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, Arguments::get_java_home()); Arguments::set_ext_dirs(buf); } /* Endorsed standards default directory. */ { char * buf; buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); Arguments::set_endorsed_dirs(buf); } } #undef malloc #undef getenv #undef EXTENSIONS_DIR #undef ENDORSED_DIR // Done return; }