gnu: qemu-for-american-fuzzy-lop: Fix build.
[jackhill/guix/guix.git] / gnu / packages / debug.scm
index 82a57d4..f67f32a 100644 (file)
@@ -1,9 +1,12 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016, 2017, 2019 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2014, 2015, 2016, 2017, 2019, 2020 Eric Bavier <bavier@posteo.net>
+;;; Copyright © 2016, 2017, 2018, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2019 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2019 Pkill -9 <pkill9@runbox.com>
+;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
+;;; Copyright © 2020 Morgan Smith <Morgan.J.Smith@outlook.com>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
 
 (define-module (gnu packages debug)
   #:use-module (guix packages)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system cmake)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages attr)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
+  #:use-module (gnu packages bison)
+  #:use-module (gnu packages c)
+  #:use-module (gnu packages code)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages flex)
+  #:use-module (gnu packages gdb)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages golang)
-  #:use-module (gnu packages code)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages libusb)
+  #:use-module (gnu packages linux)
   #:use-module (gnu packages llvm)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages ninja)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages readline)
+  #:use-module (gnu packages serialization)
   #:use-module (gnu packages virtualization)
+  #:use-module (gnu packages xdisorg)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1))
 
@@ -90,7 +109,7 @@ isolate a small failure-inducing substring of a large input that causes your
 program to exhibit a bug.")
     ;; See License.txt, which is a bsd-3 license, despite the project's
     ;; home-page pointing to a bsd-2 license.
-    (license bsd-3)))
+    (license license:bsd-3)))
 
 (define-public c-reduce
   (package
@@ -105,11 +124,11 @@ program to exhibit a bug.")
       (sha256
        (base32 "0qx0zq8jxzx2as2zf0740g7kvgq163ayn3041di4vwk77490y76v"))))
     (build-system gnu-build-system)
