/* $Id: dlsym.c,v 1.4 2002/10/29 04:45:30 rex Exp $ */ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS POSIX+ Subsystem * FILE: subsys/psx/lib/psxdll/dlfcn/dlsym.c * PURPOSE: Obtain the address of a symbol from a dlopen() object * PROGRAMMER: KJK::Hyperion * UPDATE HISTORY: * 19/12/2001: Created */ #include #include #include #include #include #include #include void *__dlsymn(void *, unsigned long int); void *__dlsym(void *, int, const char *, unsigned long int); void *dlsym(void *handle, const char *name) { return (__dlsym(handle, 1, name, 0)); } void *__dlsymn(void *handle, unsigned long int ordinal) { return (__dlsym(handle, 0, 0, ordinal)); } void *__dlsym(void *handle, int by_name, const char *name, unsigned long int ordinal) { struct __dlobj * pdloObject; void * pProcAddr; NTSTATUS nErrCode; if(handle == RTLD_NEXT) { FIXME("implement RTLD_NEXT semantics"); return (NULL); } pdloObject = (struct __dlobj *) handle; if(pdloObject->global) { FIXME("implement global symbol matching"); return (NULL); } if(by_name) { ANSI_STRING strName; RtlInitAnsiString(&strName, (LPSTR)name); nErrCode = LdrGetProcedureAddress ( pdloObject->handle, &strName, 0, (PVOID *)&pProcAddr ); } else { nErrCode = LdrGetProcedureAddress ( pdloObject->handle, NULL, ordinal, (PVOID *)&pProcAddr ); } if(!NT_SUCCESS(nErrCode)) { __dl_set_last_error(__status_to_errno(nErrCode)); return (NULL); } return pProcAddr; } /* EOF */