diff options
Diffstat (limited to 'src/dl')
-rw-r--r-- | src/dl/dl_gnu.go | 82 | ||||
-rw-r--r-- | src/dl/dlfcn.go | 135 | ||||
-rw-r--r-- | src/dl/dlsym_reserved.go | 63 |
3 files changed, 0 insertions, 280 deletions
diff --git a/src/dl/dl_gnu.go b/src/dl/dl_gnu.go deleted file mode 100644 index 771e9c4..0000000 --- a/src/dl/dl_gnu.go +++ /dev/null @@ -1,82 +0,0 @@ -// The code in this file is trivial, and not eligable for copyright. -// -// The documentation in this file is taken from the Linux Programmer's -// Manual page for dlopen(3). -// -// Copyright 1995 Yggdrasil Computing, Incorporated. -// written by Adam J. Richter (adam@yggdrasil.com), -// with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com). -// and Copyright 2003, 2015 Michael Kerrisk (mtk.manpages@gmail.com). -// -// This is free documentation; 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 of -// the License, or (at your option) any later version. -// -// The GNU General Public License's references to "object code" -// and "executables" are to be interpreted as the output of any -// document formatting or typesetting system, including -// intermediate and printed output. -// -// This manual 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 this manual; if not, see -// <http://www.gnu.org/licenses/>. -// -// Modified by David A. Wheeler <dwheeler@dwheeler.com> 2000-11-28. -// Applied patch by Terran Melconian, aeb, 2001-12-14. -// Modified by Hacksaw <hacksaw@hacksaw.org> 2003-03-13. -// Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete -// Modified by Michael Kerrisk <mtk.manpages@gmail.com> 2003-05-16. -// Modified by Walter Harms: dladdr, dlvsym -// Modified by Petr Baudis <pasky@suse.cz>, 2008-12-04: dladdr caveat - -package dl - -//#define _GNU_SOURCE -//#include <dlfcn.h> -import "C" - -// These flags to Open() are GNU libc extensions. -const ( - // Do not unload the shared object during Close(). - // Consequently, the object's static variables are not - // reinitialized if the object is reloaded with Open() at a - // later time. - RTLD_NODELETE Flag = C.RTLD_NODELETE // (since glibc 2.2, also present on Solaris) - - // Don't load the shared object. This can be used to test if - // the object is already resident (Open() returns nil if it - // is not, or the object's handle if it is resident). This - // flag can also be used to promote the flags on a shared - // object that is already loaded. For example, a shared - // object that was previously loaded with RTLD_LOCAL can be - // reopened with RTLD_NOLOAD | RTLD_GLOBAL. - RTLD_NOLOAD Flag = C.RTLD_NOLOAD // (since glibc 2.2, also present on Solaris) - - // Place the lookup scope of the symbols in this shared object - // ahead of the global scope. This means that a - // self-contained object will use its own symbols in - // preference to global symbols with the same name contained - // in objects that have already been loaded. - RTLD_DEEPBIND Flag = C.RTLD_DEEPBIND // (since glibc 2.3.4) -) - -// TODO: dlmopen -// TODO: dlvsym -// TODO: dladdr -// - dladdr1 -// TODO: dlinfo -// - RTLD_DI_LMID -// - RTLD_DI_LINKMAP -// - RTLD_DI_ORIGIN -// - RTLD_DI_SERINFO -// - RTLD_DI_SERINFOSIZE -// - RTLD_DI_MODID -// - RTLD_DI_DATA -// TODO: dl_iterate_phdr -// TODO: rtld-audit(7) diff --git a/src/dl/dlfcn.go b/src/dl/dlfcn.go deleted file mode 100644 index e240540..0000000 --- a/src/dl/dlfcn.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2015 Luke Shumaker <lukeshu@sbcglobal.net>. -// -// This 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 of -// the License, or (at your option) any later version. -// -// The GNU General Public License's references to "object code" and -// "executables" are to be interpreted to also include the output of -// any document formatting or typesetting system, including -// intermediate and printed output. -// -// This software 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 this manual; if not, see -// <http://www.gnu.org/licenses/>. - -// Package dl provides an interface to the POSIX runtime linker. -package dl - -import ( - "errors" - "sync" - "unsafe" -) - -//#cgo LDFLAGS: -ldl -//#include <stdlib.h> -//#include <dlfcn.h> -import "C" - -var HandleClosedError = errors.New("Handle is already closed") - -type Flag int - -// POSIX specifies these four flags to Open(). -const ( - // Relocations are performed at an implementation-defined - // time. - RTLD_LAZY Flag = C.RTLD_LAZY - - // Relocations are performed when the object is loaded. - RTLD_NOW Flag = C.RTLD_NOW - - // All symbols are available for relocation processing of - // other modules. - RTLD_GLOBAL Flag = C.RTLD_GLOBAL - - // All symbols are not made available for relocation - // processing by other modules. - RTLD_LOCAL Flag = C.RTLD_LOCAL -) - -type Handle struct { - c unsafe.Pointer - o int -} - -var dllock sync.Mutex - -// Open a shared object file, returning a Handle to it, or an error. -// If name is an empty string, then the returned handle is the global -// symbol table for the current process; if the name contains a slash, -// then it is interpretted as a pathname; otherwise, it is -// interpretted in an implementation-defined manner. -func Open(name string, flags Flag) (Handle, error) { - nameC := C.CString(name) - defer C.free(unsafe.Pointer(nameC)) - if name == "" { - nameC = nil - } - - dllock.Lock() - defer dllock.Unlock() - dlerror() - ptr := C.dlopen(nameC, C.int(flags)) - if ptr == nil { - return Handle{}, dlerror() - } - return Handle{c: ptr, o: 1}, nil -} - -// Look up a symbol, and return a pointer to it. -func (h Handle) Sym(symbol string) (unsafe.Pointer, error) { - dllock.Lock() - defer dllock.Unlock() - - if h.o == 0 { - return nil, HandleClosedError - } - - symbolC := C.CString(symbol) - defer C.free(unsafe.Pointer(symbolC)) - - dlerror() - ptr := C.dlsym(h.c, symbolC) - if ptr == nil { - return nil, dlerror() - } - return ptr, nil -} - -// Close this handle on a shared object; decrementint the reference -// count; if the reference count drops below 0, then the object is -// unloaded. -func (h Handle) Close() error { - dllock.Lock() - defer dllock.Unlock() - - if h.o == 0 { - return HandleClosedError - } - - dlerror() - r := C.dlclose(h.c) - if r != 0 { - return dlerror() - } - if h.o == 1 { - h.o = 0 - } - return nil -} - -func dlerror() error { - strC := C.dlerror() - if strC == nil { - return nil - } - return errors.New(C.GoString(strC)) -} diff --git a/src/dl/dlsym_reserved.go b/src/dl/dlsym_reserved.go deleted file mode 100644 index 081e012..0000000 --- a/src/dl/dlsym_reserved.go +++ /dev/null @@ -1,63 +0,0 @@ -// The documentation for RTLD_DEFAULT and RTLD_NEXT is taken from the -// Linux Programmer's Manual page for dlsym(3). -// -// Copyright 1995 Yggdrasil Computing, Incorporated. -// Copyright 2003, 2015 Michael Kerrisk <mtk.manpages@gmail.com>. -// Copyright 2015 Luke Shumaker <lukeshu@sbcglobal.net>. -// -// This is free documentation; 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 of -// the License, or (at your option) any later version. -// -// The GNU General Public License's references to "object code" -// and "executables" are to be interpreted as the output of any -// document formatting or typesetting system, including -// intermediate and printed output. -// -// This manual 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 this manual; if not, see -// <http://www.gnu.org/licenses/>. - -package dl - -import "unsafe" - -//#define _GNU_SOURCE -//#include <stdint.h> -//#include <dlfcn.h> -//const uintptr_t rtld_next = (uintptr_t)RTLD_NEXT; -//const uintptr_t rtld_default = (uintptr_t)RTLD_DEFAULT; -import "C" - -// These constant values for Handles are reserved by POSIX for future -// use with these meanings. They are available in GNU libdl if -// _GNU_SOURCE is defined. -var ( - // This Handle represents the default default shared object - // search order. The search will include global symbols in - // the executable and its dependencies, as well as symbols in - // shared objects that were dynamically loaded with the - // RTLD_GLOBAL flag. - RTLD_DEFAULT Handle - - // This Handle represents the shared object search order after - // the current object. This allows one to provide a wrapper - // around a function in another shared object, so that, for - // example, the definition of a function in a preloaded shared - // object (see LD_PRELOAD in ld.so(8)) can find and invoke the - // "real" function provided in another shared object (or for - // that matter, the "next" definition of the function in cases - // where there are multiple layers of preloading). - RTLD_NEXT Handle -) - -func init() { - RTLD_DEFAULT = Handle{c: unsafe.Pointer(uintptr(C.rtld_default)), o: 2} - RTLD_DEFAULT = Handle{c: unsafe.Pointer(uintptr(C.rtld_next)), o: 2} -} |