Example #1
0
/* 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);
}
Example #2
0
/*
**++
**  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;
}
Example #4
0
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;
}
Example #5
0
/*
**++
**  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 */