diff options
Diffstat (limited to 'gnu/packages/debug.scm')
-rw-r--r-- | gnu/packages/debug.scm | 236 |
1 files changed, 170 insertions, 66 deletions
diff --git a/gnu/packages/debug.scm b/gnu/packages/debug.scm index 718a76310d..75dd94d868 100644 --- a/gnu/packages/debug.scm +++ b/gnu/packages/debug.scm @@ -1,6 +1,6 @@ ;;; 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 © 2016, 2017, 2018, 2020 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2018, 2019 Rutger Helling <rhelling@mykolab.com> ;;; Copyright © 2019 Pkill -9 <pkill9@runbox.com> @@ -22,22 +22,29 @@ (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 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 image) + #: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) @@ -47,6 +54,7 @@ #: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)) @@ -96,7 +104,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 @@ -156,7 +164,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) @@ -183,61 +191,7 @@ tools that process C/C++ code.") (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-src (assoc-ref inputs "afl-src")) - (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)))))))))))) + `(("qemu" ,qemu-for-american-fuzzy-lop))) (arguments `(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")) (string-append "DOC_PATH=$(PREFIX)/share/doc/" @@ -267,7 +221,7 @@ 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")) @@ -283,7 +237,157 @@ 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")))) + (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") @@ -346,8 +450,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 @@ -369,7 +473,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 @@ -427,7 +531,7 @@ 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 rr (package @@ -490,4 +594,4 @@ 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 expat))) + (license license:expat))) |