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