Mercurial > hg > octave-nkf
annotate liboctave/oct-shlib.cc @ 10314:07ebe522dac2
untabify liboctave C++ sources
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 11 Feb 2010 12:23:32 -0500 |
parents | 4c0cdbe0acca |
children | 65d5776379c3 |
rev | line source |
---|---|
3326 | 1 /* |
2 | |
8920 | 3 Copyright (C) 1999, 2000, 2002, 2003, 2005, 2006, 2007, 2008 John W. Eaton |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
3326 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
3326 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
3326 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
28 #include <map> |
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
29 |
4110 | 30 #if defined (HAVE_SHL_LOAD_API) |
3326 | 31 #include <cerrno> |
32 #include <cstring> | |
33 #endif | |
34 | |
4162 | 35 #if defined (HAVE_DYLD_API) |
4429 | 36 #include <mach-o/dyld.h> |
4162 | 37 #endif |
38 | |
3326 | 39 extern "C" |
40 { | |
4110 | 41 #if defined (HAVE_DLOPEN_API) |
3326 | 42 #if defined (HAVE_DLFCN_H) |
43 #include <dlfcn.h> | |
44 #else | |
45 extern void *dlopen (const char *, int); | |
46 extern const char *dlerror (void); | |
47 extern void *dlsym (void *, const char *); | |
48 extern int dlclose (void *); | |
49 #endif | |
4110 | 50 #elif defined (HAVE_SHL_LOAD_API) |
3326 | 51 #include <dl.h> |
5451 | 52 #elif defined (HAVE_LOADLIBRARY_API) |
53 #include <windows.h> | |
6123 | 54 #undef min |
55 #undef max | |
3326 | 56 #endif |
57 } | |
58 | |
59 #include "file-stat.h" | |
60 #include "lo-error.h" | |
61 #include "oct-shlib.h" | |
62 #include "str-vec.h" | |
63 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
64 octave_shlib::shlib_rep::shlib_rep (const std::string& f) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
65 : count (1), file (f), tm_loaded () |
3326 | 66 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
67 instances[f] = this; |
3326 | 68 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
69 if (is_out_of_date ()) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
70 (*current_liboctave_warning_with_id_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
71 ("Octave:warn-future-time-stamp", |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
72 "timestamp on file %s is in the future", file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
73 } |
3326 | 74 |
75 bool | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
76 octave_shlib::shlib_rep::is_out_of_date (void) const |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
77 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
78 file_stat fs (file); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
79 return fs.is_newer (tm_loaded); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
80 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
81 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
82 void |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
83 octave_shlib::shlib_rep::fake_reload (void) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
84 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
85 // We can't actually reload the library, but we'll pretend we did. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
86 file_stat fs (file); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
87 if (fs.is_newer (tm_loaded)) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
88 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
89 tm_loaded = fs.mtime (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
90 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
91 (*current_liboctave_warning_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
92 ("library %s not reloaded due to existing references", file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
93 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
94 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
95 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
96 octave_shlib::shlib_rep * |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
97 octave_shlib::shlib_rep::get_instance (const std::string& f, bool fake) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
98 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
99 shlib_rep *retval = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
100 std::map<std::string, shlib_rep *>::iterator p = instances.find (f); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
101 if (p != instances.end ()) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
102 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
103 retval = p->second; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
104 retval->count++; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
105 if (fake) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
106 retval->fake_reload (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
107 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
108 else |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
109 retval = new_instance (f); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
110 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
111 return retval; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
112 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
113 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
114 void |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
115 octave_shlib::shlib_rep::add_fcn_name (const std::string& name) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
116 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
117 fcn_names_iterator p = fcn_names.find (name); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
118 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
119 if (p == fcn_names.end ()) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
120 fcn_names[name] = 1; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
121 else |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
122 ++(p->second); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
123 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
124 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
125 bool |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
126 octave_shlib::shlib_rep::remove_fcn_name (const std::string& fcn_name) |
3326 | 127 { |
128 bool retval = false; | |
129 | |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
130 fcn_names_iterator p = fcn_names.find (fcn_name); |
3326 | 131 |
7872 | 132 if (p != fcn_names.end () && --(p->second) == 0) |
3326 | 133 { |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
134 fcn_names.erase (fcn_name); |
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
135 retval = true; |
3326 | 136 } |
137 | |
138 return retval; | |
139 } | |
140 | |
141 void | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
142 octave_shlib::shlib_rep::do_close_hook (octave_shlib::close_hook cl_hook) |
3326 | 143 { |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
144 for (fcn_names_iterator p = fcn_names.begin (); p != fcn_names.end (); p++) |
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
145 cl_hook (p->first); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
146 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
147 fcn_names.clear (); |
3326 | 148 } |
149 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
150 std::map<std::string, octave_shlib::shlib_rep *> octave_shlib::shlib_rep::instances; |
3326 | 151 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
152 octave_shlib::shlib_rep octave_shlib::nil_rep; |
3326 | 153 |
4110 | 154 #if defined (HAVE_DLOPEN_API) |
3326 | 155 |
156 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
157 octave_dlopen_shlib : public octave_shlib::shlib_rep |
3326 | 158 { |
159 public: | |
160 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
161 octave_dlopen_shlib (const std::string& f); |
3326 | 162 |
163 ~octave_dlopen_shlib (void); | |
164 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
165 void *search (const std::string& name, octave_shlib::name_mangler mangler = 0); |
3326 | 166 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
167 // FIXME: this is possibly redundant because failure to open a library will |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
168 // normally throw an exception, avoiding the construction of an invalid |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
169 // library. Leave it here for possible future use. |
3326 | 170 |
171 bool is_open (void) const { return (library != 0); } | |
172 | |
173 private: | |
174 | |
175 // No copying! | |
176 | |
177 octave_dlopen_shlib (const octave_dlopen_shlib&); | |
178 | |
179 octave_dlopen_shlib& operator = (const octave_dlopen_shlib&); | |
180 | |
181 void *library; | |
182 }; | |
183 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
184 octave_dlopen_shlib::octave_dlopen_shlib (const std::string& f) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
185 : octave_shlib::shlib_rep (f), library (0) |
3326 | 186 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
187 int flags = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
188 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
189 // Use RTLD_NOW to resolve all symbols before dlopen returns. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
190 // By using this option, dlopen will detect errors and Octave |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
191 // won't exit if there are unresolved symbols in the file we are |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
192 // loading, and we may even get a useful diagnostic. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
193 #if defined (RTLD_NOW) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
194 flags |= RTLD_NOW; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
195 #endif |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
196 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
197 library = dlopen (file.c_str (), flags); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
198 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
199 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
200 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
201 const char *msg = dlerror (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
202 |
9971
d0680ace5fcb
oct-shlib.cc (octave_dlopen_shlib): reverse sense of test and improve error message
John W. Eaton <jwe@octave.org>
parents:
9958
diff
changeset
|
203 if (msg) |
d0680ace5fcb
oct-shlib.cc (octave_dlopen_shlib): reverse sense of test and improve error message
John W. Eaton <jwe@octave.org>
parents:
9958
diff
changeset
|
204 (*current_liboctave_error_handler) ("%s: failed to load: %s", |
d0680ace5fcb
oct-shlib.cc (octave_dlopen_shlib): reverse sense of test and improve error message
John W. Eaton <jwe@octave.org>
parents:
9958
diff
changeset
|
205 file.c_str (), msg); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
206 else |
9971
d0680ace5fcb
oct-shlib.cc (octave_dlopen_shlib): reverse sense of test and improve error message
John W. Eaton <jwe@octave.org>
parents:
9958
diff
changeset
|
207 (*current_liboctave_error_handler) ("%s: failed to load", |
d0680ace5fcb
oct-shlib.cc (octave_dlopen_shlib): reverse sense of test and improve error message
John W. Eaton <jwe@octave.org>
parents:
9958
diff
changeset
|
208 file.c_str ()); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
209 } |
3326 | 210 } |
211 | |
212 octave_dlopen_shlib::~octave_dlopen_shlib (void) | |
213 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
214 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
215 dlclose (library); |
3326 | 216 } |
217 | |
218 void * | |
3504 | 219 octave_dlopen_shlib::search (const std::string& name, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
220 octave_shlib::name_mangler mangler) |
3326 | 221 { |
222 void *function = 0; | |
223 | |
224 if (is_open ()) | |
225 { | |
3504 | 226 std::string sym_name = name; |
3326 | 227 |
228 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
229 sym_name = mangler (name); |
3326 | 230 |
231 function = dlsym (library, sym_name.c_str ()); | |
232 } | |
233 else | |
234 (*current_liboctave_error_handler) | |
235 ("shared library %s is not open", file.c_str ()); | |
236 | |
237 return function; | |
238 } | |
239 | |
4110 | 240 #elif defined (HAVE_SHL_LOAD_API) |
3326 | 241 |
242 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
243 octave_shl_load_shlib : public octave_shlib::shlib_rep |
3326 | 244 { |
245 public: | |
246 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
247 octave_shl_load_shlib (const std::string& f); |
3326 | 248 |
249 ~octave_shl_load_shlib (void); | |
250 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
251 void *search (const std::string& name, octave_shlib::name_mangler mangler = 0); |
3326 | 252 |
3609 | 253 bool is_open (void) const { return (library != 0); } |
3326 | 254 |
255 private: | |
256 | |
257 // No copying! | |
258 | |
259 octave_shl_load_shlib (const octave_shl_load_shlib&); | |
260 | |
261 octave_shl_load_shlib& operator = (const octave_shl_load_shlib&); | |
262 | |
263 shl_t library; | |
264 }; | |
265 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
266 octave_shl_load_shlib::octave_shl_load_shlib (const std::string& f) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
267 : octave_shlib::shlib_rep (f), library (0) |
3326 | 268 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
269 file = f; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
270 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
271 library = shl_load (file.c_str (), BIND_IMMEDIATE, 0L); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
272 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
273 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
274 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
275 using namespace std; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
276 (*current_liboctave_error_handler) ("%s", strerror (errno)); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
277 } |
3326 | 278 } |
279 | |
280 octave_shl_load_shlib::~octave_shl_load_shlib (void) | |
281 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
282 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
283 shl_unload (library); |
3326 | 284 } |
285 | |
286 void * | |
3504 | 287 octave_shl_load_shlib::search (const std::string& name, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
288 octave_shlib::name_mangler mangler) |
3326 | 289 { |
290 void *function = 0; | |
291 | |
292 if (is_open ()) | |
293 { | |
3609 | 294 std::string sym_name = name; |
3326 | 295 |
296 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
297 sym_name = mangler (name); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
298 |
3326 | 299 int status = shl_findsym (&library, sym_name.c_str (), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
300 TYPE_UNDEFINED, &function); |
3326 | 301 } |
302 else | |
303 (*current_liboctave_error_handler) | |
304 ("shared library %s is not open", file.c_str ()); | |
305 | |
306 return function; | |
307 } | |
308 | |
4110 | 309 #elif defined (HAVE_LOADLIBRARY_API) |
310 | |
311 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
312 octave_w32_shlib: public octave_shlib::shlib_rep |
4110 | 313 { |
314 public: | |
315 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
316 octave_w32_shlib (const std::string& f); |
4110 | 317 |
318 ~octave_w32_shlib (void); | |
319 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
320 void *search (const std::string& name, octave_shlib::name_mangler mangler = 0); |
4110 | 321 |
322 bool is_open (void) const { return (handle != 0); } | |
323 | |
324 private: | |
325 | |
326 // No copying! | |
327 | |
328 octave_w32_shlib (const octave_w32_shlib&); | |
329 | |
330 octave_w32_shlib& operator = (const octave_w32_shlib&); | |
331 | |
332 HINSTANCE handle; | |
333 }; | |
334 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
335 octave_w32_shlib::octave_w32_shlib (const std::string& f) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
336 : octave_shlib::shlib_rep (f), handle (0) |
4110 | 337 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
338 handle = LoadLibrary (file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
339 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
340 if (! handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
341 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
342 DWORD lastError = GetLastError (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
343 char *msg; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
344 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
345 switch (lastError) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
346 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
347 case ERROR_MOD_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
348 case ERROR_DLL_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
349 msg = "could not find library or dependents"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
350 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
351 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
352 case ERROR_INVALID_DLL: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
353 msg = "library or its dependents are damaged"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
354 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
355 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
356 case ERROR_DLL_INIT_FAILED: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
357 msg = "library initialization routine failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
358 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
359 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
360 default: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
361 msg = "library open failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
362 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
363 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
364 (*current_liboctave_error_handler) ("%s: %s", msg, file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
365 } |
4110 | 366 } |
367 | |
368 octave_w32_shlib::~octave_w32_shlib (void) | |
369 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
370 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
371 FreeLibrary (handle); |
4110 | 372 } |
373 | |
5451 | 374 extern "C" |
375 { | |
376 void * octave_w32_search (HINSTANCE handle, const char * name); | |
377 } | |
378 | |
4110 | 379 void * |
380 octave_w32_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
381 octave_shlib::name_mangler mangler) |
4110 | 382 { |
383 void *function = 0; | |
384 | |
385 if (is_open ()) | |
386 { | |
387 std::string sym_name = name; | |
388 | |
389 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
390 sym_name = mangler (name); |
4110 | 391 |
5451 | 392 function = octave_w32_library_search (handle, sym_name.c_str ()); |
4110 | 393 } |
394 else | |
395 (*current_liboctave_error_handler) | |
396 ("shared library %s is not open", file.c_str ()); | |
397 | |
398 return function; | |
399 } | |
400 | |
4162 | 401 #elif defined (HAVE_DYLD_API) |
402 | |
403 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
404 octave_dyld_shlib : public octave_shlib::shlib_rep |
4162 | 405 { |
406 public: | |
407 | |
408 octave_dyld_shlib (void); | |
409 | |
410 ~octave_dyld_shlib (void); | |
411 | |
5781 | 412 void open (const std::string& f); |
4162 | 413 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
414 void *search (const std::string& name, octave_shlib::name_mangler mangler = 0); |
4162 | 415 |
416 void close (octave_shlib::close_hook cl_hook = 0); | |
417 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
418 bool is_open (void) const {return (handle != 0); } |
4162 | 419 |
420 private: | |
421 | |
422 // No copying! | |
423 | |
424 octave_dyld_shlib (const octave_dyld_shlib&); | |
425 | |
426 octave_dyld_shlib& operator = (const octave_dyld_shlib&); | |
427 | |
428 NSObjectFileImage img; | |
429 NSModule handle; | |
430 }; | |
431 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
432 octave_dyld_shlib::octave_dyld_shlib (const std::string& f) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
433 : octave_shlib::shlib_rep (f), handle (0) |
4162 | 434 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
435 int returnCode = NSCreateObjectFileImageFromFile (file.c_str (), &img); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
436 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
437 if (NSObjectFileImageSuccess == returnCode) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
438 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
439 handle = NSLinkModule (img, file.c_str (), |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
440 (NSLINKMODULE_OPTION_RETURN_ON_ERROR |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
441 | NSLINKMODULE_OPTION_PRIVATE)); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
442 if (! handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
443 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
444 NSLinkEditErrors ler; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
445 int lerno; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
446 const char *file2; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
447 const char *errstr = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
448 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
449 NSLinkEditError (&ler, &lerno, &file2, &errstr); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
450 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
451 if (! errstr) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
452 errstr = "unspecified error"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
453 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
454 (*current_liboctave_error_handler) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
455 ("%s: %s", file.c_str (), errstr); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
456 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
457 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
458 else |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
459 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
460 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
461 ("got NSObjectFileImageReturnCode %d", returnCode); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
462 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
463 // FIXME -- should use NSLinkEditError () to get |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
464 // more info on what went wrong. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
465 } |
4162 | 466 } |
467 | |
468 octave_dyld_shlib::~octave_dyld_shlib (void) | |
469 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
470 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
471 NSUnLinkModule (handle, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); |
4162 | 472 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
473 NSDestroyObjectFileImage (img); |
4162 | 474 } |
475 | |
476 void * | |
477 octave_dyld_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
478 octave_shlib::name_mangler mangler) |
4162 | 479 { |
480 void *function = 0; | |
481 | |
482 if (is_open ()) | |
483 { | |
484 std::string sym_name = name; | |
485 | |
486 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
487 sym_name = mangler (name); |
4162 | 488 |
489 NSSymbol symbol = NSLookupSymbolInModule (handle, sym_name.c_str ()); | |
490 | |
491 if (symbol) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
492 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
493 function = NSAddressOfSymbol (symbol); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
494 } |
4162 | 495 } |
496 else | |
497 (*current_liboctave_error_handler) | |
498 ("bundle %s is not open", file.c_str ()); | |
499 | |
500 return function; | |
501 } | |
502 | |
3326 | 503 #endif |
504 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
505 octave_shlib::shlib_rep * |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
506 octave_shlib::shlib_rep::new_instance (const std::string& f) |
3326 | 507 { |
4110 | 508 #if defined (HAVE_DLOPEN_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
509 return new octave_dlopen_shlib (f); |
4110 | 510 #elif defined (HAVE_SHL_LOAD_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
511 return new octave_shl_load_shlib (f); |
4110 | 512 #elif defined (HAVE_LOADLIBRARY_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
513 return new octave_w32_shlib (f); |
4162 | 514 #elif defined (HAVE_DYLD_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
515 return new octave_dyld_shlib (f); |
3326 | 516 #else |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
517 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
518 ("no API for dynamic loading is available"); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
519 return new shlib_rep (); |
3326 | 520 #endif |
521 } |