diff options
Diffstat (limited to 'tests/debug-link.scm')
| -rw-r--r-- | tests/debug-link.scm | 187 |
1 files changed, 90 insertions, 97 deletions
diff --git a/tests/debug-link.scm b/tests/debug-link.scm index 7ccc054a5d9..a1ae4f141c0 100644 --- a/tests/debug-link.scm +++ b/tests/debug-link.scm @@ -1,6 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org> -;;; Copyright © 2025 Maxim Cournoyer <maxim@guixotic.coop> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,15 +20,12 @@ #:use-module (guix elf) #:use-module (guix build utils) #:use-module (guix build debug-link) - #:use-module (guix build io) #:use-module (guix gexp) - #:use-module (guix modules) #:use-module (guix store) #:use-module (guix tests) #:use-module (guix monads) #:use-module (guix derivations) #:use-module (gnu packages bootstrap) - #:use-module ((gnu packages guile) #:select (guile-3.0)) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-64) @@ -44,12 +40,15 @@ (_ #f))) +(define read-elf + (compose parse-elf get-bytevector-all)) + (test-begin "debug-link") (unless %guile-executable (test-skip 1)) -(test-assert "elf-debuglink, no .gnu_debuglink section" - (let ((elf (parse-elf (file->bytevector %guile-executable)))) +(test-assert "elf-debuglink" + (let ((elf (call-with-input-file %guile-executable read-elf))) (match (call-with-values (lambda () (elf-debuglink elf)) list) ((#f #f) ;no '.gnu_debuglink' section (pk 'no-debuglink #t)) @@ -57,101 +56,95 @@ (string-suffix? ".debug" file))))) ;; Since we need %BOOTSTRAP-GCC and co., we have to skip the following tests -;; when networking is unreachable because we'd fail to download it. Since -;; using mmap to load ELF more efficiently, we also need the regular Guile -;; package, as guile-bootstrap cannot resolve dynamic symbols. -(with-external-store store - (unless (and (network-reachable?) store) (test-skip 1)) - (test-assertm "elf-debuglink" - ;; Check whether we can compute the CRC just like objcopy, and whether we - ;; can retrieve it. - (let* ((code (plain-file "test.c" "int main () { return 42; }")) - (exp (with-imported-modules (source-module-closure - '((guix build io) - (guix build utils) - (guix build debug-link) - (guix elf))) - #~(begin - (use-modules (guix build io) - (guix build utils) - (guix build debug-link) - (guix elf) - (rnrs io ports)) +;; when networking is unreachable because we'd fail to download it. +(unless (network-reachable?) (test-skip 1)) +(test-assertm "elf-debuglink" + ;; Check whether we can compute the CRC just like objcopy, and whether we + ;; can retrieve it. + (let* ((code (plain-file "test.c" "int main () { return 42; }")) + (exp (with-imported-modules '((guix build utils) + (guix build debug-link) + (guix elf)) + #~(begin + (use-modules (guix build utils) + (guix build debug-link) + (guix elf) + (rnrs io ports)) - (define read-elf - (compose parse-elf file->bytevector)) + (define read-elf + (compose parse-elf get-bytevector-all)) - (setenv "PATH" (string-join '(#$%bootstrap-gcc - #$%bootstrap-binutils) - "/bin:" 'suffix)) - (invoke "gcc" "-O0" "-g" #$code "-o" "exe") - (copy-file "exe" "exe.debug") - (invoke "strip" "--only-keep-debug" "exe.debug") - (invoke "strip" "--strip-debug" "exe") - (invoke "objcopy" "--add-gnu-debuglink=exe.debug" - "exe") - (call-with-values (lambda () - (elf-debuglink (read-elf "exe"))) - (lambda (file crc) - (call-with-output-file #$output - (lambda (port) - (let ((expected (call-with-input-file "exe.debug" - debuglink-crc32))) - (write (list file (= crc expected)) - port)))))))))) - (mlet* %store-monad ((drv (gexp->derivation "debuglink" exp)) - (x (built-derivations (list drv)))) - (call-with-input-file (derivation->output-path drv) - (lambda (port) - (return (match (read port) - (("exe.debug" #t) #t) - (x (pk 'fail x #f))))))))) + (setenv "PATH" (string-join '(#$%bootstrap-gcc + #$%bootstrap-binutils) + "/bin:" 'suffix)) + (invoke "gcc" "-O0" "-g" #$code "-o" "exe") + (copy-file "exe" "exe.debug") + (invoke "strip" "--only-keep-debug" "exe.debug") + (invoke "strip" "--strip-debug" "exe") + (invoke "objcopy" "--add-gnu-debuglink=exe.debug" + "exe") + (call-with-values (lambda () + (elf-debuglink + (call-with-input-file "exe" + read-elf))) + (lambda (file crc) + (call-with-output-file #$output + (lambda (port) + (let ((expected (call-with-input-file "exe.debug" + debuglink-crc32))) + (write (list file (= crc expected)) + port)))))))))) + (mlet* %store-monad ((drv (gexp->derivation "debuglink" exp)) + (x (built-derivations (list drv)))) + (call-with-input-file (derivation->output-path drv) + (lambda (port) + (return (match (read port) + (("exe.debug" #t) #t) + (x (pk 'fail x #f))))))))) - (unless (and (network-reachable?) store) (test-skip 1)) - (test-assertm "set-debuglink-crc" - ;; Check whether 'set-debuglink-crc' successfully updates the CRC. - (let* ((code (plain-file "test.c" "int main () { return 42; }")) - (debug (plain-file "exe.debug" "a")) - (exp (with-imported-modules (source-module-closure - '((guix build io) - (guix build utils) - (guix build debug-link) - (guix elf))) - #~(begin - (use-modules (guix build io) - (guix build utils) - (guix build debug-link) - (guix elf) - (rnrs io ports)) +(unless (network-reachable?) (test-skip 1)) +(test-assertm "set-debuglink-crc" + ;; Check whether 'set-debuglink-crc' successfully updates the CRC. + (let* ((code (plain-file "test.c" "int main () { return 42; }")) + (debug (plain-file "exe.debug" "a")) + (exp (with-imported-modules '((guix build utils) + (guix build debug-link) + (guix elf)) + #~(begin + (use-modules (guix build utils) + (guix build debug-link) + (guix elf) + (rnrs io ports)) - (define read-elf - (compose parse-elf file->bytevector)) + (define read-elf + (compose parse-elf get-bytevector-all)) - (setenv "PATH" (string-join '(#$%bootstrap-gcc - #$%bootstrap-binutils) - "/bin:" 'suffix)) - (invoke "gcc" "-O0" "-g" #$code "-o" "exe") - (copy-file "exe" "exe.debug") - (invoke "strip" "--only-keep-debug" "exe.debug") - (invoke "strip" "--strip-debug" "exe") - (invoke "objcopy" "--add-gnu-debuglink=exe.debug" - "exe") - (set-debuglink-crc "exe" #$debug) - (call-with-values (lambda () - (elf-debuglink - (read-elf "exe"))) - (lambda (file crc) - (call-with-output-file #$output - (lambda (port) - (write (list file crc) port))))))))) - (mlet* %store-monad ((drv (gexp->derivation "debuglink" exp)) - (x (built-derivations (list drv)))) - (call-with-input-file (derivation->output-path drv) - (lambda (port) - (return (match (read port) - (("exe.debug" crc) - (= crc (debuglink-crc32 (open-input-string "a")))) - (x - (pk 'fail x #f)))))))))) + (setenv "PATH" (string-join '(#$%bootstrap-gcc + #$%bootstrap-binutils) + "/bin:" 'suffix)) + (invoke "gcc" "-O0" "-g" #$code "-o" "exe") + (copy-file "exe" "exe.debug") + (invoke "strip" "--only-keep-debug" "exe.debug") + (invoke "strip" "--strip-debug" "exe") + (invoke "objcopy" "--add-gnu-debuglink=exe.debug" + "exe") + (set-debuglink-crc "exe" #$debug) + (call-with-values (lambda () + (elf-debuglink + (call-with-input-file "exe" + read-elf))) + (lambda (file crc) + (call-with-output-file #$output + (lambda (port) + (write (list file crc) port))))))))) + (mlet* %store-monad ((drv (gexp->derivation "debuglink" exp)) + (x (built-derivations (list drv)))) + (call-with-input-file (derivation->output-path drv) + (lambda (port) + (return (match (read port) + (("exe.debug" crc) + (= crc (debuglink-crc32 (open-input-string "a")))) + (x + (pk 'fail x #f))))))))) (test-end "debug-link") |
