Mercurial > octave
annotate liboctave/util/oct-shlib.cc @ 19410:95c533ed464b
use warning IDs for all warnings in liboctave
* CSparse.cc, MatrixType.cc, Sparse.cc, dSparse.cc, dbleQR.cc,
eigs-base.cc, lo-specfun.cc, cmd-hist.cc, data-conv.cc, kpse.cc,
lo-regexp.cc, oct-locbuf.cc, oct-shlib.cc, sparse-util.cc:
Use current_liboctave_warning_with_id_handler and provide warning IDs
for all warnings in liboctave code.
* unwinddemo.cc: Also preserve and restore warning_wit_id_handler.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 18 Dec 2014 10:50:09 -0500 |
parents | 49a5a4be04a1 |
children | 4197fc428c7d |
rev | line source |
---|---|
3326 | 1 /* |
2 | |
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
15751
diff
changeset
|
3 Copyright (C) 1999-2013 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) |
10346
65d5776379c3
Reduce the amount of stuff included by windows.h and avoid min/max being #define-d
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10314
diff
changeset
|
53 #define WIN32_LEAN_AND_MEAN |
5451 | 54 #include <windows.h> |
3326 | 55 #endif |
56 } | |
57 | |
58 #include "file-stat.h" | |
59 #include "lo-error.h" | |
60 #include "oct-shlib.h" | |
61 #include "str-vec.h" | |
62 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
63 octave_shlib::shlib_rep::shlib_rep (const std::string& f) |
11501
331fcc41ca23
data member initialization fixes
John W. Eaton <jwe@octave.org>
parents:
10346
diff
changeset
|
64 : count (1), file (f), tm_loaded (), fcn_names () |
3326 | 65 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
66 instances[f] = this; |
3326 | 67 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
68 if (is_out_of_date ()) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
69 (*current_liboctave_warning_with_id_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
70 ("Octave:warn-future-time-stamp", |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
71 "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
|
72 } |
3326 | 73 |
74 bool | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
75 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
|
76 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
77 file_stat fs (file); |
15751
72968fb32c82
Avoid future timestamp warning on non-existent shared libs
Mike Miller <mtmiller@ieee.org>
parents:
15451
diff
changeset
|
78 return (fs && fs.is_newer (tm_loaded)); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
79 } |
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 void |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
82 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
|
83 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
84 // 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
|
85 file_stat fs (file); |
15751
72968fb32c82
Avoid future timestamp warning on non-existent shared libs
Mike Miller <mtmiller@ieee.org>
parents:
15451
diff
changeset
|
86 if (fs && fs.is_newer (tm_loaded)) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
87 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
88 tm_loaded = fs.mtime (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
89 |
19410
95c533ed464b
use warning IDs for all warnings in liboctave
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
90 (*current_liboctave_warning_with_id_handler) |
95c533ed464b
use warning IDs for all warnings in liboctave
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
91 ("Octave:library-reload", |
95c533ed464b
use warning IDs for all warnings in liboctave
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
92 "library %s not reloaded due to existing references", file.c_str ()); |
9958
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 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
165 void *search (const std::string& name, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
166 octave_shlib::name_mangler mangler = 0); |
3326 | 167 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
168 // 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
|
169 // 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
|
170 // library. Leave it here for possible future use. |
3326 | 171 |
172 bool is_open (void) const { return (library != 0); } | |
173 | |
174 private: | |
175 | |
176 // No copying! | |
177 | |
178 octave_dlopen_shlib (const octave_dlopen_shlib&); | |
179 | |
180 octave_dlopen_shlib& operator = (const octave_dlopen_shlib&); | |
181 | |
182 void *library; | |
183 }; | |
184 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
185 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
|
186 : octave_shlib::shlib_rep (f), library (0) |
3326 | 187 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
188 int flags = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
189 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
190 // 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
|
191 // 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
|
192 // 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
|
193 // 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
|
194 #if defined (RTLD_NOW) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
195 flags |= RTLD_NOW; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
196 #endif |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
197 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
198 library = dlopen (file.c_str (), flags); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
199 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
200 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
201 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
202 const char *msg = dlerror (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
203 |
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
|
204 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
|
205 (*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
|
206 file.c_str (), msg); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
207 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
|
208 (*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
|
209 file.c_str ()); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
210 } |
3326 | 211 } |
212 | |
213 octave_dlopen_shlib::~octave_dlopen_shlib (void) | |
214 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
215 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
216 dlclose (library); |
3326 | 217 } |
218 | |
219 void * | |
3504 | 220 octave_dlopen_shlib::search (const std::string& name, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
221 octave_shlib::name_mangler mangler) |
3326 | 222 { |
223 void *function = 0; | |
224 | |
225 if (is_open ()) | |
226 { | |
3504 | 227 std::string sym_name = name; |
3326 | 228 |
229 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
230 sym_name = mangler (name); |
3326 | 231 |
232 function = dlsym (library, sym_name.c_str ()); | |
233 } | |
234 else | |
235 (*current_liboctave_error_handler) | |
236 ("shared library %s is not open", file.c_str ()); | |
237 | |
238 return function; | |
239 } | |
240 | |
4110 | 241 #elif defined (HAVE_SHL_LOAD_API) |
3326 | 242 |
243 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
244 octave_shl_load_shlib : public octave_shlib::shlib_rep |
3326 | 245 { |
246 public: | |
247 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
248 octave_shl_load_shlib (const std::string& f); |
3326 | 249 |
250 ~octave_shl_load_shlib (void); | |
251 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
252 void *search (const std::string& name, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
253 octave_shlib::name_mangler mangler = 0); |
3326 | 254 |
3609 | 255 bool is_open (void) const { return (library != 0); } |
3326 | 256 |
257 private: | |
258 | |
259 // No copying! | |
260 | |
261 octave_shl_load_shlib (const octave_shl_load_shlib&); | |
262 | |
263 octave_shl_load_shlib& operator = (const octave_shl_load_shlib&); | |
264 | |
265 shl_t library; | |
266 }; | |
267 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
268 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
|
269 : octave_shlib::shlib_rep (f), library (0) |
3326 | 270 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
271 file = f; |
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 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
|
274 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
275 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
276 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
277 using namespace std; |
15451
219479b461b8
build: Add missing tests and gnulib modules suggested by autoscan.
Rik <rik@octave.org>
parents:
15271
diff
changeset
|
278 (*current_liboctave_error_handler) ("%s", gnulib::strerror (errno)); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
279 } |
3326 | 280 } |
281 | |
282 octave_shl_load_shlib::~octave_shl_load_shlib (void) | |
283 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
284 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
285 shl_unload (library); |
3326 | 286 } |
287 | |
288 void * | |
3504 | 289 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
|
290 octave_shlib::name_mangler mangler) |
3326 | 291 { |
292 void *function = 0; | |
293 | |
294 if (is_open ()) | |
295 { | |
3609 | 296 std::string sym_name = name; |
3326 | 297 |
298 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
299 sym_name = mangler (name); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
300 |
3326 | 301 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
|
302 TYPE_UNDEFINED, &function); |
3326 | 303 } |
304 else | |
305 (*current_liboctave_error_handler) | |
306 ("shared library %s is not open", file.c_str ()); | |
307 | |
308 return function; | |
309 } | |
310 | |
4110 | 311 #elif defined (HAVE_LOADLIBRARY_API) |
312 | |
313 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
314 octave_w32_shlib: public octave_shlib::shlib_rep |
4110 | 315 { |
316 public: | |
317 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
318 octave_w32_shlib (const std::string& f); |
4110 | 319 |
320 ~octave_w32_shlib (void); | |
321 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
322 void *search (const std::string& name, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
323 octave_shlib::name_mangler mangler = 0); |
4110 | 324 |
325 bool is_open (void) const { return (handle != 0); } | |
326 | |
327 private: | |
328 | |
329 // No copying! | |
330 | |
331 octave_w32_shlib (const octave_w32_shlib&); | |
332 | |
333 octave_w32_shlib& operator = (const octave_w32_shlib&); | |
334 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
335 HINSTANCE handle; |
4110 | 336 }; |
337 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
338 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
|
339 : octave_shlib::shlib_rep (f), handle (0) |
4110 | 340 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
341 handle = LoadLibrary (file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
342 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
343 if (! handle) |
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 DWORD lastError = GetLastError (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
346 char *msg; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
347 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
348 switch (lastError) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
349 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
350 case ERROR_MOD_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
351 case ERROR_DLL_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
352 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
|
353 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
354 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
355 case ERROR_INVALID_DLL: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
356 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
|
357 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
358 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
359 case ERROR_DLL_INIT_FAILED: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
360 msg = "library initialization routine failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
361 break; |
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 default: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
364 msg = "library open failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
365 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
366 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
367 (*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
|
368 } |
4110 | 369 } |
370 | |
371 octave_w32_shlib::~octave_w32_shlib (void) | |
372 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
373 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
374 FreeLibrary (handle); |
4110 | 375 } |
376 | |
5451 | 377 extern "C" |
378 { | |
379 void * octave_w32_search (HINSTANCE handle, const char * name); | |
380 } | |
381 | |
4110 | 382 void * |
383 octave_w32_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
384 octave_shlib::name_mangler mangler) |
4110 | 385 { |
386 void *function = 0; | |
387 | |
388 if (is_open ()) | |
389 { | |
390 std::string sym_name = name; | |
391 | |
392 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
393 sym_name = mangler (name); |
4110 | 394 |
5451 | 395 function = octave_w32_library_search (handle, sym_name.c_str ()); |
4110 | 396 } |
397 else | |
398 (*current_liboctave_error_handler) | |
399 ("shared library %s is not open", file.c_str ()); | |
400 | |
401 return function; | |
402 } | |
403 | |
4162 | 404 #elif defined (HAVE_DYLD_API) |
405 | |
406 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
407 octave_dyld_shlib : public octave_shlib::shlib_rep |
4162 | 408 { |
409 public: | |
410 | |
411 octave_dyld_shlib (void); | |
412 | |
413 ~octave_dyld_shlib (void); | |
414 | |
5781 | 415 void open (const std::string& f); |
4162 | 416 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
417 void *search (const std::string& name, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
418 octave_shlib::name_mangler mangler = 0); |
4162 | 419 |
420 void close (octave_shlib::close_hook cl_hook = 0); | |
421 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
422 bool is_open (void) const {return (handle != 0); } |
4162 | 423 |
424 private: | |
425 | |
426 // No copying! | |
427 | |
428 octave_dyld_shlib (const octave_dyld_shlib&); | |
429 | |
430 octave_dyld_shlib& operator = (const octave_dyld_shlib&); | |
431 | |
432 NSObjectFileImage img; | |
433 NSModule handle; | |
434 }; | |
435 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
436 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
|
437 : octave_shlib::shlib_rep (f), handle (0) |
4162 | 438 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
439 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
|
440 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
441 if (NSObjectFileImageSuccess == returnCode) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
442 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
443 handle = NSLinkModule (img, file.c_str (), |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
444 (NSLINKMODULE_OPTION_RETURN_ON_ERROR |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
445 | NSLINKMODULE_OPTION_PRIVATE)); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
446 if (! handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
447 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
448 NSLinkEditErrors ler; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
449 int lerno; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
450 const char *file2; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
451 const char *errstr = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
452 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
453 NSLinkEditError (&ler, &lerno, &file2, &errstr); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
454 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
455 if (! errstr) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
456 errstr = "unspecified error"; |
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 (*current_liboctave_error_handler) |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
459 ("%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
|
460 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
461 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
462 else |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
463 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
464 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
465 ("got NSObjectFileImageReturnCode %d", returnCode); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
466 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
467 // FIXME: should use NSLinkEditError () to get |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
468 // more info on what went wrong. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
469 } |
4162 | 470 } |
471 | |
472 octave_dyld_shlib::~octave_dyld_shlib (void) | |
473 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
474 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
475 NSUnLinkModule (handle, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); |
4162 | 476 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
477 NSDestroyObjectFileImage (img); |
4162 | 478 } |
479 | |
480 void * | |
481 octave_dyld_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
482 octave_shlib::name_mangler mangler) |
4162 | 483 { |
484 void *function = 0; | |
485 | |
486 if (is_open ()) | |
487 { | |
488 std::string sym_name = name; | |
489 | |
490 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
491 sym_name = mangler (name); |
4162 | 492 |
493 NSSymbol symbol = NSLookupSymbolInModule (handle, sym_name.c_str ()); | |
494 | |
495 if (symbol) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
496 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
497 function = NSAddressOfSymbol (symbol); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
498 } |
4162 | 499 } |
500 else | |
501 (*current_liboctave_error_handler) | |
502 ("bundle %s is not open", file.c_str ()); | |
503 | |
504 return function; | |
505 } | |
506 | |
3326 | 507 #endif |
508 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
509 octave_shlib::shlib_rep * |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
510 octave_shlib::shlib_rep::new_instance (const std::string& f) |
3326 | 511 { |
4110 | 512 #if defined (HAVE_DLOPEN_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
513 return new octave_dlopen_shlib (f); |
4110 | 514 #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
|
515 return new octave_shl_load_shlib (f); |
4110 | 516 #elif defined (HAVE_LOADLIBRARY_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
517 return new octave_w32_shlib (f); |
4162 | 518 #elif defined (HAVE_DYLD_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
519 return new octave_dyld_shlib (f); |
3326 | 520 #else |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
521 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
522 ("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
|
523 return new shlib_rep (); |
3326 | 524 #endif |
525 } |