xref: /dflybsd-src/contrib/gdb-7/gdb/gdb-dlfcn.c (revision a45ae5f869d9cfcb3e41dbab486e10bfa9e336bf)
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