Mercurial > octave-nkf
annotate liboctave/util/oct-shlib.cc @ 20528:3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
* oct-shlib.cc (octave_dlopen_shlib::octave_dlopen_shlib): Use RTLD_GLOBAL
option for dlopen.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Mon, 21 Sep 2015 17:15:17 +0200 |
parents | 4197fc428c7d |
children |
rev | line source |
---|---|
3326 | 1 /* |
2 | |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19444
diff
changeset
|
3 Copyright (C) 1999-2015 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 |
19444
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 |
20528
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
198 // Use RTLD_GLOBAL to export symbols from loaded objects so they are |
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
199 // available to other subsequently loaded libraries. |
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
200 #if defined (RTLD_GLOBAL) |
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
201 flags |= RTLD_GLOBAL; |
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
202 #endif |
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19731
diff
changeset
|
203 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
204 library = dlopen (file.c_str (), flags); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
205 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
206 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
207 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
208 const char *msg = dlerror (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
209 |
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
|
210 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
|
211 (*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
|
212 file.c_str (), msg); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
213 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
|
214 (*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
|
215 file.c_str ()); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
216 } |
3326 | 217 } |
218 | |
219 octave_dlopen_shlib::~octave_dlopen_shlib (void) | |
220 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
221 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
222 dlclose (library); |
3326 | 223 } |
224 | |
225 void * | |
3504 | 226 octave_dlopen_shlib::search (const std::string& name, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
227 octave_shlib::name_mangler mangler) |
3326 | 228 { |
229 void *function = 0; | |
230 | |
231 if (is_open ()) | |
232 { | |
3504 | 233 std::string sym_name = name; |
3326 | 234 |
235 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
236 sym_name = mangler (name); |
3326 | 237 |
238 function = dlsym (library, sym_name.c_str ()); | |
239 } | |
240 else | |
241 (*current_liboctave_error_handler) | |
242 ("shared library %s is not open", file.c_str ()); | |
243 | |
244 return function; | |
245 } | |
246 | |
4110 | 247 #elif defined (HAVE_SHL_LOAD_API) |
3326 | 248 |
249 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
250 octave_shl_load_shlib : public octave_shlib::shlib_rep |
3326 | 251 { |
252 public: | |
253 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
254 octave_shl_load_shlib (const std::string& f); |
3326 | 255 |
256 ~octave_shl_load_shlib (void); | |
257 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
258 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
|
259 octave_shlib::name_mangler mangler = 0); |
3326 | 260 |
3609 | 261 bool is_open (void) const { return (library != 0); } |
3326 | 262 |
263 private: | |
264 | |
265 // No copying! | |
266 | |
267 octave_shl_load_shlib (const octave_shl_load_shlib&); | |
268 | |
269 octave_shl_load_shlib& operator = (const octave_shl_load_shlib&); | |
270 | |
271 shl_t library; | |
272 }; | |
273 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
274 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
|
275 : octave_shlib::shlib_rep (f), library (0) |
3326 | 276 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
277 file = f; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
278 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
279 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
|
280 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
281 if (! library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
282 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
283 using namespace std; |
15451
219479b461b8
build: Add missing tests and gnulib modules suggested by autoscan.
Rik <rik@octave.org>
parents:
15271
diff
changeset
|
284 (*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
|
285 } |
3326 | 286 } |
287 | |
288 octave_shl_load_shlib::~octave_shl_load_shlib (void) | |
289 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
290 if (library) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
291 shl_unload (library); |
3326 | 292 } |
293 | |
294 void * | |
3504 | 295 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
|
296 octave_shlib::name_mangler mangler) |
3326 | 297 { |
298 void *function = 0; | |
299 | |
300 if (is_open ()) | |
301 { | |
3609 | 302 std::string sym_name = name; |
3326 | 303 |
304 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
305 sym_name = mangler (name); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
306 |
3326 | 307 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
|
308 TYPE_UNDEFINED, &function); |
3326 | 309 } |
310 else | |
311 (*current_liboctave_error_handler) | |
312 ("shared library %s is not open", file.c_str ()); | |
313 | |
314 return function; | |
315 } | |
316 | |
4110 | 317 #elif defined (HAVE_LOADLIBRARY_API) |
318 | |
319 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
320 octave_w32_shlib: public octave_shlib::shlib_rep |
4110 | 321 { |
322 public: | |
323 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
324 octave_w32_shlib (const std::string& f); |
4110 | 325 |
326 ~octave_w32_shlib (void); | |
327 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
328 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
|
329 octave_shlib::name_mangler mangler = 0); |
4110 | 330 |
331 bool is_open (void) const { return (handle != 0); } | |
332 | |
333 private: | |
334 | |
335 // No copying! | |
336 | |
337 octave_w32_shlib (const octave_w32_shlib&); | |
338 | |
339 octave_w32_shlib& operator = (const octave_w32_shlib&); | |
340 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
341 HINSTANCE handle; |
4110 | 342 }; |
343 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
344 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
|
345 : octave_shlib::shlib_rep (f), handle (0) |
4110 | 346 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
347 handle = LoadLibrary (file.c_str ()); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
348 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
349 if (! handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
350 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
351 DWORD lastError = GetLastError (); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
352 char *msg; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
353 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
354 switch (lastError) |
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_MOD_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
357 case ERROR_DLL_NOT_FOUND: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
358 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
|
359 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
360 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
361 case ERROR_INVALID_DLL: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
362 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
|
363 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
364 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
365 case ERROR_DLL_INIT_FAILED: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
366 msg = "library initialization routine failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
367 break; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
368 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
369 default: |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
370 msg = "library open failed"; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
371 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
372 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
373 (*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
|
374 } |
4110 | 375 } |
376 | |
377 octave_w32_shlib::~octave_w32_shlib (void) | |
378 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
379 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
380 FreeLibrary (handle); |
4110 | 381 } |
382 | |
5451 | 383 extern "C" |
384 { | |
385 void * octave_w32_search (HINSTANCE handle, const char * name); | |
386 } | |
387 | |
4110 | 388 void * |
389 octave_w32_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
390 octave_shlib::name_mangler mangler) |
4110 | 391 { |
392 void *function = 0; | |
393 | |
394 if (is_open ()) | |
395 { | |
396 std::string sym_name = name; | |
397 | |
398 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
399 sym_name = mangler (name); |
4110 | 400 |
5451 | 401 function = octave_w32_library_search (handle, sym_name.c_str ()); |
4110 | 402 } |
403 else | |
404 (*current_liboctave_error_handler) | |
405 ("shared library %s is not open", file.c_str ()); | |
406 | |
407 return function; | |
408 } | |
409 | |
4162 | 410 #elif defined (HAVE_DYLD_API) |
411 | |
412 class | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
413 octave_dyld_shlib : public octave_shlib::shlib_rep |
4162 | 414 { |
415 public: | |
416 | |
417 octave_dyld_shlib (void); | |
418 | |
419 ~octave_dyld_shlib (void); | |
420 | |
5781 | 421 void open (const std::string& f); |
4162 | 422 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
423 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
|
424 octave_shlib::name_mangler mangler = 0); |
4162 | 425 |
426 void close (octave_shlib::close_hook cl_hook = 0); | |
427 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
428 bool is_open (void) const {return (handle != 0); } |
4162 | 429 |
430 private: | |
431 | |
432 // No copying! | |
433 | |
434 octave_dyld_shlib (const octave_dyld_shlib&); | |
435 | |
436 octave_dyld_shlib& operator = (const octave_dyld_shlib&); | |
437 | |
438 NSObjectFileImage img; | |
439 NSModule handle; | |
440 }; | |
441 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
442 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
|
443 : octave_shlib::shlib_rep (f), handle (0) |
4162 | 444 { |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
445 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
|
446 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
447 if (NSObjectFileImageSuccess == returnCode) |
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 handle = NSLinkModule (img, file.c_str (), |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
450 (NSLINKMODULE_OPTION_RETURN_ON_ERROR |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
451 | NSLINKMODULE_OPTION_PRIVATE)); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
452 if (! handle) |
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 NSLinkEditErrors ler; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
455 int lerno; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
456 const char *file2; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
457 const char *errstr = 0; |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
458 |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
459 NSLinkEditError (&ler, &lerno, &file2, &errstr); |
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 if (! errstr) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
462 errstr = "unspecified error"; |
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) |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
465 ("%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
|
466 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
467 } |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
468 else |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
469 { |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
470 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
471 ("got NSObjectFileImageReturnCode %d", returnCode); |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
472 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
473 // 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
|
474 // more info on what went wrong. |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
475 } |
4162 | 476 } |
477 | |
478 octave_dyld_shlib::~octave_dyld_shlib (void) | |
479 { | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
480 if (handle) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
481 NSUnLinkModule (handle, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); |
4162 | 482 |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
483 NSDestroyObjectFileImage (img); |
4162 | 484 } |
485 | |
486 void * | |
487 octave_dyld_shlib::search (const std::string& name, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
488 octave_shlib::name_mangler mangler) |
4162 | 489 { |
490 void *function = 0; | |
491 | |
492 if (is_open ()) | |
493 { | |
494 std::string sym_name = name; | |
495 | |
496 if (mangler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
497 sym_name = mangler (name); |
4162 | 498 |
499 NSSymbol symbol = NSLookupSymbolInModule (handle, sym_name.c_str ()); | |
500 | |
501 if (symbol) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
502 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
503 function = NSAddressOfSymbol (symbol); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
504 } |
4162 | 505 } |
506 else | |
507 (*current_liboctave_error_handler) | |
508 ("bundle %s is not open", file.c_str ()); | |
509 | |
510 return function; | |
511 } | |
512 | |
3326 | 513 #endif |
514 | |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
515 octave_shlib::shlib_rep * |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
516 octave_shlib::shlib_rep::new_instance (const std::string& f) |
3326 | 517 { |
4110 | 518 #if defined (HAVE_DLOPEN_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
519 return new octave_dlopen_shlib (f); |
4110 | 520 #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
|
521 return new octave_shl_load_shlib (f); |
4110 | 522 #elif defined (HAVE_LOADLIBRARY_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
523 return new octave_w32_shlib (f); |
4162 | 524 #elif defined (HAVE_DYLD_API) |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
525 return new octave_dyld_shlib (f); |
3326 | 526 #else |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
527 (*current_liboctave_error_handler) |
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
528 ("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
|
529 return new shlib_rep (); |
3326 | 530 #endif |
531 } |