📄 dload.cxx
字号:
//==========================================================================//// dload.cxx//// Dynamic loader API////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): nickg// Contributors: nickg// Date: 2000-11-03// Purpose: Loader class implementation// Description: This file contains the dynamic ELF loader API.// This presents the standard dlxxx() calls by invoking// the loader classes as appropriate.// // ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/hal.h>#include <pkgconf/kernel.h>#include <pkgconf/isoinfra.h>#include <cyg/kernel/ktypes.h> // base kernel types#include <cyg/infra/cyg_trac.h> // tracing macros#include <cyg/infra/cyg_ass.h> // assertion macros#include <string.h>#include <cyg/loader/loader.hxx> // Loader header#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <dlfcn.h> // API definitions// =========================================================================// Cyg_LoaderStream_File class// =========================================================================// API callscyg_uint32 global_symbol_object;// =========================================================================// Load and open object__externC void *dlopen (const char *file, int mode){ CYG_REPORT_FUNCTION(); void *ret = NULL; if( file == NULL ) { // Special case to allow access to all symbols. ret = (void *)&global_symbol_object; }#ifdef CYGPKG_IO_FILEIO else { int fd = open( file, O_RDONLY ); if( fd < 0 ) return NULL; Cyg_LoaderStream_File filestream( fd ); Cyg_LoadObject *obj; cyg_code error = Cyg_Loader::loader->load( filestream, mode, &obj ); if( error == 0) { ret = (void *)obj; } close( fd ); }#endif CYG_REPORT_RETVAL(ret); return ret;}// =========================================================================__externC void *dlopenmem(const void *addr, size_t size, int mode){ CYG_REPORT_FUNCTION(); void *ret = NULL; Cyg_LoaderStream_Mem memstream( addr, size ); Cyg_LoadObject *obj; cyg_code error = Cyg_Loader::loader->load( memstream, mode, &obj ); if( error == 0) ret = (void *)obj; CYG_REPORT_RETVAL(ret); return ret;}// =========================================================================__externC int dlclose (void *handle){ CYG_REPORT_FUNCTION(); int ret = 0; if( handle == (void *)global_symbol_object ) { // Nothing to do here... } else { Cyg_LoadObject *obj = (Cyg_LoadObject *)handle; Cyg_Loader::loader->close( obj ); } CYG_REPORT_RETVAL(ret); return ret;}// =========================================================================__externC void *dlsym (void *handle, const char *name){ CYG_REPORT_FUNCTION(); void *ret = NULL; Cyg_LoadObject *obj = (Cyg_LoadObject *)handle; ret = obj->symbol( name ); CYG_REPORT_RETVAL(ret); return ret;}// =========================================================================__externC const char *dlerror (void){ CYG_REPORT_FUNCTION(); const char *ret = Cyg_Loader::loader->error_string(); CYG_REPORT_RETVAL(ret); return ret;}// =========================================================================// EOF dload.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -