/* We must do this in a separate function because of the way the exception handler works (it makes this function return */ static int do_find_symbol (DSO_VMS_INTERNAL * ptr, struct dsc$descriptor_s *symname_dsc, void **sym, unsigned long flags) { /* Make sure that signals are caught and returned instead of aborting the program. The exception handler gets unestablished automatically on return from this function. */ lib$establish (lib$sig_to_ret); if (ptr->imagename_dsc.dsc$w_length) return lib$find_image_symbol (&ptr->filename_dsc, symname_dsc, sym, &ptr->imagename_dsc, flags); else return lib$find_image_symbol (&ptr->filename_dsc, symname_dsc, sym, 0, flags); }
/* **++ ** ROUTINE: netlib___find_symbol ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib___find_symbol (char *imgnam, char *symnam, void *symptr) { struct dsc$descriptor imgdsc, symdsc; lib$establish(lib$sig_to_ret); INIT_SDESC(imgdsc, strlen(imgnam), imgnam); INIT_SDESC(symdsc, strlen(symnam), symnam); return find_image_symbol(&imgdsc, &symdsc, symptr); } /* netlib___find_symbol */
unsigned char *get_tpu_addr() { int4 status; unsigned char *fcn; static readonly $DESCRIPTOR(filename,"TPUSHR"); static readonly $DESCRIPTOR(symnam,"TPU$TPU"); status = lib$find_image_symbol(&filename,&symnam,&fcn); if ((status & 1) == 0) rts_error(VARLSTCNT(1) status); return fcn; }
void* SharedLibraryImpl::findSymbolImpl(const std::string& name) { FastMutex::ScopedLock lock(_mutex); if (_path.empty()) return NULL; Path p(_path); std::string filename = p.getBaseName(); std::string ext = p.getExtension(); std::string imageSpec = p.makeParent().toString(); if (!imageSpec.empty() && !ext.empty()) { imageSpec.append("."); imageSpec.append(ext); } int value = 0; long flags = LIB$M_FIS_MIXEDCASE; POCO_DESCRIPTOR_STRING(filenameDsc, filename); POCO_DESCRIPTOR_STRING(symbolDsc, name); POCO_DESCRIPTOR_STRING(imageSpecDsc, imageSpec); try { // lib$find_image_symbol only accepts 32-bit pointers #pragma pointer_size save #pragma pointer_size 32 lib$find_image_symbol(&filenameDsc, &symbolDsc, &value, imageSpec.empty() ? 0 : &imageSpecDsc, flags); #pragma pointer_size restore } catch (struct chf$signal_array& sigarr) { unsigned sig = sigarr.chf$is_sig_name; unsigned act = LIB$_ACTIMAGE; if (lib$match_cond(&sig, &act)) throw LibraryLoadException(_path); } return (void*) value; }
/* **++ ** ROUTINE: find_image_symbol ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ static unsigned int find_image_symbol (struct dsc$descriptor *imgdsc, struct dsc$descriptor *symdsc, void *symptr) { return lib$find_image_symbol(imgdsc, symdsc, symptr); } /* find_image_symbol */