# HG changeset patch # User Michael Pavone # Date 1405355621 25200 # Node ID cba0cb39517a022e1b474a0c5695fd9aca3a0198 # Parent 98147071baf6dadaa99ed7c73df7b8eb86400352 Add module for interfacing with libdl diff -r 98147071baf6 -r cba0cb39517a compile --- 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 diff -r 98147071baf6 -r cba0cb39517a modules/dl.tp --- /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 + } +}