static void ReadDependentCB(const char *aDependentLib) { void *libHandle = dlopen(aDependentLib, RTLD_GLOBAL | RTLD_LAZY); if (!libHandle) return; AppendDependentLib(libHandle); }
nsresult XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func) { char xpcomDir[MAXPATHLEN]; if (realpath(xpcomFile, xpcomDir)) { char *lastSlash = strrchr(xpcomDir, '/'); if (lastSlash) { *lastSlash = '\0'; XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB); snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "/" XUL_DLL); sXULLibHandle = dlopen(xpcomDir, RTLD_GLOBAL | RTLD_LAZY); #ifdef NS_TRACE_MALLOC _malloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "malloc"); _calloc = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "calloc"); _realloc = (__ptr_t(*)(__ptr_t, size_t)) dlsym(sXULLibHandle, "realloc"); _free = (void(*)(__ptr_t)) dlsym(sXULLibHandle, "free"); _memalign = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "memalign"); _valloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "valloc"); #endif } } // RTLD_DEFAULT is not defined in non-GNU toolchains, and it is // (void*) 0 in any case. void *libHandle = nsnull; if (xpcomFile[0] != '.' || xpcomFile[1] != '\0') { libHandle = dlopen(xpcomFile, RTLD_GLOBAL | RTLD_LAZY); if (libHandle) { AppendDependentLib(libHandle); } else { fprintf(stderr, "XPCOMGlueLoad error for file %s:\n%s\n", xpcomFile, dlerror()); } } GetFrozenFunctionsFunc sym = (GetFrozenFunctionsFunc) dlsym(libHandle, LEADING_UNDERSCORE "NS_GetFrozenFunctions"); if (!sym) { // No symbol found. XPCOMGlueUnload(); return NS_ERROR_NOT_AVAILABLE; } *func = sym; return NS_OK; }
static void ReadDependentCB(const char *aDependentLib, bool do_preload) { #if defined(LINUX) && !defined(ANDROID) if (do_preload) preload(aDependentLib); #endif void *libHandle = dlopen(aDependentLib, RTLD_GLOBAL | RTLD_LAZY); if (!libHandle) return; AppendDependentLib(libHandle); }
static void ReadDependentCB(const char *aDependentLib, PRBool do_preload) { CHAR pszError[_MAX_PATH]; ULONG ulrc = NO_ERROR; HMODULE h; ulrc = DosLoadModule(pszError, _MAX_PATH, aDependentLib, &h); if (ulrc != NO_ERROR) return; AppendDependentLib(h); }
static void ReadDependentCB(const char *aDependentLib) { wchar_t wideDependentLib[MAX_PATH]; MultiByteToWideChar(CP_UTF8, 0, aDependentLib, -1, wideDependentLib, MAX_PATH); HINSTANCE h = LoadLibraryExW(wideDependentLib, NULL, MOZ_LOADLIBRARY_FLAGS); if (!h) return; AppendDependentLib(h); }
nsresult XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func) { CHAR pszError[_MAX_PATH]; ULONG ulrc = NO_ERROR; HMODULE h; if (xpcomFile[0] == '.' && xpcomFile[1] == '\0') { xpcomFile = XPCOM_DLL; } else { char xpcomDir[MAXPATHLEN]; _fullpath(xpcomDir, xpcomFile, sizeof(xpcomDir)); char *lastSlash = ns_strrpbrk(xpcomDir, "/\\"); if (lastSlash) { *lastSlash = '\0'; XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB); snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "\\" XUL_DLL); DosLoadModule(pszError, _MAX_PATH, xpcomDir, &sXULLibrary); } } ulrc = DosLoadModule(pszError, _MAX_PATH, xpcomFile, &h); if (ulrc != NO_ERROR) return nsnull; AppendDependentLib(h); GetFrozenFunctionsFunc sym; ulrc = DosQueryProcAddr(h, 0, "_NS_GetFrozenFunctions", (PFN*)&sym); if (ulrc != NO_ERROR) { XPCOMGlueUnload(); return NS_ERROR_NOT_AVAILABLE; } *func = sym; return NS_OK; }
nsresult XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func) { char xpcomDir[MAXPATHLEN]; if (realpath(xpcomFile, xpcomDir)) { char *lastSlash = strrchr(xpcomDir, '/'); if (lastSlash) { *lastSlash = '\0'; XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB); snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "/" XUL_DLL); sXULLibHandle = dlopen(xpcomDir, RTLD_GLOBAL | RTLD_LAZY); } } // RTLD_DEFAULT is not defined in non-GNU toolchains, and it is // (void*) 0 in any case. void *libHandle = nsnull; if (xpcomFile[0] != '.' || xpcomFile[1] != '\0') { libHandle = dlopen(xpcomFile, RTLD_GLOBAL | RTLD_LAZY); if (libHandle) { AppendDependentLib(libHandle); } } GetFrozenFunctionsFunc sym = (GetFrozenFunctionsFunc) dlsym(libHandle, LEADING_UNDERSCORE "NS_GetFrozenFunctions"); if (!sym) { // No symbol found. XPCOMGlueUnload(); return NS_ERROR_NOT_AVAILABLE; } *func = sym; return NS_OK; }
nsresult XPCOMGlueLoad(const char *aXpcomFile, GetFrozenFunctionsFunc *func) { wchar_t xpcomFile[MAXPATHLEN]; MultiByteToWideChar(CP_UTF8, 0, aXpcomFile,-1, xpcomFile, MAXPATHLEN); if (xpcomFile[0] == '.' && xpcomFile[1] == '\0') { wcscpy(xpcomFile, LXPCOM_DLL); } else { wchar_t xpcomDir[MAXPATHLEN]; if (ns_isRelPath(xpcomFile)) { _wfullpath(xpcomDir, xpcomFile, sizeof(xpcomDir)/sizeof(wchar_t)); } else { wcscpy(xpcomDir, xpcomFile); } wchar_t *lastSlash = ns_wcspbrk(xpcomDir, L"/\\"); if (lastSlash) { *lastSlash = '\0'; char xpcomDir_narrow[MAXPATHLEN]; WideCharToMultiByte(CP_UTF8, 0, xpcomDir,-1, xpcomDir_narrow, MAX_PATH, NULL, NULL); XPCOMGlueLoadDependentLibs(xpcomDir_narrow, ReadDependentCB); _snwprintf(lastSlash, MAXPATHLEN - wcslen(xpcomDir), L"\\" LXUL_DLL); sXULLibrary = LoadLibraryExW(xpcomDir, NULL, MOZ_LOADLIBRARY_FLAGS); if (!sXULLibrary) { DWORD err = GetLastError(); #ifdef DEBUG LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wprintf(L"Error loading %s: %s\n", xpcomDir, lpMsgBuf); LocalFree(lpMsgBuf); #endif //DEBUG return (err == ERROR_NOT_ENOUGH_MEMORY || err == ERROR_OUTOFMEMORY) ? NS_ERROR_OUT_OF_MEMORY : NS_ERROR_FAILURE; } } } HINSTANCE h = LoadLibraryExW(xpcomFile, NULL, MOZ_LOADLIBRARY_FLAGS); if (!h) { DWORD err = GetLastError(); #ifdef DEBUG LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wprintf(L"Error loading %s: %s\n", xpcomFile, lpMsgBuf); LocalFree(lpMsgBuf); #endif return (err == ERROR_NOT_ENOUGH_MEMORY || err == ERROR_OUTOFMEMORY) ? NS_ERROR_OUT_OF_MEMORY : NS_ERROR_FAILURE; } AppendDependentLib(h); GetFrozenFunctionsFunc sym = (GetFrozenFunctionsFunc) GetProcAddress(h, "NS_GetFrozenFunctions"); if (!sym) { // No symbol found. XPCOMGlueUnload(); return NS_ERROR_NOT_AVAILABLE; } *func = sym; return NS_OK; }