diff options
author | Andy Wingo <wingo@pobox.com> | 2013-08-29 20:43:03 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-08-29 20:44:55 +0200 |
commit | 610295ec9dbf3c21a59b4e579d0889ca90c499e6 (patch) | |
tree | 245b72298916e45f716ee8d76e28b0b5e3d70b32 /module/system/vm/disassembler.scm | |
parent | c96933fd544aaf14776a1fc3a2986afc6fecb00c (diff) | |
download | guile-610295ec9dbf3c21a59b4e579d0889ca90c499e6.tar.gz |
add ability to disassemble ELF images
* module/scripts/disassemble.scm (disassemble): Update to work with
RTl (and only RTL, as that's the future).
* module/system/vm/debug.scm (for-each-elf-symbol): New public
interface.
(debug-context-from-image): New helper.
(find-debug-context): Use the helper.
* module/system/vm/disassembler.scm (disassemble-image): New public
interface.
Diffstat (limited to 'module/system/vm/disassembler.scm')
-rw-r--r-- | module/system/vm/disassembler.scm | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/module/system/vm/disassembler.scm b/module/system/vm/disassembler.scm index 138f267d9..482d68f36 100644 --- a/module/system/vm/disassembler.scm +++ b/module/system/vm/disassembler.scm @@ -31,7 +31,8 @@ #:use-module (ice-9 vlist) #:use-module (srfi srfi-1) #:use-module (srfi srfi-4) - #:export (disassemble-program)) + #:export (disassemble-program + disassemble-image)) (define-syntax-rule (u32-ref buf n) (bytevector-u32-native-ref buf (* n 4))) @@ -334,3 +335,25 @@ address of that offset." (else (format port "Debugging information unavailable.~%"))) (values)) + +(define* (disassemble-image bv #:optional (port (current-output-port))) + (let* ((ctx (debug-context-from-image bv)) + (base (debug-context-text-base ctx))) + (for-each-elf-symbol + ctx + (lambda (sym) + (let ((name (elf-symbol-name sym)) + (value (elf-symbol-value sym)) + (size (elf-symbol-size sym))) + (format port "Disassembly of ~A at #x~X:\n\n" + (if (and (string? name) (not (string-null? name))) + name + "<unnamed function>") + (+ base value)) + (disassemble-buffer port + bv + (/ (+ base value) 4) + (/ (+ base value size) 4) + ctx) + (display "\n\n" port))))) + (values)) |