comparison modules/dl.tp @ 264:cba0cb39517a

Add module for interfacing with libdl
author Michael Pavone <pavone@retrodev.com>
date Mon, 14 Jul 2014 09:33:41 -0700
parents
children
comparison
equal deleted inserted replaced
263:98147071baf6 264:cba0cb39517a
1 #{
2 includeSystemHeader: "dlfcn.h"
3
4 llMessage: sym:from withVars: {
5 handle <- obj_uint64 ptr
6 name <- string ptr
7 intret <- obj_uint64 ptr
8 } andCode: :name :handle {
9 intret <- make_object: (addr_of: obj_int64_meta) NULL 0
10 intret num!: (dlsym: (handle num) (name data))
11 intret
12 }
13
14 llMessage: open:withFlags withVars: {
15 name <- string ptr
16 intret <- obj_uint64 ptr
17 flags <- obj_int32 ptr
18 } andCode: :name :flags {
19 intret <- make_object: (addr_of: obj_int64_meta) NULL 0
20 if: (name len) > 0 {
21 intret num!: (dlopen: (name data) (flags num))
22 } else: {
23 intret num!: (dlopen: NULL (flags num))
24 }
25 intret
26 }
27
28 llMessage: LAZY withVars: {
29 flagret <- obj_int32 ptr
30 } andCode: {
31 flagret <- make_object: (addr_of: obj_int64_meta) NULL 0
32 flagret num!: RTLD_LAZY
33 flagret
34 }
35
36 llMessage: NOW withVars: {
37 flagret <- obj_int32 ptr
38 } andCode: {
39 flagret <- make_object: (addr_of: obj_int64_meta) NULL 0
40 flagret num!: RTLD_NOW
41 flagret
42 }
43
44 main <- :args {
45 library <- ""
46 func <- "main"
47 if: (args length) > 2 {
48 library <- args get: 1
49 func <- args get: 2
50 } else: {
51 if: (args length) > 1 {
52 func <- args get: 1
53 }
54 }
55 handle <- open: library withFlags: NOW
56 print: "handle: " . handle . "\n"
57 address <- sym: func from: handle
58 if: (library length) > 0 {
59 print: library . " - " . func . ": " . address . "\n"
60 } else: {
61 print: func . ": " . address . "\n"
62 }
63 0
64 }
65 }