unix_ddll_drv.c
来自「OTP是开放电信平台的简称」· C语言 代码 · 共 169 行
C
169 行
/* ``The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved via the world wide web at http://www.erlang.org/. * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Initial Developer of the Original Code is Ericsson Utvecklings AB. * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings * AB. All Rights Reserved.'' * * $Id$ *//* * Interface functions to the dynamic linker using dl* functions. * (As far as I know it works on SunOS 4, 5, Linux and FreeBSD. /Seb) */#ifdef HAVE_CONFIG_H# include "config.h"#endif#include "sys.h"#include "erl_ddll.h"#ifdef HAVE_DLFCN_H#include <dlfcn.h>#endif#ifdef HAVE_MACH_O_DYLD_H#include <mach-o/dyld.h>static int dyld_last_result = NSObjectFileImageSuccess;#endif/* some systems do not have RTLD_NOW defined, and require the "mode" * argument to dload() always be 1. */#ifndef RTLD_NOW# define RTLD_NOW 1#endif#define MAX_NAME_LEN 255 /* XXX should we get the system path size? */#define EXT_LEN 3#define FILE_EXT ".so" /* extension appended to the filename *//* the ddll driver is single threaded !! */static int dlopen_error; /* set if not dl error !! */#define ERL_DLERR_NAME_TO_LONG 1#define ERL_DLERR_NOT_AVAILABLE 2 /* * Open a shared object */void *ddll_open(full_name) char *full_name;{#if defined(HAVE_DLOPEN) || defined(HAVE_MACH_O_DYLD_H) char dlname[MAX_NAME_LEN+EXT_LEN+1]; int len; dlopen_error = 0; if ((len = sys_strlen(full_name)) >= MAX_NAME_LEN) { dlopen_error = ERL_DLERR_NAME_TO_LONG; return NULL; } sys_strcpy(dlname, full_name); sys_strcpy(dlname+len, FILE_EXT);#if defined(HAVE_MACH_O_DYLD_H) { NSObjectFileImage ofile; NSModule handle = NULL; dyld_last_result = NSCreateObjectFileImageFromFile(dlname, &ofile); if (dyld_last_result == NSObjectFileImageSuccess) handle = NSLinkModule(ofile, dlname, NSLINKMODULE_OPTION_PRIVATE); return handle; }#else return dlopen(dlname, RTLD_NOW);#endif#else dlopen_error = ERL_DLERR_NOT_AVAILABLE; return NULL;#endif}/* * Find a symbol in the shared object */void *ddll_sym(void *handle, char *func_name){#if defined(HAVE_MACH_O_DYLD_H) NSSymbol nssymbol = NSLookupSymbolInModule((NSModule*)handle,func_name); return nssymbol != NULL ? NSAddressOfSymbol(nssymbol) : NULL;#elif defined(HAVE_DLOPEN) return dlsym(handle, func_name);#else dlopen_error = ERL_DLERR_NOT_AVAILABLE; return NULL;#endif}/* * Close a chared object */int ddll_close(handle) void *handle;{#if defined(HAVE_MACH_O_DYLD_H) return 0;#elif defined(HAVE_DLOPEN) return dlclose(handle);#else dlopen_error = ERL_DLERR_NOT_AVAILABLE; return -1;#endif}/* * Return string that describes the (current) error */char *ddll_error(){ char* msg = (char *)NULL; if (dlopen_error) { switch(dlopen_error) { case ERL_DLERR_NAME_TO_LONG: return "name to long"; case ERL_DLERR_NOT_AVAILABLE: return "dynamic loading not implemented on this platform"; default: return "unknown error"; } }#if defined(HAVE_MACH_O_DYLD_H) if (dyld_last_result != NSObjectFileImageSuccess) { switch (dyld_last_result) { case NSObjectFileImageFailure: return "dyld: general failure"; case NSObjectFileImageInappropriateFile: return "dyld: inappropriate Mach-O file"; case NSObjectFileImageArch: return "dyld: inappropriate Mach-O architecture"; case NSObjectFileImageFormat: return "dyld: invalid Mach-O file format"; case NSObjectFileImageAccess: return "dyld: access error"; default: { static char dyld_error_message[1024]; sprintf(dyld_error_message, "dyld: unknown error: %d", dyld_last_result); return dyld_error_message; } } }#elif defined(HAVE_DLOPEN) msg = dlerror();#endif return msg ? msg : "no error";}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?