changeset 264:cba0cb39517a

Add module for interfacing with libdl
author Michael Pavone <pavone@retrodev.com>
date Mon, 14 Jul 2014 09:33:41 -0700
parents 98147071baf6
children d6a4c9e7716e
files compile modules/dl.tp
diffstat 2 files changed, 66 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/compile	Mon Jul 14 09:30:31 2014 -0700
+++ b/compile	Mon Jul 14 09:33:41 2014 -0700
@@ -16,4 +16,4 @@
 bin=`echo $1 | sed 's/\.tp//'`
 shift
 echo gcc $@ -o $bin $cname runtime/object.c -lgc
-gcc $@ -o $bin $cname runtime/object.c -lgc
+gcc $@ -o $bin $cname runtime/object.c -lgc -ldl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/dl.tp	Mon Jul 14 09:33:41 2014 -0700
@@ -0,0 +1,65 @@
+#{
+	includeSystemHeader: "dlfcn.h"
+
+	llMessage: sym:from withVars: {
+		handle <- obj_uint64 ptr
+		name <- string ptr
+		intret <- obj_uint64 ptr
+	} andCode: :name :handle {
+		intret <- make_object: (addr_of: obj_int64_meta) NULL 0
+		intret num!: (dlsym: (handle num) (name data))
+		intret
+	}
+
+	llMessage: open:withFlags withVars: {
+		name <- string ptr
+		intret <- obj_uint64 ptr
+		flags <- obj_int32 ptr
+	} andCode: :name :flags {
+		intret <- make_object: (addr_of: obj_int64_meta) NULL 0
+		if: (name len) > 0 {
+			intret num!: (dlopen: (name data) (flags num))
+		} else: {
+			intret num!: (dlopen: NULL (flags num))
+		}
+		intret
+	}
+
+	llMessage: LAZY withVars: {
+		flagret <- obj_int32 ptr
+	} andCode: {
+		flagret <- make_object: (addr_of: obj_int64_meta) NULL 0
+		flagret num!: RTLD_LAZY
+		flagret
+	}
+
+	llMessage: NOW withVars: {
+		flagret <- obj_int32 ptr
+	} andCode: {
+		flagret <- make_object: (addr_of: obj_int64_meta) NULL 0
+		flagret num!: RTLD_NOW
+		flagret
+	}
+
+	main <- :args {
+		library <- ""
+		func <- "main"
+		if: (args length) > 2 {
+			library <- args get: 1
+			func <- args get: 2
+		} else: {
+			if: (args length) > 1 {
+				func <- args get: 1
+			}
+		}
+		handle <- open: library withFlags: NOW
+		print: "handle: " . handle . "\n"
+		address <- sym: func from: handle
+		if: (library length) > 0 {
+			print: library . " - " . func . ": " . address . "\n"
+		} else: {
+			print: func . ": " . address . "\n"
+		}
+		0
+	}
+}