ATLAS Offline Software
Loading...
Searching...
No Matches
SharedLibrary Class Reference

Shared library services. More...

Collaboration diagram for SharedLibrary:

Classes

struct  LibraryInfo
 Information about a currently loaded shared library. More...

Public Types

typedef void * Data
typedef void(* Function) (void)
typedef Callback1< const LibraryInfo & > InfoHandler

Public Member Functions

void release (void)
 Release a shared library.
void abandon (void)
 Abandon a library.
Data data (const std::string &name, bool mangle=true) const
 Locate and return a reference to a data symbol called name.
Function function (const std::string &name, bool mangle=true) const
 Locate and return a reference to a function symbol called name.

Static Public Member Functions

static std::string path (void)
static void path ATLAS_NOT_THREAD_SAFE (const std::string &path)
static std::string libname (const std::string &name)
 Return a shared library name that follows the system conventions for naming shared library.
static std::string symname (const std::string &name)
 Transform 'extern "C"' symbol name into a name suitable for lookup in a shared library, e.g.
static SharedLibraryself (void)
 Return a shared library object representing the application itself.
static SharedLibraryload (const std::string &name)
 Load a shared library and return an object representing it.
static void loaded (InfoHandler &handler)
 Iterate and provide information about all currently loaded shared libraries.

Protected Member Functions

 SharedLibrary (void *handle)
 Protected constructor for initialising a library object.
 ~SharedLibrary (void)
 Protected destructor for cleaning up a library object.

Private Member Functions

 SharedLibrary (const SharedLibrary &)
SharedLibraryoperator= (const SharedLibrary &)

Private Attributes

void * m_handle

Detailed Description

Shared library services.

Definition at line 157 of file SealSharedLib.h.

Member Typedef Documentation

◆ Data

typedef void* SharedLibrary::Data

Definition at line 160 of file SealSharedLib.h.

◆ Function

typedef void(* SharedLibrary::Function) (void)

Definition at line 161 of file SealSharedLib.h.

◆ InfoHandler

Definition at line 175 of file SealSharedLib.h.

Constructor & Destructor Documentation

◆ SharedLibrary() [1/2]

SharedLibrary::SharedLibrary ( void * handle)
protected

Protected constructor for initialising a library object.

The real initialisation happens in load() or self().

Definition at line 588 of file SealSharedLib.cxx.

589 : m_handle (handle)
590{ assert (m_handle); }

◆ ~SharedLibrary()

SharedLibrary::~SharedLibrary ( void )
protected

Protected destructor for cleaning up a library object.

The real destruction happens in release() or #abadon().

Definition at line 594 of file SealSharedLib.cxx.

595{ assert (! m_handle); }

◆ SharedLibrary() [2/2]

SharedLibrary::SharedLibrary ( const SharedLibrary & )
private

Member Function Documentation

◆ abandon()

void SharedLibrary::abandon ( void )

Abandon a library.

This simply destroys the shared library object (this) without releasing the underlying dynamic object.

Definition at line 626 of file SealSharedLib.cxx.

627{
628 assert (m_handle);
629 m_handle = 0;
630 delete this;
631}

◆ ATLAS_NOT_THREAD_SAFE()

void path SharedLibrary::ATLAS_NOT_THREAD_SAFE ( const std::string & path)
static

◆ data()

SharedLibrary::Data SharedLibrary::data ( const std::string & name,
bool mangle = true ) const

Locate and return a reference to a data symbol called name.

If no such symbol exists, returns a null pointer. If mangle is the default true, the symbol is mangled to the platform convention, typically prepending an underscore if required. The mangling does not refer to C++ name mangling, but to the mangling required to convert C identifiers to run-time symbol names; see symname() for details.

Definition at line 641 of file SealSharedLib.cxx.