+    (native-inputs `(("flex" ,flex)))
     (inputs
      `(("astyle"          ,astyle)
        ("llvm"            ,llvm)
        ("clang"           ,clang)
-       ("flex"            ,flex)
        ("indent"          ,indent)
        ("perl"            ,perl)
        ("exporter-lite"   ,perl-exporter-lite)
@@ -150,7 +169,7 @@ property of interest (such as triggering a compiler bug) and automatically
 produces a much smaller C/C++ program that has the same property.  It is
 intended for use by people who discover and report bugs in compilers and other
 tools that process C/C++ code.")
-    (license ncsa)))
+    (license license:ncsa)))
 
 (define-public american-fuzzy-lop
   (let ((machine (match (or (%current-target-system)
@@ -165,67 +184,29 @@ tools that process C/C++ code.")
                    (_                "UNSUPPORTED"))))
     (package
       (name "american-fuzzy-lop")
-      (version "2.52b")             ;It seems all releases have the 'b' suffix
+      (version "2.56b")             ;It seems all releases have the 'b' suffix
       (source
        (origin
-         (method url-fetch)
-         (uri (string-append "http://lcamtuf.coredump.cx/afl/releases/"
-                             "afl-" version ".tgz"))
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/google/AFL")
+               (commit (string-append "v" version))))
          (sha256
-          (base32
-           "0ig0ij4n1pwry5dw1hk4q88801jzzy2cric6y2gd6560j55lnqa3"))))
+          (base32 "1q1g59gkm48aa4cg9h70jx4i2gapmypgp5rzs156b2avd95vwkn1"))
+         (file-name (git-file-name name version))))
       (build-system gnu-build-system)
       (inputs
-       `(("custom-qemu"
-          ;; The afl-qemu tool builds qemu 2.10.0 with a few patches applied.
-          ,(package (inherit qemu-minimal-2.10)
-             (name "afl-qemu")
-             (inputs
-              `(("afl-src" ,source)
-                ,@(package-inputs qemu-minimal)))
-             ;; afl only supports using a single afl-qemu-trace executable, so
-             ;; we only build qemu for the native target.
-             (arguments
-              `(#:modules ((srfi srfi-1)
-                           ,@%gnu-build-system-modules)
-                ,@(substitute-keyword-arguments (package-arguments qemu-minimal)
-                    ((#:configure-flags config-flags)
-                     ``(,(string-append "--target-list=" ,machine "-linux-user")
-                        ,@(remove (λ (f) (string-prefix? "--target-list=" f))
-                                  ,config-flags)))
-                    ((#:phases qemu-phases)
-                     `(modify-phases ,qemu-phases
-                        (add-after
-                         'unpack 'apply-afl-patches
-                         (lambda* (#:key inputs #:allow-other-keys)
-                           (let* ((afl-dir (string-append "afl-" ,version))
-                                  (patch-dir
-                                   (string-append afl-dir
-                                                  "/qemu_mode/patches")))
-                             (invoke "tar" "xf"
-                                     (assoc-ref inputs "afl-src"))
-                             (install-file (string-append patch-dir
-                                                          "/afl-qemu-cpu-inl.h")
-                                           ".")
-                             (copy-file (string-append afl-dir "/config.h")
-                                        "./afl-config.h")
-                             (install-file (string-append afl-dir "/types.h")
-                                           ".")
-                             (substitute* "afl-qemu-cpu-inl.h"
-                               (("\\.\\./\\.\\./config.h") "afl-config.h"))
-                             (substitute* (string-append patch-dir
-                                                         "/cpu-exec.diff")
-                               (("\\.\\./patches/") ""))
-                             (for-each (lambda (patch-file)
-                                         (invoke "patch" "--force" "-p1"
-                                                 "--input" patch-file))
-                                       (find-files patch-dir
-                                                   "\\.diff$"))
-                             #t))))))))))))
+       `(("qemu" ,qemu-for-american-fuzzy-lop)))
       (arguments
        `(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
+                            (string-append "DOC_PATH=$(PREFIX)/share/doc/"
+                                           ,name "-" ,version)
                             "CC=gcc")
          #:phases (modify-phases %standard-phases
+                    (add-after 'unpack 'make-git-checkout-writable
+                      (lambda _
+                        (for-each make-file-writable (find-files "."))
+                        #t))
                     (delete 'configure)
                     ,@(if (string=? (%current-system) (or "x86_64-linux"
                                                           "i686-linux"))
@@ -245,13 +226,13 @@ tools that process C/C++ code.")
                      ;; TODO: Build and install the afl-llvm tool.
                      'install 'install-qemu
                      (lambda* (#:key inputs outputs #:allow-other-keys)
-                       (let ((qemu (assoc-ref inputs "custom-qemu"))
+                       (let ((qemu (assoc-ref inputs "qemu"))
                              (out  (assoc-ref outputs "out")))
                          (symlink (string-append qemu "/bin/qemu-" ,machine)
                                   (string-append out "/bin/afl-qemu-trace"))
                          #t)))
-                    (delete 'check)))) ; Tests are run during 'install phase.
-      (home-page "http://lcamtuf.coredump.cx/afl")
+                    (delete 'check)))) ; tests are run during 'install phase
+      (home-page "https://lcamtuf.coredump.cx/afl/")
       (synopsis "Security-oriented fuzzer")
       (description
        "American fuzzy lop is a security-oriented fuzzer that employs a novel
@@ -261,11 +242,162 @@ targeted binary.  This substantially improves the functional coverage for the
 fuzzed code.  The compact synthesized corpora produced by the tool are also
 useful for seeding other, more labor- or resource-intensive testing regimes
 down the road.")
-      (license asl2.0))))
+      (license license:asl2.0))))
+
+(define-public qemu-for-american-fuzzy-lop
+  ;; afl only supports using a single afl-qemu-trace executable, so
+  ;; we only build qemu for the native target.
+  (let ((machine (match (or (%current-target-system)
+                            (%current-system))
+                   ("x86_64-linux"   "x86_64")
+                   ("i686-linux"     "i386")
+                   ("aarch64-linux"  "aarch64")
+                   ("armhf-linux"    "arm")
+                   ("mips64el-linux" "mips64el")
+                   ;; Prevent errors when querying this package on unsupported
+                   ;; platforms, e.g. when running "guix package --search="
+                   (_                "UNSUPPORTED"))))
+  (hidden-package
+   (package
+    (name "qemu")
+    (version "2.10.2")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "https://download.qemu.org/qemu-"
+                                 version ".tar.xz"))
+             (sha256
+              (base32
+               "17w21spvaxaidi2am5lpsln8yjpyp2zi3s3gc6nsxj5arlgamzgw"))
+             (patches
+              (search-patches "qemu-glibc-2.27.patch"
+                              "qemu-glibc-2.30.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(;; Running tests in parallel can occasionally lead to failures, like:
+       ;; boot_sector_test: assertion failed (signature == SIGNATURE): (0x00000000 == 0x0000dead)
+       #:parallel-tests? #f
+       #:configure-flags
+       (list (string-append "--target-list=" ,machine "-linux-user"))
+       #:make-flags '("V=1")
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key inputs outputs (configure-flags '())
+                           #:allow-other-keys)
+             ;; The `configure' script doesn't understand some of the
+             ;; GNU options.  Thus, add a new phase that's compatible.
+             (let ((out (assoc-ref outputs "out")))
+               (setenv "SHELL" (which "bash"))
+
+               ;; While we're at it, patch for tests.
+               (substitute* "tests/libqtest.c"
+                 (("/bin/sh") (which "sh")))
+
+               ;; The binaries need to be linked against -lrt.
+               (setenv "LDFLAGS" "-lrt")
+               (apply invoke
+                      `("./configure"
+                        ,(string-append "--cc=" (which "gcc"))
+                        ;; Some architectures insist on using HOST_CC
+                        ,(string-append "--host-cc=" (which "gcc"))
+                        "--disable-debug-info" ; save build space
+                        "--enable-virtfs"      ; just to be sure
+                        ,(string-append "--prefix=" out)
+                        ,(string-append "--sysconfdir=/etc")
+                        ,@configure-flags)))))
+         (add-after
+          'unpack 'apply-afl-patches
+          (lambda* (#:key inputs #:allow-other-keys)
+            (let* ((afl-src (assoc-ref inputs "afl-source"))
+                   (patch-dir "qemu_mode/patches"))
+              (copy-recursively (string-append afl-src "/"
+                                               patch-dir)
+                                patch-dir)
+              (install-file
+               (string-append patch-dir
+                              "/afl-qemu-cpu-inl.h")
+               ".")
+              (copy-file (string-append afl-src "/config.h")
+                         "./afl-config.h")
+              (install-file (string-append afl-src "/types.h")
+                            ".")
+              (substitute* "afl-qemu-cpu-inl.h"
+                (("\\.\\./\\.\\./config.h") "afl-config.h"))
+              (substitute* (string-append patch-dir
+                                          "/cpu-exec.diff")
+                (("\\.\\./patches/") ""))
+
+              ;; These were already applied to qemu-minimal-2.10.
+              (for-each (lambda (obsolete-patch)
+                          (delete-file (string-append
+                                        patch-dir "/"
+                                        obsolete-patch)))
+                        (list "configure.diff"
+                              "memfd.diff"))
+
+              (for-each (lambda (patch-file)
+                          (invoke "patch" "--force" "-p1"
+                                  "--input" patch-file))
+                        (find-files patch-dir
+                                    "\\.diff$"))
+              #t)))
+         (add-before 'check 'disable-unusable-tests
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (substitute* "tests/Makefile.include"
+               ;; Comment out the test-qga test, which needs /sys and
+               ;; fails within the build environment.
+               (("check-unit-.* tests/test-qga" all)
+                (string-append "# " all)))
+             (substitute* "tests/Makefile.include"
+               ;; Comment out the test-char test, which needs networking and
+               ;; fails within the build environment.
+               (("check-unit-.* tests/test-char" all)
+                (string-append "# " all)))
+             #t)))))
+    (native-inputs
+     `(("python-2" ,python-2) ; QEMU 2 needs Python 2
+       ("glib:bin" ,glib "bin")
+       ("perl" ,perl)
+       ("flex" ,flex)
+       ("bison" ,bison)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("afl-source" ,(package-source american-fuzzy-lop))
+       ("alsa-lib" ,alsa-lib)
+       ("attr" ,attr)
+       ("glib" ,glib)
+       ("libaio" ,libaio)
+       ("libattr" ,attr)
+       ("libcap" ,libcap)
+       ("libjpeg" ,libjpeg-turbo)
+       ("libpng" ,libpng)
+       ("ncurses" ,ncurses)
+       ("pixman" ,pixman)
+       ("util-linux" ,util-linux)
+       ("zlib" ,zlib)))
+    (home-page "https://www.qemu.org")
+    (synopsis "Machine emulator and virtualizer (without GUI) for american fuzzy lop")
+    (description
+     "QEMU is a generic machine emulator and virtualizer.  This package
+of QEMU is used only by the american fuzzy lop package.
+
+When used as a machine emulator, QEMU can run OSes and programs made for one
+machine (e.g. an ARM board) on a different machine---e.g., your own PC.  By
+using dynamic translation, it achieves very good performance.
+
+When used as a virtualizer, QEMU achieves near native performances by
+executing the guest code directly on the host CPU.  QEMU supports
+virtualization when executing under the Xen hypervisor or using
+the KVM kernel module in Linux.  When using KVM, QEMU can virtualize x86,
+server and embedded PowerPC, and S390 guests.")
+    ;; Many files are GPLv2+, but some are GPLv2-only---e.g., `memory.c'.
+    (license license:gpl2)
+    ;; Several tests fail on MIPS.
+    (supported-systems (delete "mips64el-linux" %supported-systems))))))
 
 (define-public stress-make
-  (let ((commit "9e92dff8f0157f012aaf31de5b8b8112ad720100")
-        (revision "1"))                 ;No official source distribution
+  (let ((commit "97815bed8060de33952475b3498767c91f59ffd9")
+        (revision "2"))                 ;No official source distribution
     (package
       (name "stress-make")
       (version (git-version "1.0" revision commit))
@@ -273,12 +405,12 @@ down the road.")
        (origin
          (method git-fetch)
          (uri (git-reference
-               (url "https://github.com/lanl/stress-make.git")
+               (url "https://github.com/lanl/stress-make")
                (commit commit)))
          (file-name (git-file-name name version))
          (sha256
           (base32
-           "1z1yiwnqyzv3v6152fnjbfh2lr8q8fi5xxfdclnr8l8sd4c1rasp"))))
+           "0k55cy7x0hlc6rgpascl6ibhcfxaash3p9r9r8kwvbm3zag1rmac"))))
       (build-system gnu-build-system)
       (native-inputs
        `(("autoconf" ,autoconf)
@@ -302,7 +434,7 @@ down the road.")
              (add-after 'unpack-make 'set-default-shell
                (lambda _
                  ;; Taken mostly directly from (@ (gnu packages base) gnu-make)
-                 (substitute* (string-append ,make-dir "/job.c")
+                 (substitute* (string-append ,make-dir "/src/job.c")
                    (("default_shell = .*$")
                     (format #f "default_shell = \"~a\";\n"
                             (which "sh"))))))
@@ -324,8 +456,8 @@ Stress Make, then it is likely that the @code{Makefile} contains no race
 conditions.")
       ;; stress-make wrapper is under BSD-3-modifications-must-be-indicated,
       ;; and patched GNU Make is under its own license.
-      (license (list (non-copyleft "LICENSE.md")
-                     gpl3+)))))
+      (license (list (license:non-copyleft "LICENSE.md")
+                     license:gpl3+)))))
 
 (define-public zzuf
   (package
@@ -347,7 +479,7 @@ conditions.")
     (description "Zzuf is a transparent application input fuzzer.  It works by
 intercepting file operations and changing random bits in the program's
 input.  Zzuf's behaviour is deterministic, making it easy to reproduce bugs.")
-    (license (non-copyleft "http://www.wtfpl.net/txt/copying/"))))
+    (license license:wtfpl2)))
 
 (define-public scanmem
   (package
@@ -405,4 +537,199 @@ several different times.  After several scans of the process, scanmem isolates
 the position of the variable and allows you to modify its value.")
     ;; The library is covered by LGPLv3 or later; the application is covered
     ;; by GPLv3 or later.
-    (license (list lgpl3+ gpl3+))))
+    (license (list license:lgpl3+ license:gpl3+))))
+
+(define-public remake
+  (package (inherit gnu-make)
+    (name "remake")
+    (version "4.3-1.5")
+    (source (origin
+              (method url-fetch)
+              (uri (let ((upstream-version
+                          (match (string-split version #\-)
+                            ((ver sub) (string-append ver "%2Bdbg-" sub)))))
+                     (string-append "mirror://sourceforge/bashdb/"
+                                    "remake/" upstream-version "/"
+                                    "remake-" upstream-version ".tar.gz")))
+              (file-name (string-append "remake-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0xlx2485y0israv2pfghmv74lxcv9i5y65agy69mif76yc4vfvif"))
+              (patches (search-patches "remake-impure-dirs.patch"))))
+    (inputs
+     `(("readline" ,readline)
+       ,@(package-inputs gnu-make)))
+    (home-page "http://bashdb.sourceforge.net/remake/")
+    (description "Remake is an enhanced version of GNU Make that adds improved
+error reporting, better tracing, profiling, and a debugger.")
+    (license license:gpl3+)))
+
+(define-public rr
+  (package
+    (name "rr")
+    (version "5.4.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/mozilla/rr")
+                    (commit version)))
+              (sha256
+               (base32
+                "1sfldgkkmsdyaqa28i5agcykc63gwm3zjihd64g86i852w8al2w6"))
+              (file-name (git-file-name name version))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:configure-flags
+       ;; The 'rr_exec_stub' is a static binary, which leads CMake to fail
+       ;; with ‘file RPATH_CHANGE could not write new RPATH: ...’.
+       ;; Clear CMAKE_INSTALL_RPATH to avoid that problem.
+       (list "-DCMAKE_INSTALL_RPATH="
+             ;; Satisfy the ‘validate-runpath’ phase.  This isn't a direct
+             ;; consequence of clearing CMAKE_INSTALL_RPATH.
+             (string-append "-DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath="
+                            (assoc-ref %build-inputs "capnproto") "/lib")
+             ,@(if (and (not (%current-target-system))
+                        (member (%current-system)
+                                '("x86_64-linux" "aarch64-linux")))
+                   ;; The toolchain doesn't support '-m32'.
+                   '("-Ddisable32bit=ON")
+                   '()))
+
+       ;; XXX: Most tests fail with:
+       ;;
+       ;;  rr needs /proc/sys/kernel/perf_event_paranoid <= 1, but it is 2.
+       ;;
+       ;; This setting cannot be changed from the build environment, so skip
+       ;; the tests.
+       #:tests? #f
+
+       #:phases (modify-phases %standard-phases
+                  (add-before 'check 'set-home
+                    (lambda _
+                      ;; Some tests expect 'HOME' to be set.
+                      (setenv "HOME" (getcwd))
+                      #t)))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("ninja" ,ninja)
+       ("which" ,which)))
+    (inputs
+     `(("gdb" ,gdb)
+       ("capnproto" ,capnproto)
+       ("python" ,python)
+       ("python-pexpect" ,python-pexpect)))
+    (home-page "https://rr-project.org/")
+    (synopsis "Record and reply debugging framework")
+    (description
+     "rr is a lightweight tool for recording, replaying and debugging
+execution of applications (trees of processes and threads).  Debugging extends
+GDB with very efficient reverse-execution, which in combination with standard
+GDB/x86 features like hardware data watchpoints, makes debugging much more
+fun.")
+    (license license:expat)))
+
+(define-public libbacktrace
+  ;; There are no releases nor tags.
+  (let ((revision "1")
+        (commit "5009c113981431ae1843ebd29d6ad24eb32fc1b2"))
+    (package
+      (name "libbacktrace")
+      (version (git-version "1.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/ianlancetaylor/libbacktrace")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0663zjpfpnsyv9h3pbp7cgmg9gz79n68bqpdl97y6i0jsx93v1zg"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:make-flags '("CFLAGS=-fPIC")))
+      (home-page "https://github.com/ianlancetaylor/libbacktrace")
+      (synopsis "C library for producing symbolic backtraces")
+      (description "The @code{libbacktrace} library can be linked into a C/C++
+program to produce symbolic backtraces.")
+      (license license:bsd-3))))
+
+(define-public libleak
+  (package
+    (name "libleak")
+    (version "0.3.5")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/WuBingzheng/libleak")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1p8mb0hcfp8hdv1klv6rrpkn2zlhjxgkxbbjsk8kszxv7ijln87d"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                      ;no test suite
+       #:parallel-build? #f             ;jobserver unavailable
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'unbundle-libwuya
+                    (lambda _
+                      (substitute* "Makefile"
+                        ((".*make -C libwuya.*") ""))
+                      #t))
+                  (add-before 'build 'set-CC
+                    (lambda _
+                      (setenv "CC" "gcc")
+                      #t))
+                  (delete 'configure)   ;no configure script
+                  (replace 'install
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let* ((out (assoc-ref outputs "out")))
+                        (install-file "libleak.so" (string-append out "/lib"))
+                        #t))))))
+    (inputs `(("libbacktrace" ,libbacktrace)
+              ("libwuya" ,libwuya)))
+    (home-page "https://github.com/WuBingzheng/libleak")
+    (synopsis "Memory leaks detection tool")
+    (description "The libleak tool detects memory leaks by hooking memory
+functions such as @code{malloc}.  It comes as a shared object to be pre-loaded
+via @code{LD_PRELOAD} when launching the application.  It prints the full call
+stack at suspicious memory leak points.  Modifying or recompiling the target
+program is not required, and the detection can be enabled or disabled while
+the target application is running.  The overhead incurred by libleak is
+smaller than that of other tools such as Valgrind, and it aims to be easier to
+use than similar tools like @command{mtrace}.")
+    (license license:gpl2+)))
+
+(define-public mspdebug
+  (package
+    (name "mspdebug")
+    (version "0.25")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/dlbeer/mspdebug")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32 "0prgwb5vx6fd4bj12ss1bbb6axj2kjyriyjxqrzd58s5jyyy8d3c"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                         ; no test suite
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))              ; no configure script
+       #:make-flags
+       (list (string-append "CC=" ,(cc-for-target))
+             "INSTALL=install"
+             (string-append "PREFIX=" %output))))
+  (inputs
+     `(("libusb-compat" ,libusb-compat)
+       ("readline" ,readline)))
+    (synopsis "Debugging tool for MSP430 MCUs")
+    (description "MspDebug supports FET430UIF, eZ430, RF2500 and Olimex
+MSP430-JTAG-TINY programmers, as well as many other compatible
+devices.  It can be used as a proxy for gdb or as an independent
+debugger with support for programming, disassembly and reverse
+engineering.")
+    (home-page "https://github.com/dlbeer/mspdebug")
+    (license license:gpl2+)))