1 ! Copyright (C) 2010 Erik Charlebois.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.data alien.strings
4 alien.syntax arrays assocs classes.struct fry io.encodings.ascii
5 io.mmap kernel locals math math.intervals sequences
6 specialized-arrays strings typed ;
10 CONSTANT: EI_NIDENT 16
17 CONSTANT: EI_VERSION 6
19 CONSTANT: EI_ABIVERSION 8
22 CONSTANT: ELFMAG0 0x7f
23 CONSTANT: ELFMAG1 0x45
24 CONSTANT: ELFMAG2 0x4c
25 CONSTANT: ELFMAG3 0x46
27 CONSTANT: ELFCLASS32 1
28 CONSTANT: ELFCLASS64 2
30 CONSTANT: ELFDATA2LSB 1
31 CONSTANT: ELFDATA2MSB 2
33 CONSTANT: ELFOSABI_SYSV 0
34 CONSTANT: ELFOSABI_HPUX 1
35 CONSTANT: ELFOSABI_NETBSD 2
36 CONSTANT: ELFOSABI_LINUX 3
37 CONSTANT: ELFOSABI_SOLARIS 6
38 CONSTANT: ELFOSABI_AIX 7
39 CONSTANT: ELFOSABI_IRIX 8
40 CONSTANT: ELFOSABI_FREEBSD 9
41 CONSTANT: ELFOSABI_TRU64 10
42 CONSTANT: ELFOSABI_MODESTO 11
43 CONSTANT: ELFOSABI_OPENBSD 12
44 CONSTANT: ELFOSABI_OPENVMS 13
45 CONSTANT: ELFOSABI_NSK 14
46 CONSTANT: ELFOSABI_AROS 15
47 CONSTANT: ELFOSABI_ARM_AEABI 64
48 CONSTANT: ELFOSABI_ARM 97
49 CONSTANT: ELFOSABI_STANDALONE 255
56 CONSTANT: ET_LOOS 0xFE00
57 CONSTANT: ET_HIOS 0xFEFF
58 CONSTANT: ET_LOPROC 0xFF00
59 CONSTANT: ET_HIPROC 0xFFFF
71 CONSTANT: EM_MIPS_RS3_LE 10
72 CONSTANT: EM_SPARC64 11
73 CONSTANT: EM_PARISC 15
74 CONSTANT: EM_VPP500 17
75 CONSTANT: EM_SPARC32PLUS 18
88 CONSTANT: EM_SPARCV9 43
89 CONSTANT: EM_TRICORE 44
91 CONSTANT: EM_H8_300 46
92 CONSTANT: EM_H8_300H 47
94 CONSTANT: EM_H8_500 49
96 CONSTANT: EM_MIPS_X 51
97 CONSTANT: EM_COLDFIRE 52
98 CONSTANT: EM_68HC12 53
103 CONSTANT: EM_STARCORE 58
105 CONSTANT: EM_ST100 60
106 CONSTANT: EM_TINYJ 61
107 CONSTANT: EM_X86_64 62
110 CONSTANT: EM_ST9PLUS 67
112 CONSTANT: EM_68HC16 69
113 CONSTANT: EM_68HC11 70
114 CONSTANT: EM_68HC08 71
115 CONSTANT: EM_68HC05 72
120 CONSTANT: EM_JAVELIN 77
121 CONSTANT: EM_FIREPATH 78
124 CONSTANT: EM_HUANY 81
125 CONSTANT: EM_PRISM 82
132 CONSTANT: EM_MN10300 89
133 CONSTANT: EM_MN10200 90
135 CONSTANT: EM_OPENRISC 92
136 CONSTANT: EM_ARC_A5 93
137 CONSTANT: EM_XTENSA 94
138 CONSTANT: EM_VIDEOCORE 95
139 CONSTANT: EM_TMM_GPP 96
140 CONSTANT: EM_NS32K 97
142 CONSTANT: EM_SNP1K 99
143 CONSTANT: EM_ST200 100
144 CONSTANT: EM_IP2K 101
147 CONSTANT: EM_F2MC16 104
148 CONSTANT: EM_MSP430 105
149 CONSTANT: EM_BLACKFIN 106
150 CONSTANT: EM_SE_C33 107
152 CONSTANT: EM_ARCA 109
153 CONSTANT: EM_UNICORE 110
156 CONSTANT: EV_CURRENT 1
158 CONSTANT: EF_ARM_EABIMASK 0xff000000
159 CONSTANT: EF_ARM_BE8 0x00800000
161 CONSTANT: SHN_UNDEF 0x0000
162 CONSTANT: SHN_LOPROC 0xFF00
163 CONSTANT: SHN_HIPROC 0xFF1F
164 CONSTANT: SHN_LOOS 0xFF20
165 CONSTANT: SHN_HIOS 0xFF3F
166 CONSTANT: SHN_ABS 0xFFF1
167 CONSTANT: SHN_COMMON 0xFFF2
170 CONSTANT: SHT_PROGBITS 1
171 CONSTANT: SHT_SYMTAB 2
172 CONSTANT: SHT_STRTAB 3
175 CONSTANT: SHT_DYNAMIC 6
177 CONSTANT: SHT_NOBITS 8
179 CONSTANT: SHT_SHLIB 10
180 CONSTANT: SHT_DYNSYM 11
181 CONSTANT: SHT_LOOS 0x60000000
182 CONSTANT: SHT_GNU_LIBLIST 0x6ffffff7
183 CONSTANT: SHT_CHECKSUM 0x6ffffff8
184 CONSTANT: SHT_LOSUNW 0x6ffffffa
185 CONSTANT: SHT_SUNW_move 0x6ffffffa
186 CONSTANT: SHT_SUNW_COMDAT 0x6ffffffb
187 CONSTANT: SHT_SUNW_syminfo 0x6ffffffc
188 CONSTANT: SHT_GNU_verdef 0x6ffffffd
189 CONSTANT: SHT_GNU_verneed 0x6ffffffe
190 CONSTANT: SHT_GNU_versym 0x6fffffff
191 CONSTANT: SHT_HISUNW 0x6fffffff
192 CONSTANT: SHT_HIOS 0x6fffffff
193 CONSTANT: SHT_LOPROC 0x70000000
194 CONSTANT: SHT_ARM_EXIDX 0x70000001
195 CONSTANT: SHT_ARM_PREEMPTMAP 0x70000002
196 CONSTANT: SHT_ARM_ATTRIBUTES 0x70000003
197 CONSTANT: SHT_ARM_DEBUGOVERLAY 0x70000004
198 CONSTANT: SHT_ARM_OVERLAYSECTION 0x70000005
199 CONSTANT: SHT_HIPROC 0x7fffffff
200 CONSTANT: SHT_LOUSER 0x80000000
201 CONSTANT: SHT_HIUSER 0x8fffffff
203 CONSTANT: SHF_WRITE 1
204 CONSTANT: SHF_ALLOC 2
205 CONSTANT: SHF_EXECINSTR 4
206 CONSTANT: SHF_MERGE 16
207 CONSTANT: SHF_STRINGS 32
208 CONSTANT: SHF_INFO_LINK 64
209 CONSTANT: SHF_LINK_ORDER 128
210 CONSTANT: SHF_OS_NONCONFORMING 256
211 CONSTANT: SHF_GROUP 512
212 CONSTANT: SHF_TLS 1024
213 CONSTANT: SHF_MASKOS 0x0f000000
214 CONSTANT: SHF_MASKPROC 0xf0000000
216 CONSTANT: STB_LOCAL 0
217 CONSTANT: STB_GLOBAL 1
219 CONSTANT: STB_LOOS 10
220 CONSTANT: STB_HIOS 12
221 CONSTANT: STB_LOPROC 13
222 CONSTANT: STB_HIPROC 15
224 CONSTANT: STT_NOTYPE 0
225 CONSTANT: STT_OBJECT 1
227 CONSTANT: STT_SECTION 3
229 CONSTANT: STT_COMMON 5
231 CONSTANT: STT_LOOS 10
232 CONSTANT: STT_HIOS 12
233 CONSTANT: STT_LOPROC 13
234 CONSTANT: STT_HIPROC 15
236 CONSTANT: STN_UNDEF 0
238 CONSTANT: STV_DEFAULT 0
239 CONSTANT: STV_INTERNAL 1
240 CONSTANT: STV_HIDDEN 2
241 CONSTANT: STV_PROTECTED 3
245 CONSTANT: PT_DYNAMIC 2
246 CONSTANT: PT_INTERP 3
251 CONSTANT: PT_LOOS 0x60000000
252 CONSTANT: PT_HIOS 0x6fffffff
253 CONSTANT: PT_LOPROC 0x70000000
254 CONSTANT: PT_ARM_ARCHEXT 0x70000000
255 CONSTANT: PT_ARM_EXIDX 0x70000001
256 CONSTANT: PT_ARM_UNWIND 0x70000001
257 CONSTANT: PT_HIPROC 0x7fffffff
259 CONSTANT: PT_ARM_ARCHEXT_FMTMSK 0xff000000
260 CONSTANT: PT_ARM_ARCHEXT_PROFMSK 0x00ff0000
261 CONSTANT: PT_ARM_ARCHEXT_ARCHMSK 0x000000ff
262 CONSTANT: PT_ARM_ARCHEXT_FMT_OS 0x00000000
263 CONSTANT: PT_ARM_ARCHEXT_FMT_ABI 0x01000000
264 CONSTANT: PT_ARM_ARCHEXT_PROF_NONE 0x00000000
265 CONSTANT: PT_ARM_ARCHEXT_PROF_ARM 0x00410000
266 CONSTANT: PT_ARM_ARCHEXT_PROF_RT 0x00520000
267 CONSTANT: PT_ARM_ARCHEXT_PROF_MC 0x004d0000
268 CONSTANT: PT_ARM_ARCHEXT_PROF_CLASSIC 0x00530000
270 CONSTANT: PT_ARM_ARCHEXT_ARCH_UNKN 0x00
271 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv4 0x01
272 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv4T 0x02
273 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv5T 0x03
274 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv5TE 0x04
275 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv5TEJ 0x05
276 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6 0x06
277 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6KZ 0x07
278 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6T2 0x08
279 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6K 0x09
280 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv7 0x0A
281 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6M 0x0B
282 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv6SM 0x0C
283 CONSTANT: PT_ARM_ARCHEXT_ARCH_ARCHv7EM 0x0D
288 CONSTANT: PF_MASKOS 0x00ff0000
289 CONSTANT: PF_MASKPROC 0xff000000
292 CONSTANT: DT_NEEDED 1
293 CONSTANT: DT_PLTRELSZ 2
294 CONSTANT: DT_PLTGOT 3
296 CONSTANT: DT_STRTAB 5
297 CONSTANT: DT_SYMTAB 6
299 CONSTANT: DT_RELASZ 8
300 CONSTANT: DT_RELAENT 9
301 CONSTANT: DT_STRSZ 10
302 CONSTANT: DT_SYMENT 11
305 CONSTANT: DT_SONAME 14
306 CONSTANT: DT_RPATH 15
307 CONSTANT: DT_SYMBOLIC 16
309 CONSTANT: DT_RELSZ 18
310 CONSTANT: DT_RELENT 19
311 CONSTANT: DT_PLTREL 20
312 CONSTANT: DT_DEBUG 21
313 CONSTANT: DT_TEXTREL 22
314 CONSTANT: DT_JMPREL 23
315 CONSTANT: DT_BIND_NOW 24
316 CONSTANT: DT_INIT_ARRAY 25
317 CONSTANT: DT_FINI_ARRAY 26
318 CONSTANT: DT_INIT_ARRAYSZ 27
319 CONSTANT: DT_FINI_ARRAYSZ 28
320 CONSTANT: DT_RUNPATH 29
321 CONSTANT: DT_FLAGS 30
322 CONSTANT: DT_ENCODING 32
323 CONSTANT: DT_PREINIT_ARRAY 32
324 CONSTANT: DT_PREINIT_ARRAYSZ 33
325 CONSTANT: DT_LOOS 0x60000000
326 CONSTANT: DT_HIOS 0x6fffffff
327 CONSTANT: DT_LOPROC 0x70000000
328 CONSTANT: DT_ARM_RESERVED1 0x70000000
329 CONSTANT: DT_ARM_SYMTABSZ 0x70000001
330 CONSTANT: DT_ARM_PREEMPTYMAP 0x70000002
331 CONSTANT: DT_ARM_RESERVED2 0x70000003
332 CONSTANT: DT_HIPROC 0x7fffffff
334 TYPEDEF: ushort Elf32_Half
335 TYPEDEF: uint Elf32_Word
336 TYPEDEF: int Elf32_Sword
337 TYPEDEF: uint Elf32_Off
338 TYPEDEF: uint Elf32_Addr
339 TYPEDEF: ushort Elf64_Half
340 TYPEDEF: uint Elf64_Word
341 TYPEDEF: ulonglong Elf64_Xword
342 TYPEDEF: longlong Elf64_Sxword
343 TYPEDEF: ulonglong Elf64_Off
344 TYPEDEF: ulonglong Elf64_Addr
347 { e_ident uchar[16] }
348 { e_type Elf32_Half }
349 { e_machine Elf32_Half }
350 { e_version Elf32_Word }
351 { e_entry Elf32_Addr }
352 { e_phoff Elf32_Off }
353 { e_shoff Elf32_Off }
354 { e_flags Elf32_Word }
355 { e_ehsize Elf32_Half }
356 { e_phentsize Elf32_Half }
357 { e_phnum Elf32_Half }
358 { e_shentsize Elf32_Half }
359 { e_shnum Elf32_Half }
360 { e_shstrndx Elf32_Half } ;
363 { e_ident uchar[16] }
364 { e_type Elf64_Half }
365 { e_machine Elf64_Half }
366 { e_version Elf64_Word }
367 { e_entry Elf64_Addr }
368 { e_phoff Elf64_Off }
369 { e_shoff Elf64_Off }
370 { e_flags Elf64_Word }
371 { e_ehsize Elf64_Half }
372 { e_phentsize Elf64_Half }
373 { e_phnum Elf64_Half }
374 { e_shentsize Elf64_Half }
375 { e_shnum Elf64_Half }
376 { e_shstrndx Elf64_Half } ;
379 { sh_name Elf32_Word }
380 { sh_type Elf32_Word }
381 { sh_flags Elf32_Word }
382 { sh_addr Elf32_Addr }
383 { sh_offset Elf32_Off }
384 { sh_size Elf32_Word }
385 { sh_link Elf32_Word }
386 { sh_info Elf32_Word }
387 { sh_addralign Elf32_Word }
388 { sh_entsize Elf32_Word } ;
391 { sh_name Elf64_Word }
392 { sh_type Elf64_Word }
393 { sh_flags Elf64_Xword }
394 { sh_addr Elf64_Addr }
395 { sh_offset Elf64_Off }
396 { sh_size Elf64_Xword }
397 { sh_link Elf64_Word }
398 { sh_info Elf64_Word }
399 { sh_addralign Elf64_Xword }
400 { sh_entsize Elf64_Xword } ;
403 { st_name Elf32_Word }
404 { st_value Elf32_Addr }
405 { st_size Elf32_Word }
408 { st_shndx Elf32_Half } ;
411 { st_name Elf64_Word }
414 { st_shndx Elf64_Half }
415 { st_value Elf64_Addr }
416 { st_size Elf64_Xword } ;
419 { r_offset Elf32_Addr }
420 { r_info Elf32_Word } ;
423 { r_offset Elf32_Addr }
424 { r_info Elf32_Word }
425 { r_addend Elf32_Sword } ;
428 { r_offset Elf64_Addr }
429 { r_info Elf64_Xword } ;
432 { r_offset Elf64_Addr }
433 { r_info Elf64_Xword }
434 { r_addend Elf64_Sxword } ;
437 { p_type Elf32_Word }
438 { p_offset Elf32_Off }
439 { p_vaddr Elf32_Addr }
440 { p_paddr Elf32_Addr }
441 { p_filesz Elf32_Word }
442 { p_memsz Elf32_Word }
443 { p_flags Elf32_Word }
444 { p_align Elf32_Word } ;
447 { p_type Elf64_Word }
448 { p_flags Elf64_Word }
449 { p_offset Elf64_Off }
450 { p_vaddr Elf64_Addr }
451 { p_paddr Elf64_Addr }
452 { p_filesz Elf64_Xword }
453 { p_memsz Elf64_Xword }
454 { p_align Elf64_Xword } ;
457 { d_tag Elf32_Sword }
458 { d_val Elf32_Word } ;
461 { d_tag Elf64_Sxword }
462 { d_val Elf64_Xword } ;
464 ! Low-level interface
465 SPECIALIZED-ARRAYS: Elf32_Shdr Elf64_Shdr Elf32_Sym Elf64_Sym Elf32_Phdr Elf64_Phdr uchar ;
466 UNION: Elf32/64_Ehdr Elf32_Ehdr Elf64_Ehdr ;
467 UNION: Elf32/64_Shdr Elf32_Shdr Elf64_Shdr ;
468 UNION: Elf32/64_Shdr-array Elf32_Shdr-array Elf64_Shdr-array ;
469 UNION: Elf32/64_Sym Elf32_Sym Elf64_Sym ;
470 UNION: Elf32/64_Sym-array Elf32_Sym-array Elf64_Sym-array ;
471 UNION: Elf32/64_Phdr Elf32_Phdr Elf64_Phdr ;
472 UNION: Elf32/64_Phdr-array Elf32_Phdr-array Elf64_Phdr-array ;
474 TYPED: 64-bit? ( elf: Elf32/64_Ehdr -- ? )
475 e_ident>> EI_CLASS swap nth ELFCLASS64 = ;
477 TYPED: elf-header ( c-ptr -- elf: Elf32/64_Ehdr )
478 dup Elf64_Ehdr memory>struct dup 64-bit?
479 [ nip ] [ drop Elf32_Ehdr memory>struct ] if ;
481 TYPED:: elf-section-headers ( elf: Elf32/64_Ehdr -- headers: Elf32/64_Shdr-array )
482 elf [ e_shoff>> ] [ e_shnum>> ] bi :> ( off num )
483 off elf >c-ptr <displaced-alien> num
484 elf 64-bit? Elf64_Shdr Elf32_Shdr ? <c-direct-array> ;
486 TYPED:: elf-program-headers ( elf: Elf32/64_Ehdr -- headers: Elf32/64_Phdr-array )
487 elf [ e_phoff>> ] [ e_phnum>> ] bi :> ( off num )
488 off elf >c-ptr <displaced-alien> num
489 elf 64-bit? Elf64_Phdr Elf32_Phdr ? <c-direct-array> ;
491 TYPED: elf-loadable-segments ( headers: Elf32/64_Phdr-array -- headers: Elf32/64_Phdr-array )
492 [ p_type>> PT_LOAD = ] filter ;
494 TYPED:: elf-segment-sections ( segment: Elf32/64_Phdr sections: Elf32/64_Shdr-array -- sections )
495 segment [ p_offset>> dup ] [ p_filesz>> + ] bi [a,b) :> segment-interval
496 sections [ dup [ sh_offset>> dup ] [ sh_size>> + ] bi [a,b) 2array ] { } map-as :> section-intervals
497 section-intervals [ second segment-interval interval-intersect empty-interval = not ]
500 TYPED:: virtual-address-segment ( elf: Elf32/64_Ehdr address -- program-header/f )
501 elf elf-program-headers elf-loadable-segments [
502 [ p_vaddr>> dup ] [ p_memsz>> + ] bi [a,b)
503 address swap interval-contains?
506 TYPED:: virtual-address-section ( elf: Elf32/64_Ehdr address -- section-header/f )
507 elf address virtual-address-segment :> segment
508 segment elf elf-section-headers elf-segment-sections :> sections
509 address segment p_vaddr>> - segment p_offset>> + :> faddress
511 [ sh_offset>> dup ] [ sh_size>> + ] bi [a,b)
512 faddress swap interval-contains?
515 TYPED:: elf-segment-data ( elf: Elf32/64_Ehdr header: Elf32/64_Phdr -- uchar-array/f )
516 header p_offset>> elf >c-ptr <displaced-alien>
517 header p_filesz>> uchar <c-direct-array> ;
519 TYPED:: elf-section-data ( elf: Elf32/64_Ehdr header: Elf32/64_Shdr -- uchar-array/f )
520 header sh_offset>> elf >c-ptr <displaced-alien>
521 header sh_size>> uchar <c-direct-array> ;
523 TYPED:: elf-section-data-by-index ( elf: Elf32/64_Ehdr index -- header/f uchar-array/f )
524 elf elf-section-headers :> sections
525 index sections nth :> header
526 elf header elf-section-data :> data
529 TYPED:: elf-section-name ( elf: Elf32/64_Ehdr header: Elf32/64_Shdr -- name: string )
530 elf elf e_shstrndx>> elf-section-data-by-index nip >c-ptr :> section-names
531 header sh_name>> section-names <displaced-alien> ascii alien>string ;
533 TYPED:: elf-section-data-by-name ( elf: Elf32/64_Ehdr name: string -- header/f uchar-array/f )
534 elf elf-section-headers :> sections
535 elf e_shstrndx>> :> ndx
536 elf ndx sections nth elf-section-data >c-ptr :> section-names
538 sh_name>> section-names <displaced-alien> ascii alien>string name =
540 [ dup elf swap elf-section-data ] [ f f ] if* ;
542 TYPED:: elf-sections ( elf: Elf32/64_Ehdr -- sections )
543 elf elf-section-headers :> sections
544 elf elf e_shstrndx>> elf-section-data-by-index nip >c-ptr :> section-names
547 sh_name>> section-names <displaced-alien> ascii alien>string
551 TYPED:: elf-symbols ( elf: Elf32/64_Ehdr section-data: uchar-array -- symbols )
552 elf ".strtab" elf-section-data-by-name nip >c-ptr :> strings
553 section-data [ >c-ptr ] [ length ] bi
555 [ Elf64_Sym heap-size / Elf64_Sym <c-direct-array> ]
556 [ Elf32_Sym heap-size / Elf32_Sym <c-direct-array> ] if
559 st_name>> strings <displaced-alien> ascii alien>string
563 ! High level interface
564 TUPLE: elf elf-header ;
565 TUPLE: section name elf-header section-header data ;
566 TUPLE: segment elf-header program-header data ;
567 TUPLE: symbol name elf-header sym data ;
569 GENERIC: sections ( obj -- sections )
571 : <elf> ( c-ptr -- elf )
574 M:: elf sections ( elf -- sections )
575 elf elf-header>> :> elf-header
577 elf-header elf-sections
579 elf-header header elf-section-data :> data
580 name elf-header header data section boa
583 :: segments ( elf -- segments )
584 elf elf-header>> :> elf-header
586 elf-header elf-program-headers
588 elf-header header elf-segment-data :> data
589 elf-header header data segment boa
592 M:: segment sections ( segment -- sections )
593 segment program-header>> :> program-header
594 segment elf-header>> :> elf-header
596 program-header elf-header
600 elf-header header elf-section-name :> name
601 elf-header header elf-section-data :> data
602 name elf-header header data section boa
605 :: symbols ( section -- symbols )
606 section elf-header>> :> elf-header
607 section data>> :> data
609 elf-header data elf-symbols
611 name elf-header sym f symbol boa
614 :: symbol-data ( symbol -- data )
615 symbol [ elf-header>> ] [ sym>> st_value>> ] bi virtual-address-segment :> segment
616 symbol sym>> st_value>> segment p_vaddr>> - segment p_offset>> + :> faddress
617 faddress symbol elf-header>> >c-ptr <displaced-alien>
618 symbol sym>> st_size>> uchar <c-direct-array> ;
620 : find-section ( sections name -- section/f )
621 '[ name>> _ = ] find nip ; inline
623 : find-symbol ( symbols name -- symbol/f )
624 '[ name>> _ = ] find nip ; inline
626 : find-section-symbol ( sections section symbol -- symbol/f )
627 [ find-section ] dip over [
628 [ symbols ] dip find-symbol
631 : with-mapped-elf ( path quot -- )
632 '[ address>> <elf> @ ] with-mapped-file-reader ; inline