642{
643 assert (! name.empty ());
644 assert (m_handle);
645 std::string mangled = mangle ? symname (name) : name;
646 Data symbol = 0;
647
648#if HAVE_DLOPEN || HAVE_LOAD
649 // See comments in "self()" about crashes in dlerror().
650 const char *error = 0;
651 symbol = ::dlsym (m_handle, mangled.c_str ());
652 if (! symbol && (error = ::dlerror ()) != 0)
653 throw SharedLibraryError ("dlsym()", error);
654
655#elif HAVE_SHL_LOAD
656 shl_t handle = (shl_t) m_handle;
657 if (::shl_findsym (&handle, mangled.c_str (), TYPE_DATA, &symbol) != 0)
658 throw SharedLibraryError ("shl_findsym()", errno);
659 assert (handle == (shl_t) m_handle);
660
661#elif defined _WIN32
662 if (! (symbol = (Data)::GetProcAddress((HINSTANCE)m_handle, mangled.c_str())))
663 throw SharedLibraryError ("GetProcAddress()", GetLastError ());
664#else
665 // cannot get here---`load' and `self' should take care of it.
666 assert (false);
667#endif
668 return symbol;
669}
static std::string symname(const std::string &name)
Transform 'extern "C"' symbol name into a name suitable for lookup in a shared library,...
virtual void handle(const Incident &inc)
Handle end of run incidents to save the metadata at that point.

◆ function()

SharedLibrary::Function SharedLibrary::function ( const std::string & name,
bool mangle = true ) const

Locate and return a reference to a function symbol called name.

If no such symbol exists, returns a null pointer. If mangle is the default true, the symbol is mangled to the platform convention, typically prepending an underscore if required. The mangling does not refer to C++ name mangling, but to the mangling required to convert C identifiers to run-time symbol names; see symname() for details.

Definition at line 679 of file SealSharedLib.cxx.

680{
681 assert (! name.empty ());
682 assert (m_handle);
683 std::string mangled = mangle ? symname (name) : name;
684 Function symbol = 0;
685
686#if HAVE_DLOPEN || HAVE_LOAD
687 // See comments in "self()" about crashes in dlerror().
688 static_assert (sizeof (Function) == sizeof (Data));
689 const char *error = 0;
690 Data data = ::dlsym (m_handle, mangled.c_str ());
691 if (! data && (error = ::dlerror ()) != 0) throw SharedLibraryError ("dlsym()", error);
692 symbol = std::bit_cast<Function> (data);
693
694#elif HAVE_SHL_LOAD
695 shl_t handle = (shl_t) m_handle;
696 if (::shl_findsym (&handle, mangled.c_str (), TYPE_PROCEDURE, &symbol) != 0)
697 throw SharedLibraryError ("shl_findsym()", errno);
698 assert (handle == (shl_t) m_handle);
699
700#elif defined _WIN32
701 if (! (symbol = (Function) ::GetProcAddress ((HINSTANCE) m_handle,
702 mangled.c_str ())))
703 throw SharedLibraryError ("GetProcAddress()", GetLastError ());
704#else
705 // cannot get here---`load' and `self' should take care of it.
706 assert (false);
707#endif
708 return symbol;
709}
void(* Function)(void)
Data data(const std::string &name, bool mangle=true) const
Locate and return a reference to a data symbol called name.

◆ libname()

std::string SharedLibrary::libname ( const std::string & name)
static

Return a shared library name that follows the system conventions for naming shared library.

name is the basic name of the shared library, without the name prefix ("lib" on unix) or the extension (".so", ".sl", ".dylib" or ".dll"). name must not have any directory components.

Definition at line 179 of file SealSharedLib.cxx.

180{
181#ifdef _WIN32
182 return name + ".dll";
183#elif defined __hpux
184 return "lib" + name + ".sl";
185#else
186 return "lib" + name + ".so";
187#endif
188}

◆ load()

SharedLibrary * SharedLibrary::load ( const std::string & name)
static

Load a shared library and return an object representing it.

The returned object is allocated with new. The caller must release the object with either release() or abandon(). The method throws a SharedLibraryError if the operation is not supported or some failure occurs. Please note that on several systems failure to properly load a library, e.g. due to missing symbols, is effectively fatal.

Definition at line 242 of file SealSharedLib.cxx.

243{
244 assert(! name.empty ());
245
246 void *handle = 0;
247
248#if HAVE_DLOPEN || HAVE_LOAD
249# ifndef RTLD_GLOBAL
250# define RTLD_GLOBAL 0
251# endif
252 // See comments in "self()" about crashes in dlerror().
253 if (! (handle = ::dlopen (name.c_str (), RTLD_LAZY | RTLD_GLOBAL)))
254 {
255 const char *msg = ::dlerror ();
256 msg = msg ? msg : "dynamic linker error message lost!";
257 throw SharedLibraryError ("dlopen()", msg);
258 }
259
260#elif HAVE_SHL_LOAD
261 if (! (handle = ::shl_load (name.c_str (), BIND_DEFERRED, 0L)))
262 throw SharedLibraryError ("shl_load()", errno);
263
264#elif defined _WIN32
265 if (! (handle = ::LoadLibrary (name.c_str ())))
266 throw SharedLibraryError ("LoadLibrary()", GetLastError ());
267#else
269#endif
270
271 return new SharedLibrary (handle);
272}
#define SHLIB_UNSUPPORTED
SharedLibrary(void *handle)
Protected constructor for initialising a library object.
MsgStream & msg
Definition testRead.cxx:32

