Mercurial > repos > tabletprog
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 + } +}