1/* Platform independent shared object routines for GDB. 2 3 Copyright (C) 2011-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20#include "common-defs.h" 21#include "gdb-dlfcn.h" 22 23#ifdef HAVE_DLFCN_H 24#include <dlfcn.h> 25#elif __MINGW32__ 26#include <windows.h> 27#else 28/* Unsupported configuration. */ 29#define NO_SHARED_LIB 30#endif 31 32#ifdef NO_SHARED_LIB 33 34gdb_dlhandle_up 35gdb_dlopen (const char *filename) 36{ 37 gdb_assert_not_reached ("gdb_dlopen should not be called on this platform."); 38} 39 40void * 41gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol) 42{ 43 gdb_assert_not_reached ("gdb_dlsym should not be called on this platform."); 44} 45 46void 47dlclose_deleter::operator() (void *handle) const 48{ 49 gdb_assert_not_reached ("gdb_dlclose should not be called on this platform."); 50} 51 52int 53is_dl_available (void) 54{ 55 return 0; 56} 57 58#else /* NO_SHARED_LIB */ 59 60gdb_dlhandle_up 61gdb_dlopen (const char *filename) 62{ 63 void *result; 64#ifdef HAVE_DLFCN_H 65 result = dlopen (filename, RTLD_NOW); 66#elif __MINGW32__ 67 result = (void *) LoadLibrary (filename); 68#endif 69 if (result != NULL) 70 return gdb_dlhandle_up (result); 71 72#ifdef HAVE_DLFCN_H 73 error (_("Could not load %s: %s"), filename, dlerror()); 74#else 75 { 76 LPVOID buffer; 77 DWORD dw; 78 79 dw = GetLastError(); 80 81 FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 82 FORMAT_MESSAGE_IGNORE_INSERTS, 83 NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 84 (LPTSTR) &buffer, 85 0, NULL); 86 87 error (_("Could not load %s: %s"), filename, (char *) buffer); 88 } 89#endif 90} 91 92void * 93gdb_dlsym (const gdb_dlhandle_up &handle, const char *symbol) 94{ 95#ifdef HAVE_DLFCN_H 96 return dlsym (handle.get (), symbol); 97#elif __MINGW32__ 98 return (void *) GetProcAddress ((HMODULE) handle.get (), symbol); 99#endif 100} 101 102void 103dlclose_deleter::operator() (void *handle) const 104{ 105#ifdef HAVE_DLFCN_H 106 dlclose (handle); 107#elif __MINGW32__ 108 FreeLibrary ((HMODULE) handle); 109#endif 110} 111 112int 113is_dl_available (void) 114{ 115 return 1; 116} 117 118#endif /* NO_SHARED_LIB */ 119