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; }
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) { const mach_header* lib = nsnull; if (xpcomFile[0] != '.' || xpcomFile[1] != '\0') { char xpcomDir[PATH_MAX]; if (realpath(xpcomFile, xpcomDir)) { char *lastSlash = strrchr(xpcomDir, '/'); if (lastSlash) { *lastSlash = '\0'; XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB); snprintf(lastSlash, PATH_MAX - strlen(xpcomDir), "/" XUL_DLL); sXULLibImage = NSAddImage(xpcomDir, NSADDIMAGE_OPTION_RETURN_ON_ERROR | NSADDIMAGE_OPTION_WITH_SEARCHING | NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME); } } lib = NSAddImage(xpcomFile, NSADDIMAGE_OPTION_RETURN_ON_ERROR | NSADDIMAGE_OPTION_WITH_SEARCHING | NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME); if (!lib) { NSLinkEditErrors linkEditError; int errorNum; const char *errorString; const char *fileName; NSLinkEditError(&linkEditError, &errorNum, &fileName, &errorString); fprintf(stderr, "XPCOMGlueLoad error %d:%d for file %s:\n%s\n", linkEditError, errorNum, fileName, errorString); } } *func = (GetFrozenFunctionsFunc) LookupSymbol(lib, "_NS_GetFrozenFunctions"); return *func ? NS_OK : NS_ERROR_NOT_AVAILABLE; }
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; }