◆ loaded()

void SharedLibrary::loaded ( InfoHandler & handler)
static

Iterate and provide information about all currently loaded shared libraries.

Definition at line 277 of file SealSharedLib.cxx.

278{
279 // Dynamic linker characteristics:
280 // AIX, Windows, SVR4 (DG/UX, DRS/NX, DYNIX/ptx, Linux, SINIX,
281 // Solaris, UnixWare, {Free,Open,Net}BSD if __ELF__), BSD,
282 // HP-UX, IRIX, Tru64
283
284 // Object file formats:
285 // XCOFF (AIX), ELF32/64 (DG/UX, DRS/NX, DYNIX/ptx, IRIX, SINIX,
286 // Solaris, UnixWare, {Free,Open,Net}BSD: if __ELF__), a.out
287 // ({Free,Open,Net}BSD if ! __ELF__, SunOS), BFD (Cygwin, HP-UX,
288 // Linux, LynxOS, Tru64, Windows if GCC), PE (Windows), COFF (?)
289
290#if HAVE_SHL_LOAD // hp-ux
291 shl_descriptor desc;
292
293 for (int index = -1; shl_get_r (index, &desc) == 0; ++index)
294 {
296 info.m_filename = desc.filename;
297 info.m_text_start = desc.tstart;
298 info.m_text_end = desc.tend;
299 info.m_data_start = desc.dstart;
300 info.m_data_end = desc.dend;
301 info.m_bss_start = 0;
302 info.m_bss_end = 0;
303
304 handler (info);
305 }
306
307#elif HAVE_LINK_H // bsd/svr4/elf
308# if !HAVE_LINK_MAP_L_MAP_START
309# define l_map_start l_addr
310# define l_map_end l_addr
311# endif
312# if !HAVE_PROGRAM_INVOCATION_NAME
313 static const char *program_invocation_name = "(unknown program name)";
314# endif
315# if HAVE_R_DEBUG // linux/glibc
316 link_map *p = _r_debug.r_map;
317# else
318 // Dynamic linker root:
319 // BSD (SunOS):
320 // #include <sys/types.h>
321 // #include <link.h>
322 // extern struct link_dynamic _DYNAMIC;
323 // link_dynamic *d = &_DYNAMIC;
324 // if ((d->ld_version > 1) && (d->ld_version <= 3) && (d->ld_un.ld_1 != 0))
325 // --> link_map *l = d->ld_un.ld_1->ld_loaded
326 // l->lm_name, l->lm_addr, l->lm_next
327 //
328 // BSD ({Free,Open,Net}BSD):
329 // #include <sys/types.h>
330 // #include <link.h>
331 // extern struct _dynamic _DYNAMIC
332 // _dynamic *d = &_DYNAMIC;
333 // if ((d->version == LD_VERSION_BSD) && d->d_un.d_sdt != 0))
334 // --> so_map *l = d->d_un.d_sdt->sdt_loaded
335 // l->som_path, l->som_addr, l->som_next
336 //
337 // SVR4 (DG/UX, DRS/NX, DYNIX/ptx, SINIX, UnixWare)
338 // ElfW(Dyn) _DYNAMIC[] // Linux
339 // void _DYNAMIC (void) // weak, really is data, but not
340 // // all compilers allow weak data
341 //
342 // Solaris:
343 // dlinfo (self, RTLD_DI_LINKMAP, &p);
344
345 // extern ElfW(Dyn) _DYNAMIC []; // #pragma weak? // wlav
346 link_map *p = 0;
347 for (ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
348 if (dyn->d_tag == DT_DEBUG && dyn->d_un.d_ptr)
349 // linux: p = ((r_debug *) dyn->d_un_d.ptr)->r_map;
350 p = (link_map *) *((unsigned long *) dyn->d_un.d_ptr + 1);
351# endif
352
353 if (! p)
354 throw SharedLibraryError ("loaded", "no shared library load map");
355
356 // Get executable name; linux has a symlink in /proc/self/exe.
357 // Linux path names are arbitrarily long, so we just have create
358 // some random-sized buffer. We allocate this on stack to avoid
359 // dynamic memory allocation. If this is a problem, report a bug.
360 struct stat sbuf;
361 char exe [4096];
362
363 memset (exe, 0, sizeof (exe));
364 if (::stat ("/proc/self/exe", &sbuf) == 0)
365 ::readlink ("/proc/self/exe", exe, sizeof (exe)-1);
366 else
367 STDC::strncpy (exe, program_invocation_name, sizeof (exe)-1);
368
369 // Get shared libraries
370 for ( ; p; p = p->l_next)
371 {
373
374 /* FIXME: Does this work with prelinked shared libraries?
375 From a mail to GCC mailing list ("fde-glibc.c bug"):
376
377 There is a bug in gcc/config/ia64/fde-glibc.c:
378 ret = find_fde_for_dso ((Elf64_Addr)pc, (Elf64_Ehdr *)map->l_addr,
379 ^^^^^^^^^^^
380 segment_base, gp);
381
382 this will work only as long as the shared library in
383 question has first PT_LOAD segment's p_vaddr == 0.
384 E.g. with ELF prelinking this is almost never true
385 though, so what you really want is map->l_map_start
386 (map->l_addr will be almost always 0) or even better
387 map->l_phdr/map->l_phnum pair. */
388
389 // FIXME: use the map address (= ElfW(Ehdr)) to scan over
390 // the different ElfW(Phdr)s to find the various sections.
391 info.m_filename = (p->l_name && p->l_name[0] ? p->l_name : exe);
392 info.m_text_start = p->l_addr ? p->l_addr : p->l_map_start;
393 info.m_text_end = p->l_addr ? p->l_addr : p->l_map_end;
394 info.m_data_start = 0;
395 info.m_data_end = 0;
396 info.m_bss_start = 0;
397 info.m_bss_end = 0;
398
399 handler (info);
400 }
401
402#elif HAVE_SGIDEFS_H // irix
403 /* From rld(1) man page:
404
405 rld keeps a doubly linked list of structures and crt1.o
406 contains a pointer to the head of the list of obj structures
407 called __rld_obj_head. In an o32 executable, this points to a
408 linked list of objList structures (/usr/include/obj_list.h),
409 each of which has a `data' element which is a pointer to a
410 `struct obj' (/usr/include/obj.h) (even though the field is not
411 declared as a pointer). In an n32 executable, __rld_obj_head
412 points to a linked list of Elf32_Obj_Info structures
413 (/usr/include/objlist.h). In a 64-bit executable,
414 __rld_obj_head points to a linked list of Elf64_Obj_Info
415 structures (/usr/include/objlist.h). The `oi_magic' element of
416 each Elf32_Obj_Info or Elf64_Obj_Info is all-bits-on
417 (0xffffffff) to make it easier to determine which list type is
418 in use a 32-bit executable. */
419
420 // To get more details by reading the ELF files:
421 // http://reality.sgi.com/davea/software.html
422 extern ElfW(Obj_Info) *__rld_obj_head;
423 ElfW(Obj_Info) *p = __rld_obj_head;
424
425 for ( ; p; p = (ElfW(Obj_Info) *) p->oi_next)
426 {
428
429# if defined _MIPS_SIM_ABI32 && _MIPS_SIM == _MIPS_SIM_ABI32
430 info.m_filename = (const char *) p->o_path;
431 info.m_text_start = p->o_praw; // base address: o_base_address
432 info.m_text_end = p->o_praw;
433# elif (defined _MIPS_SIM_NABI32 && _MIPS_SIM == _MIPS_SIM_NABI32) \
434 || (defined _MIPS_SIM_ABI64 && _MIPS_SIM == _MIPS_SIM_ABI64)
435 info.m_filename = (const char *) p->oi_pathname;
436 info.m_text_start = p->oi_ehdr; // base address: oi_orig_ehdr
437 info.m_text_end = p->oi_ehdr;
438# else
439# error "Unsupported ABI: not o32, n32 or 64"
440# endif
441 info.m_data_start = 0;
442 info.m_data_end = 0;
443 info.m_bss_start = 0;
444 info.m_bss_end = 0;
445
446 handler (info);
447 }
448
449#elif HAVE_LOADER_H && HAVE_LDR_NEXT_MODULE_DECL // tru64
450 ldr_process_t proc = ldr_my_process ();
451 ldr_module_t mod = LDR_NULL_MODULE;
452 int ret = ldr_next_module (proc, &mod);
453
454 for (; ret == 0 && mod != LDR_NULL_MODULE; ret = ldr_next_module (proc, &mod))
455 {
456 ldr_module_info_t info;
457 size_t size = 0;
458 LibraryInfo libinfo;
459
460 if (ldr_inq_module(proc, mod, &info, sizeof(info), &size) < 0)
461 throw SharedLibraryError ("ldr_inq_module()", errno);
462
463 libinfo.m_filename = info.lmi_name;
464 libinfo.m_text_start = 0;
465 libinfo.m_text_end = 0;
466 libinfo.m_data_start = 0;
467 libinfo.m_data_end = 0;
468 libinfo.m_bss_start = 0;
469 libinfo.m_bss_end = 0;
470
471 for (int i = 0; i < info.lmi_nregion; ++i)
472 {
473 ldr_region_info_t rinfo;
474 unsigned long low;
475 unsigned long high;
476
477 if (ldr_inq_region(proc, mod, i, &rinfo, sizeof(rinfo), &size) < 0)
478 throw SharedLibraryError ("ldr_inq_region()", errno);
479
480 low = (unsigned long) rinfo.lri_mapaddr;
481 high = ((unsigned long) rinfo.lri_mapaddr) + rinfo.lri_size;
482
483 if (!strcmp(rinfo.lri_name, ".text")) {
484 libinfo.m_text_start = low;
485 libinfo.m_text_end = high;
486 } else if (!strcmp(rinfo.lri_name, ".data")) {
487 libinfo.m_data_start = low;
488 libinfo.m_data_end = high;
489 } else if (!strcmp(rinfo.lri_name, ".bss")) {
490 libinfo.m_bss_start = low;
491 libinfo.m_bss_end = high;
492 }
493 }
494
495 handler (libinfo);
496 }
497
498 if (ret < 0)
499 throw SharedLibraryError ("ldr_next_module()", errno);
500
501#elif HAVE_LOAD && HAVE_LOAD_DECL // aix
502 int size = 16;
503 void *buffer = new ld_info [size];
504 int error = ::loadquery (L_GETINFO, buffer, size);
505 int offset = 0;
506
507 while (error == -1 && errno == ENOMEM)
508 {
509 delete [] (ld_info *) buffer;
510 buffer = new ld_info [size *= 2];
511 error = ::loadquery (L_GETINFO, buffer, size);
512 }
513
514 if (error == -1)
515 throw SharedLibraryError ("loadquery()", errno);
516
517 while (true)
518 {
520 ld_info *ld = (ld_info *) ((char *) buffer + offset);
521 const char *path = ld->ldinfo_filename;
522 const char *member = path + strlen (path) + 1;
523 std::string filename; // FIXME: Use alloca instead?
524
525 filename = path;
526 if (*member)
527 {
528 filename += '(';
529 filename += member;
530 filename += ')';
531 }
532
533 info.m_filename = filename.c_str ();
534 info.m_text_start = (unsigned long) ld->ldinfo_textorg;
535 info.m_text_end = info.m_text_start + ld->ldinfo_textsize;
536 info.m_data_start = (unsigned long) ld->ldinfo_dataorg;
537 info.m_data_end = info.m_data_start + ld->ldinfo_datasize;
538 info.m_bss_start = 0;
539 info.m_bss_end = 0;
540
541 handler (info);
542
543 if (ld->ldinfo_next)
544 offset += ld->ldinfo_next;
545 else
546 break;
547 }
548
549 delete [] (ld_info *) buffer;
550
551#elif HAVE_MACH_O_DYLD_H // darwin
552 unsigned long images = _dyld_image_count ();
553 for (unsigned long i = 0; i < images; ++i)
554 {
555 const mach_header *hdr = _dyld_get_image_header (i);
556 unsigned long slide = _dyld_get_image_vmaddr_slide (i);
557 unsigned int size;
558 char *sect;
560
561 info.m_filename = _dyld_get_image_name (i);
562
563 sect = getsectdatafromheader (hdr, SEG_TEXT, SECT_TEXT, &size);
564 info.m_text_start = sect ? (unsigned long) sect + slide : 0;
565 info.m_text_end = sect ? (unsigned long) sect + slide + size : 0;
566 sect = getsectdatafromheader (hdr, SEG_DATA, SECT_DATA, &size);
567 info.m_data_start = sect ? (unsigned long) sect + slide : 0;
568 info.m_data_end = sect ? (unsigned long) sect + slide + size : 0;
569 sect = getsectdatafromheader (hdr, SEG_DATA, SECT_BSS, &size);
570 info.m_bss_start = sect ? (unsigned long) sect + slide : 0;
571 info.m_bss_end = sect ? (unsigned long) sect + slide + size : 0;
572
573 handler (info);
574 }
575
576#elif defined _WIN32 // windows
577 if (! SymInitialize (GetCurrentProcess (), NULL, TRUE)
578 || ! SymEnumerateModules (GetCurrentProcess (), &enumModules, (void *) &handler)
579 || ! SymCleanup (GetCurrentProcess ()))
580 throw SharedLibraryError ("SymEnumerateModules()", GetLastError());
581#else
583#endif
584}
#define ElfW(type)
Definition SealCommon.h:210
size_t size() const
Number of registered mappings.
static std::string path(void)
str index
Definition DeMoScan.py:362
void handler(int sig)
signal handler
Definition rmain.cxx:99
Information about a currently loaded shared library.

◆ operator=()

SharedLibrary & SharedLibrary::operator= ( const SharedLibrary & )
private

◆ path()

std::string SharedLibrary::path ( void )
static

◆ release()

void SharedLibrary::release ( void )

Release a shared library.

This unloads any library the object currently refers to, then deletes this. Note that releasing the library does not guarantee that it will actually be unloaded. If there are outstanding references to the library, explicit or implicit, the library will remain in memory.

Definition at line 603 of file SealSharedLib.cxx.

604{
605 assert (m_handle);
606
607#if HAVE_DLOPEN || HAVE_LOAD
608 ::dlclose (m_handle);
609#elif HAVE_SHL_LOAD
610 ::shl_unload ((shl_t) m_handle);
611#elif defined _WIN32
612 ::FreeLibrary ((HINSTANCE) m_handle);
613#else
614 // cannot get here---`load' and `self' should take care of it.
615 assert (false);
616#endif
617
618 m_handle = 0;
619 delete this;
620}

◆ self()

SharedLibrary * SharedLibrary::self ( void )
static

Return a shared library object representing the application itself.

The returned object is allocated with new. The caller must release the object with either release() or abandon(). The method throws a SharedLibraryError if the operation is not supported or some failure occurs.

Definition at line 207 of file SealSharedLib.cxx.

208{
209#if HAVE_DLOPEN || HAVE_LOAD
210 // NB: Linux (at least RH 7.x) dynamic loader is severely broken
211 // when it comes to reporting error messages. The error messages
212 // are frequently garbled or null. If you see a crash in a call
213 // to dlerror(), sorry, there's nothing we can do about that.
214 // Our attempts have only produced even more undesirable crashes.
215 // Waiting for a better version of the linux dynamic loader.
216 void *handle = ::dlopen (0, RTLD_LAZY);
217 if (! handle)
218 {
219 const char *msg = ::dlerror ();
220 msg = msg ? msg : "dynamic linker error message lost!";
221 throw SharedLibraryError ("dlopen()", msg);
222 }
223
224 return new SharedLibrary (handle);
225#elif HAVE_SHL_LOAD
226 return new SharedLibrary (PROG_HANDLE);
227#elif defined _WIN32
228 return new SharedLibrary (::GetModuleHandle (0));
229#else
231#endif
232}

◆ symname()

std::string SharedLibrary::symname ( const std::string & name)
static

Transform 'extern "C"' symbol name into a name suitable for lookup in a shared library, e.g.

with data() or function(). Normally the latter two automatically perform the necessary mangling by calling this function, but the clients can also do the mangling themselves. The name should be in the form it is spelled in C source code.

Definition at line 197 of file SealSharedLib.cxx.

198{ return name; }

Member Data Documentation

◆ m_handle

void* SharedLibrary::m_handle
private

Definition at line 197 of file SealSharedLib.h.


The documentation for this class was generated from the following files: