From 0253ab39794ce5d9cf051ac70c632c378a732d8e Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 22 Nov 2014 12:24:41 +0100 Subject: gnu: file: Update to 5.20. * gnu/packages/file.scm (file): Update to 5.20. (file-5.20): Remove. * gnu/packages/patches/file-CVE-2014-3587.patch: Remove. * gnu-system.am (dist_patch_DATA): Adjust accordingly. * gnu/packages/patchutils.scm (quilt): Use FILE instead of FILE-5.20. * gnu/packages/version-control.scm (aegis): Ditto. --- gnu-system.am | 1 - 1 file changed, 1 deletion(-) (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index d3b822c169..246f52a12e 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -340,7 +340,6 @@ dist_patch_DATA = \ gnu/packages/patches/duplicity-piped-password.patch \ gnu/packages/patches/duplicity-test_selection-tmp.patch \ gnu/packages/patches/eudev-rules-directory.patch \ - gnu/packages/patches/file-CVE-2014-3587.patch \ gnu/packages/patches/findutils-absolute-paths.patch \ gnu/packages/patches/flashrom-use-libftdi1.patch \ gnu/packages/patches/flex-bison-tests.patch \ -- cgit v1.2.3 From 0d12bc744ee4fa7860b16a555d73dfc6f463ba57 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 27 Dec 2014 00:17:43 +0100 Subject: gnu: gcc-4.8: Update to 4.8.4. * gnu/packages/gcc.scm (gcc-4.8): Update to 4.8.4. Remove patch. * gnu/packages/patches/gcc-fix-pr61801.patch: Remove. * gnu-system.am (dist_patch_DATA): Adjust accordingly. --- gnu-system.am | 1 - gnu/packages/gcc.scm | 5 ++--- gnu/packages/patches/gcc-fix-pr61801.patch | 25 ------------------------- 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 gnu/packages/patches/gcc-fix-pr61801.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 0e912f280e..09d09caaee 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -356,7 +356,6 @@ dist_patch_DATA = \ gnu/packages/patches/flex-bison-tests.patch \ gnu/packages/patches/gawk-shell.patch \ gnu/packages/patches/gcc-cross-environment-variables.patch \ - gnu/packages/patches/gcc-fix-pr61801.patch \ gnu/packages/patches/gd-mips64-deplibs-fix.patch \ gnu/packages/patches/glib-tests-desktop.patch \ gnu/packages/patches/glib-tests-homedir.patch \ diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm index 6dfdcea131..4b715f495e 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -261,15 +261,14 @@ (define-public gcc-4.7 (define-public gcc-4.8 (package (inherit gcc-4.7) - (version "4.8.3") + (version "4.8.4") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/gcc/gcc-" version "/gcc-" version ".tar.bz2")) (sha256 (base32 - "07hg10zs7gnqz58my10ch0zygizqh0z0bz6pv4pgxx45n48lz3ka")) - (patches (list (search-patch "gcc-fix-pr61801.patch"))))))) + "15c6gwm6dzsaagamxkak5smdkf1rdfbqqjs9jdbrp3lbg4ism02a")))))) (define-public gcc-4.9 (package (inherit gcc-4.7) diff --git a/gnu/packages/patches/gcc-fix-pr61801.patch b/gnu/packages/patches/gcc-fix-pr61801.patch deleted file mode 100644 index e9cd92aa1c..0000000000 --- a/gnu/packages/patches/gcc-fix-pr61801.patch +++ /dev/null @@ -1,25 +0,0 @@ -GCC bug fix for . -Initially discussed at - . -Patch from . - -2014-07-17 Richard Biener - - PR rtl-optimization/61801 - - * sched-deps.c (sched_analyze_2): For ASM_OPERANDS and - ASM_INPUT don't set reg_pending_barrier if it appears in a - debug-insn. - ---- gcc-4_8-branch/gcc/sched-deps.c 2014/07/17 07:48:49 212739 -+++ gcc-4_8-branch/gcc/sched-deps.c 2014/07/17 07:49:44 212740 -@@ -2744,7 +2744,8 @@ - Consider for instance a volatile asm that changes the fpu rounding - mode. An insn should not be moved across this even if it only uses - pseudo-regs because it might give an incorrectly rounded result. */ -- if (code != ASM_OPERANDS || MEM_VOLATILE_P (x)) -+ if ((code != ASM_OPERANDS || MEM_VOLATILE_P (x)) -+ && !DEBUG_INSN_P (insn)) - reg_pending_barrier = TRUE_BARRIER; - - /* For all ASM_OPERANDS, we must traverse the vector of input operands. -- cgit v1.2.3 From 6ac8aa3d750f0ff392c3c91b7710228ab6c7831a Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Fri, 26 Dec 2014 20:20:10 -0500 Subject: gnu: m4: Remove already-applied patch. * gnu/packages/patches/m4-readlink-EINVAL.patch: Remove file. * gnu-system.am (dist_patch_DATA): Remove it. * gnu/packages/m4.scm (m4): Remove patch. --- gnu-system.am | 1 - gnu/packages/m4.scm | 3 +-- gnu/packages/patches/m4-readlink-EINVAL.patch | 18 ------------------ 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 gnu/packages/patches/m4-readlink-EINVAL.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 09d09caaee..9790543d35 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -403,7 +403,6 @@ dist_patch_DATA = \ gnu/packages/patches/lm-sensors-hwmon-attrs.patch \ gnu/packages/patches/luit-posix.patch \ gnu/packages/patches/m4-gets-undeclared.patch \ - gnu/packages/patches/m4-readlink-EINVAL.patch \ gnu/packages/patches/make-impure-dirs.patch \ gnu/packages/patches/mc-fix-ncurses-build.patch \ gnu/packages/patches/mcron-install.patch \ diff --git a/gnu/packages/m4.scm b/gnu/packages/m4.scm index 0915fde4f2..b3b3a00fde 100644 --- a/gnu/packages/m4.scm +++ b/gnu/packages/m4.scm @@ -33,8 +33,7 @@ (define-public m4 version ".tar.bz2")) (sha256 (base32 - "0w0da1chh12mczxa5lnwzjk9czi3dq6gnnndbpa6w4rj76b1yklf")) - (patches (list (search-patch "m4-readlink-EINVAL.patch"))))) + "0w0da1chh12mczxa5lnwzjk9czi3dq6gnnndbpa6w4rj76b1yklf")))) (build-system gnu-build-system) (arguments ;; XXX: Disable tests on those platforms with know issues. diff --git a/gnu/packages/patches/m4-readlink-EINVAL.patch b/gnu/packages/patches/m4-readlink-EINVAL.patch deleted file mode 100644 index dd371584a7..0000000000 --- a/gnu/packages/patches/m4-readlink-EINVAL.patch +++ /dev/null @@ -1,18 +0,0 @@ -Newer Linux kernels would return EINVAL instead of ENOENT. -The patch below, taken from Gnulib, allows the test to pass when -these Linux versions are in use: -https://lists.gnu.org/archive/html/bug-gnulib/2011-03/msg00308.html . - -diff --git a/tests/test-readlink.h b/tests/test-readlink.h -index 08d5662..7247fc4 100644 ---- a/tests/test-readlink.h -+++ b/tests/test-readlink.h -@@ -38,7 +38,7 @@ test_readlink (ssize_t (*func) (char const *, char *, size_t), bool print) - ASSERT (errno == ENOENT); - errno = 0; - ASSERT (func ("", buf, sizeof buf) == -1); -- ASSERT (errno == ENOENT); -+ ASSERT (errno == ENOENT || errno == EINVAL); - errno = 0; - ASSERT (func (".", buf, sizeof buf) == -1); - ASSERT (errno == EINVAL); -- cgit v1.2.3 From 26804e1351a86bfcde1b8bebeb984b9c79e6fe6f Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 30 Dec 2014 13:57:40 -0500 Subject: gnu: glibc: Add fixes for CVE-2014-7817 and CVE-2012-3406. * gnu/packages/patches/glibc-CVE-2012-3406.patch, gnu/packages/patches/glibc-CVE-2014-7817.patch: New files. * gnu-system.am (dist_patch_DATA): Add them. * gnu/packages/base.scm (glibc): Add patches. --- gnu-system.am | 2 + gnu/packages/base.scm | 4 +- gnu/packages/patches/glibc-CVE-2012-3406.patch | 282 +++++++++++++++++++++++++ gnu/packages/patches/glibc-CVE-2014-7817.patch | 171 +++++++++++++++ 4 files changed, 458 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/glibc-CVE-2012-3406.patch create mode 100644 gnu/packages/patches/glibc-CVE-2014-7817.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index c2266c0da4..729d185d47 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -362,6 +362,8 @@ dist_patch_DATA = \ gnu/packages/patches/glib-tests-prlimit.patch \ gnu/packages/patches/glib-tests-timer.patch \ gnu/packages/patches/glib-tests-gapplication.patch \ + gnu/packages/patches/glibc-CVE-2012-3406.patch \ + gnu/packages/patches/glibc-CVE-2014-7817.patch \ gnu/packages/patches/glibc-bootstrap-system.patch \ gnu/packages/patches/glibc-ldd-x86_64.patch \ gnu/packages/patches/gnunet-fix-scheduler.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 5bf27c9ef1..117ee74b97 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -375,7 +375,9 @@ (define-public glibc (("use_ldconfig=yes") "use_ldconfig=no"))) (modules '((guix build utils))) - (patches (list (search-patch "glibc-ldd-x86_64.patch"))))) + (patches (list (search-patch "glibc-CVE-2014-7817.patch") + (search-patch "glibc-CVE-2012-3406.patch") + (search-patch "glibc-ldd-x86_64.patch"))))) (build-system gnu-build-system) ;; Glibc's refers to , for instance, so glibc diff --git a/gnu/packages/patches/glibc-CVE-2012-3406.patch b/gnu/packages/patches/glibc-CVE-2012-3406.patch new file mode 100644 index 0000000000..9147a2aeee --- /dev/null +++ b/gnu/packages/patches/glibc-CVE-2012-3406.patch @@ -0,0 +1,282 @@ +Fix CVE-2012-3406: Stack overflow in vfprintf [BZ #16617] + +Note: Here the ChangeLog and NEWS updates are removed from Jeff's + patch, since they depend on other earlier commits. + +From: Jeff Law +Date: Mon, 15 Dec 2014 09:09:32 +0000 (+0100) +Subject: CVE-2012-3406: Stack overflow in vfprintf [BZ #16617] +X-Git-Url: https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff_plain;h=a3a1f4163c4d0f9a36056c8640661a88674ae8a2 + +CVE-2012-3406: Stack overflow in vfprintf [BZ #16617] + +A larger number of format specifiers coudld cause a stack overflow, +potentially allowing to bypass _FORTIFY_SOURCE format string +protection. + +(cherry picked from commit a5357b7ce2a2982c5778435704bcdb55ce3667a0) +(cherry picked from commit ae61fc7b33d9d99d2763c16de8275227dc9748ba) + +Conflicts: + NEWS +--- + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 5f8e534..e5e45b6 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -57,7 +57,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ + bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \ + scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \ + bug-vfprintf-nargs tst-long-dbl-fphex tst-fphex-wide tst-sprintf3 \ +- bug25 tst-printf-round bug26 ++ bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 + + test-srcs = tst-unbputc tst-printf + +diff --git a/stdio-common/bug23-2.c b/stdio-common/bug23-2.c +new file mode 100644 +index 0000000..9e0cfe6 +--- /dev/null ++++ b/stdio-common/bug23-2.c +@@ -0,0 +1,70 @@ ++#include ++#include ++#include ++ ++static const char expected[] = "\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55\ ++\n\ ++a\n\ ++abbcd55%%%%%%%%%%%%%%%%%%%%%%%%%%\n"; ++ ++static int ++do_test (void) ++{ ++ char *buf = malloc (strlen (expected) + 1); ++ snprintf (buf, strlen (expected) + 1, ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", ++ "a", "b", "c", "d", 5); ++ return strcmp (buf, expected) != 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/bug23-3.c b/stdio-common/bug23-3.c +new file mode 100644 +index 0000000..57c8cef +--- /dev/null ++++ b/stdio-common/bug23-3.c +@@ -0,0 +1,50 @@ ++#include ++#include ++#include ++ ++int ++do_test (void) ++{ ++ size_t instances = 16384; ++#define X0 "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" ++ const char *item = "\na\nabbcd55"; ++#define X3 X0 X0 X0 X0 X0 X0 X0 X0 ++#define X6 X3 X3 X3 X3 X3 X3 X3 X3 ++#define X9 X6 X6 X6 X6 X6 X6 X6 X6 ++#define X12 X9 X9 X9 X9 X9 X9 X9 X9 ++#define X14 X12 X12 X12 X12 ++#define TRAILER "%%%%%%%%%%%%%%%%%%%%%%%%%%" ++#define TRAILER2 TRAILER TRAILER ++ size_t length = instances * strlen (item) + strlen (TRAILER) + 1; ++ ++ char *buf = malloc (length + 1); ++ snprintf (buf, length + 1, ++ X14 TRAILER2 "\n", ++ "a", "b", "c", "d", 5); ++ ++ const char *p = buf; ++ size_t i; ++ for (i = 0; i < instances; ++i) ++ { ++ const char *expected; ++ for (expected = item; *expected; ++expected) ++ { ++ if (*p != *expected) ++ { ++ printf ("mismatch at offset %zu (%zu): expected %d, got %d\n", ++ (size_t) (p - buf), i, *expected & 0xFF, *p & 0xFF); ++ return 1; ++ } ++ ++p; ++ } ++ } ++ if (strcmp (p, TRAILER "\n") != 0) ++ { ++ printf ("mismatch at trailer: [%s]\n", p); ++ return 1; ++ } ++ free (buf); ++ return 0; ++} ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/bug23-4.c b/stdio-common/bug23-4.c +new file mode 100644 +index 0000000..a478564 +--- /dev/null ++++ b/stdio-common/bug23-4.c +@@ -0,0 +1,31 @@ ++#include ++#include ++#include ++#include ++ ++#define LIMIT 1000000 ++ ++int ++main (void) ++{ ++ struct rlimit lim; ++ getrlimit (RLIMIT_STACK, &lim); ++ lim.rlim_cur = 1048576; ++ setrlimit (RLIMIT_STACK, &lim); ++ char *fmtstr = malloc (4 * LIMIT + 1); ++ if (fmtstr == NULL) ++ abort (); ++ char *output = malloc (LIMIT + 1); ++ if (output == NULL) ++ abort (); ++ for (size_t i = 0; i < LIMIT; i++) ++ memcpy (fmtstr + 4 * i, "%1$d", 4); ++ fmtstr[4 * LIMIT] = '\0'; ++ int ret = snprintf (output, LIMIT + 1, fmtstr, 0); ++ if (ret != LIMIT) ++ abort (); ++ for (size_t i = 0; i < LIMIT; i++) ++ if (output[i] != '0') ++ abort (); ++ return 0; ++} +diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c +index c4ff833..429a3d1 100644 +--- a/stdio-common/vfprintf.c ++++ b/stdio-common/vfprintf.c +@@ -263,6 +263,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) + /* For the argument descriptions, which may be allocated on the heap. */ + void *args_malloced = NULL; + ++ /* For positional argument handling. */ ++ struct printf_spec *specs; ++ ++ /* Track if we malloced the SPECS array and thus must free it. */ ++ bool specs_malloced = false; ++ + /* This table maps a character into a number representing a + class. In each step there is a destination label for each + class. */ +@@ -1679,8 +1685,8 @@ do_positional: + size_t nspecs = 0; + /* A more or less arbitrary start value. */ + size_t nspecs_size = 32 * sizeof (struct printf_spec); +- struct printf_spec *specs = alloca (nspecs_size); + ++ specs = alloca (nspecs_size); + /* The number of arguments the format string requests. This will + determine the size of the array needed to store the argument + attributes. */ +@@ -1721,11 +1727,39 @@ do_positional: + if (nspecs * sizeof (*specs) >= nspecs_size) + { + /* Extend the array of format specifiers. */ ++ if (nspecs_size * 2 < nspecs_size) ++ { ++ __set_errno (ENOMEM); ++ done = -1; ++ goto all_done; ++ } + struct printf_spec *old = specs; +- specs = extend_alloca (specs, nspecs_size, 2 * nspecs_size); ++ if (__libc_use_alloca (2 * nspecs_size)) ++ specs = extend_alloca (specs, nspecs_size, 2 * nspecs_size); ++ else ++ { ++ nspecs_size *= 2; ++ specs = malloc (nspecs_size); ++ if (specs == NULL) ++ { ++ __set_errno (ENOMEM); ++ specs = old; ++ done = -1; ++ goto all_done; ++ } ++ } + + /* Copy the old array's elements to the new space. */ + memmove (specs, old, nspecs * sizeof (*specs)); ++ ++ /* If we had previously malloc'd space for SPECS, then ++ release it after the copy is complete. */ ++ if (specs_malloced) ++ free (old); ++ ++ /* Now set SPECS_MALLOCED if needed. */ ++ if (!__libc_use_alloca (nspecs_size)) ++ specs_malloced = true; + } + + /* Parse the format specifier. */ +@@ -2046,6 +2080,8 @@ do_positional: + } + + all_done: ++ if (specs_malloced) ++ free (specs); + if (__glibc_unlikely (args_malloced != NULL)) + free (args_malloced); + if (__glibc_unlikely (workstart != NULL)) diff --git a/gnu/packages/patches/glibc-CVE-2014-7817.patch b/gnu/packages/patches/glibc-CVE-2014-7817.patch new file mode 100644 index 0000000000..14c885523c --- /dev/null +++ b/gnu/packages/patches/glibc-CVE-2014-7817.patch @@ -0,0 +1,171 @@ +Fix CVE-2014-7817: wordexp fails to honour WRDE_NOCMD. + +Note: Here the ChangeLog and NEWS updates are removed from Carlos's + patch, since they depend on other earlier commits. + +From: Carlos O'Donell +Date: Wed, 19 Nov 2014 16:44:12 +0000 (-0500) +Subject: CVE-2014-7817: wordexp fails to honour WRDE_NOCMD. +X-Git-Url: https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff_plain;h=33ceaf6187b31ea15284ac65131749e1cb68d2ae + +CVE-2014-7817: wordexp fails to honour WRDE_NOCMD. + +The function wordexp() fails to properly handle the WRDE_NOCMD +flag when processing arithmetic inputs in the form of "$((... ``))" +where "..." can be anything valid. The backticks in the arithmetic +epxression are evaluated by in a shell even if WRDE_NOCMD forbade +command substitution. This allows an attacker to attempt to pass +dangerous commands via constructs of the above form, and bypass +the WRDE_NOCMD flag. This patch fixes this by checking for WRDE_NOCMD +in exec_comm(), the only place that can execute a shell. All other +checks for WRDE_NOCMD are superfluous and removed. + +We expand the testsuite and add 3 new regression tests of roughly +the same form but with a couple of nested levels. + +On top of the 3 new tests we add fork validation to the WRDE_NOCMD +testing. If any forks are detected during the execution of a wordexp() +call with WRDE_NOCMD, the test is marked as failed. This is slightly +heuristic since vfork might be used in the future, but it provides a +higher level of assurance that no shells were executed as part of +command substitution with WRDE_NOCMD in effect. In addition it doesn't +require libpthread or libdl, instead we use the public implementation +namespace function __register_atfork (already part of the public ABI +for libpthread). + +Tested on x86_64 with no regressions. + +(cherry picked from commit a39208bd7fb76c1b01c127b4c61f9bfd915bfe7c) +--- + +diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c +index 4957006..bdd65e4 100644 +--- a/posix/wordexp-test.c ++++ b/posix/wordexp-test.c +@@ -27,6 +27,25 @@ + + #define IFS " \n\t" + ++extern void *__dso_handle __attribute__ ((__weak__, __visibility__ ("hidden"))); ++extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *); ++ ++static int __app_register_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void)) ++{ ++ return __register_atfork (prepare, parent, child, ++ &__dso_handle == NULL ? NULL : __dso_handle); ++} ++ ++/* Number of forks seen. */ ++static int registered_forks; ++ ++/* For each fork increment the fork count. */ ++static void ++register_fork (void) ++{ ++ registered_forks++; ++} ++ + struct test_case_struct + { + int retval; +@@ -206,6 +225,12 @@ struct test_case_struct + { WRDE_SYNTAX, NULL, "$((2+))", 0, 0, { NULL, }, IFS }, + { WRDE_SYNTAX, NULL, "`", 0, 0, { NULL, }, IFS }, + { WRDE_SYNTAX, NULL, "$((010+4+))", 0, 0, { NULL }, IFS }, ++ /* Test for CVE-2014-7817. We test 3 combinations of command ++ substitution inside an arithmetic expression to make sure that ++ no commands are executed and error is returned. */ ++ { WRDE_CMDSUB, NULL, "$((`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, ++ { WRDE_CMDSUB, NULL, "$((1+`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, ++ { WRDE_CMDSUB, NULL, "$((1+$((`echo 1`))))", WRDE_NOCMD, 0, { NULL, }, IFS }, + + { -1, NULL, NULL, 0, 0, { NULL, }, IFS }, + }; +@@ -258,6 +283,15 @@ main (int argc, char *argv[]) + return -1; + } + ++ /* If we are not allowed to do command substitution, we install ++ fork handlers to verify that no forks happened. No forks should ++ happen at all if command substitution is disabled. */ ++ if (__app_register_atfork (register_fork, NULL, NULL) != 0) ++ { ++ printf ("Failed to register fork handler.\n"); ++ return -1; ++ } ++ + for (test = 0; test_case[test].retval != -1; test++) + if (testit (&test_case[test])) + ++fail; +@@ -367,6 +401,9 @@ testit (struct test_case_struct *tc) + + printf ("Test %d (%s): ", ++tests, tc->words); + ++ if (tc->flags & WRDE_NOCMD) ++ registered_forks = 0; ++ + if (tc->flags & WRDE_APPEND) + { + /* initial wordexp() call, to be appended to */ +@@ -378,6 +415,13 @@ testit (struct test_case_struct *tc) + } + retval = wordexp (tc->words, &we, tc->flags); + ++ if ((tc->flags & WRDE_NOCMD) ++ && (registered_forks > 0)) ++ { ++ printf ("FAILED fork called for WRDE_NOCMD\n"); ++ return 1; ++ } ++ + if (tc->flags & WRDE_DOOFFS) + start_offs = sav_we.we_offs; + +diff --git a/posix/wordexp.c b/posix/wordexp.c +index b6b65dd..26f3a26 100644 +--- a/posix/wordexp.c ++++ b/posix/wordexp.c +@@ -893,6 +893,10 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, + pid_t pid; + int noexec = 0; + ++ /* Do nothing if command substitution should not succeed. */ ++ if (flags & WRDE_NOCMD) ++ return WRDE_CMDSUB; ++ + /* Don't fork() unless necessary */ + if (!comm || !*comm) + return 0; +@@ -2082,9 +2086,6 @@ parse_dollars (char **word, size_t *word_length, size_t *max_length, + } + } + +- if (flags & WRDE_NOCMD) +- return WRDE_CMDSUB; +- + (*offset) += 2; + return parse_comm (word, word_length, max_length, words, offset, flags, + quoted? NULL : pwordexp, ifs, ifs_white); +@@ -2196,9 +2197,6 @@ parse_dquote (char **word, size_t *word_length, size_t *max_length, + break; + + case '`': +- if (flags & WRDE_NOCMD) +- return WRDE_CMDSUB; +- + ++(*offset); + error = parse_backtick (word, word_length, max_length, words, + offset, flags, NULL, NULL, NULL); +@@ -2357,12 +2355,6 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) + break; + + case '`': +- if (flags & WRDE_NOCMD) +- { +- error = WRDE_CMDSUB; +- goto do_error; +- } +- + ++words_offset; + error = parse_backtick (&word, &word_length, &max_length, words, + &words_offset, flags, pwordexp, ifs, -- cgit v1.2.3 From bf0baaf7db6c3ab7d54f274a8728612e323b1b08 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 30 Dec 2014 19:58:05 -0500 Subject: gnu: glibc: MIPS: Avoid a dangling `vfork@GLIBC_2.0' reference. * gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. * gnu/packages/base.scm (glibc): Add patch. --- gnu-system.am | 1 + gnu/packages/base.scm | 1 + .../patches/glibc-mips-dangling-vfork-ref.patch | 45 ++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 729d185d47..405c01fb07 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -366,6 +366,7 @@ dist_patch_DATA = \ gnu/packages/patches/glibc-CVE-2014-7817.patch \ gnu/packages/patches/glibc-bootstrap-system.patch \ gnu/packages/patches/glibc-ldd-x86_64.patch \ + gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch \ gnu/packages/patches/gnunet-fix-scheduler.patch \ gnu/packages/patches/gnunet-fix-tests.patch \ gnu/packages/patches/gobject-introspection-cc.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 117ee74b97..1f479ccbbe 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -377,6 +377,7 @@ (define-public glibc (modules '((guix build utils))) (patches (list (search-patch "glibc-CVE-2014-7817.patch") (search-patch "glibc-CVE-2012-3406.patch") + (search-patch "glibc-mips-dangling-vfork-ref.patch") (search-patch "glibc-ldd-x86_64.patch"))))) (build-system gnu-build-system) diff --git a/gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch b/gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch new file mode 100644 index 0000000000..852b6de669 --- /dev/null +++ b/gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch @@ -0,0 +1,45 @@ +Avoid a dangling `vfork@GLIBC_2.0' reference on MIPS. + +Note: Here the ChangeLog and NEWS updates are removed from Maciej's + patch, since they depend on other earlier commits. + +From: Maciej W. Rozycki +Date: Wed, 22 Oct 2014 14:20:37 +0000 (+0100) +Subject: MIPS: Avoid a dangling `vfork@GLIBC_2.0' reference +X-Git-Url: https://sourceware.org/git/?p=glibc.git;a=commitdiff_plain;h=c14e752fc73d34c75d4f84f37fea8e0b1734cf98 + +MIPS: Avoid a dangling `vfork@GLIBC_2.0' reference + +This satisfies a symbol reference created with: + + .symver __libc_vfork, vfork@GLIBC_2.0 + +where `__libc_vfork' has not been defined or referenced. In this case +the `vfork@GLIBC_2.0' reference is supposed to be discarded, however a +bug present in GAS since forever causes an undefined symbol table entry +to be created. This in turn triggers a problem in the linker that can +manifest itself by link errors such as: + +ld: libpthread.so: invalid string offset 2765592330 >= 5154 for section `.dynstr' + +The GAS and linker bugs need to be resolved, but we can avoid them too +by providing a `__libc_vfork' definition just like our other platforms. + + [BZ #17485] + * sysdeps/unix/sysv/linux/mips/vfork.S (__libc_vfork): Define. + +(cherry picked from commit b5af9297d51a43f96c5be1bafab032184690dd6f) + +Conflicts: + NEWS +--- + +diff --git a/sysdeps/unix/sysv/linux/mips/vfork.S b/sysdeps/unix/sysv/linux/mips/vfork.S +index 80c362d..2c1a747 100644 +--- a/sysdeps/unix/sysv/linux/mips/vfork.S ++++ b/sysdeps/unix/sysv/linux/mips/vfork.S +@@ -108,3 +108,4 @@ L(error): + + libc_hidden_def(__vfork) + weak_alias (__vfork, vfork) ++strong_alias (__vfork, __libc_vfork) -- cgit v1.2.3 From b515822de1001170b05bb78be3887c04acbe3653 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Wed, 31 Dec 2014 04:48:46 -0500 Subject: gnu: guile: Apply fixes for arm. * gnu/packages/patches/guile-arm-fixes.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. * gnu/packages/guile.scm (guile-2.0): Add patch. --- gnu-system.am | 3 +- gnu/packages/guile.scm | 5 +- gnu/packages/patches/guile-arm-fixes.patch | 203 +++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/guile-arm-fixes.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index fc7f326c4f..5dd3a4937e 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -1,7 +1,7 @@ # GNU Guix --- Functional package management for GNU # Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès # Copyright © 2013, 2014 Andreas Enge -# Copyright © 2013, 2014 Mark H Weaver +# Copyright © 2013, 2014, 2015 Mark H Weaver # # This file is part of GNU Guix. # @@ -379,6 +379,7 @@ dist_patch_DATA = \ gnu/packages/patches/gstreamer-0.10-bison3.patch \ gnu/packages/patches/gstreamer-0.10-silly-test.patch \ gnu/packages/patches/guile-1.8-cpp-4.5.patch \ + gnu/packages/patches/guile-arm-fixes.patch \ gnu/packages/patches/guile-default-utf8.patch \ gnu/packages/patches/guile-linux-syscalls.patch \ gnu/packages/patches/guile-relocatable.patch \ diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm index 7e3b5f847d..0796834369 100644 --- a/gnu/packages/guile.scm +++ b/gnu/packages/guile.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès -;;; Copyright © 2014 Mark H Weaver +;;; Copyright © 2014, 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -117,7 +117,8 @@ (define-public guile-2.0 ".tar.xz")) (sha256 (base32 - "1qh3j7308qvsjgwf7h94yqgckpbgz2k3yqdkzsyhqcafvfka9l5f")))) + "1qh3j7308qvsjgwf7h94yqgckpbgz2k3yqdkzsyhqcafvfka9l5f")) + (patches (list (search-patch "guile-arm-fixes.patch"))))) (build-system gnu-build-system) (native-inputs `(("pkgconfig" ,pkg-config))) (inputs `(("libffi" ,libffi) diff --git a/gnu/packages/patches/guile-arm-fixes.patch b/gnu/packages/patches/guile-arm-fixes.patch new file mode 100644 index 0000000000..62bcf0fa7b --- /dev/null +++ b/gnu/packages/patches/guile-arm-fixes.patch @@ -0,0 +1,203 @@ +Apply fixes for ARM to Guile. + +From df8c52e93dfa3965e4714275f4b8cea2c8e0170b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= +Date: Fri, 4 Jul 2014 15:35:06 +0200 +Subject: [PATCH] Recognize arm-* target triplets. + +Reported by Sylvain Beucler . + +* module/system/base/target.scm (cpu-endianness): Add case where CPU is + "arm". +* test-suite/tests/asm-to-bytecode.test ("cross-compilation")["arm-unknown-linux-androideabi"]: + New test. +--- + module/system/base/target.scm | 4 +++- + test-suite/tests/asm-to-bytecode.test | 5 ++++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/module/system/base/target.scm b/module/system/base/target.scm +index c74ae67..cefa951 100644 +--- a/module/system/base/target.scm ++++ b/module/system/base/target.scm +@@ -1,6 +1,6 @@ + ;;; Compilation targets + +-;; Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc. ++;; Copyright (C) 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + + ;; This library is free software; you can redistribute it and/or + ;; modify it under the terms of the GNU Lesser General Public +@@ -72,6 +72,8 @@ + (endianness big)) + ((string-match "^arm.*el" cpu) + (endianness little)) ++ ((string=? "arm" cpu) ;ARMs are LE by default ++ (endianness little)) + (else + (error "unknown CPU endianness" cpu))))) + +diff --git a/test-suite/tests/asm-to-bytecode.test b/test-suite/tests/asm-to-bytecode.test +index 6d2f20e..62ea0ed 100644 +--- a/test-suite/tests/asm-to-bytecode.test ++++ b/test-suite/tests/asm-to-bytecode.test +@@ -1,6 +1,6 @@ + ;;;; Assembly to bytecode compilation -*- mode: scheme; coding: utf-8; -*- + ;;;; +-;;;; Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. ++;;;; Copyright (C) 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + ;;;; + ;;;; This library is free software; you can redistribute it and/or + ;;;; modify it under the terms of the GNU Lesser General Public +@@ -205,6 +205,9 @@ + (test-target "x86_64-unknown-linux-gnux32" ; x32 ABI (Debian tuplet) + (endianness little) 4) + ++ (test-target "arm-unknown-linux-androideabi" ++ (endianness little) 4) ++ + (pass-if-exception "unknown target" + exception:miscellaneous-error + (call-with-values (lambda () +-- +2.1.2 + +From ffd3e55cfd12a3559621e3130d613d319243512d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= +Date: Fri, 4 Jul 2014 17:26:41 +0200 +Subject: [PATCH] Recognize more ARM targets. + +Suggested by Dale P. Smith. + +* module/system/base/target.scm (cpu-endianness): Add cases for + "arm.*eb", "^aarch64.*be", and "aarch64". Change "arm" case to + "arm.*". + (triplet-pointer-size): Allow underscore as in 'aarch64_be'. +* test-suite/tests/asm-to-bytecode.test ("cross-compilation")["armeb-unknown-linux-gnu", + "aarch64-linux-gnu", "aarch64_be-linux-gnu"]: New tests. +--- + module/system/base/target.scm | 10 ++++++++-- + test-suite/tests/asm-to-bytecode.test | 6 ++++++ + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/module/system/base/target.scm b/module/system/base/target.scm +index cefa951..31e3fea 100644 +--- a/module/system/base/target.scm ++++ b/module/system/base/target.scm +@@ -72,7 +72,13 @@ + (endianness big)) + ((string-match "^arm.*el" cpu) + (endianness little)) +- ((string=? "arm" cpu) ;ARMs are LE by default ++ ((string-match "^arm.*eb" cpu) ++ (endianness big)) ++ ((string-prefix? "arm" cpu) ;ARMs are LE by default ++ (endianness little)) ++ ((string-match "^aarch64.*be" cpu) ++ (endianness big)) ++ ((string=? "aarch64" cpu) + (endianness little)) + (else + (error "unknown CPU endianness" cpu))))) +@@ -97,7 +103,7 @@ + ((string-match "^x86_64-.*-gnux32" triplet) 4) ; x32 + + ((string-match "64$" cpu) 8) +- ((string-match "64[lbe][lbe]$" cpu) 8) ++ ((string-match "64_?[lbe][lbe]$" cpu) 8) + ((member cpu '("sparc" "powerpc" "mips" "mipsel")) 4) + ((string-match "^arm.*" cpu) 4) + (else (error "unknown CPU word size" cpu))))) +diff --git a/test-suite/tests/asm-to-bytecode.test b/test-suite/tests/asm-to-bytecode.test +index 62ea0ed..8aeba84 100644 +--- a/test-suite/tests/asm-to-bytecode.test ++++ b/test-suite/tests/asm-to-bytecode.test +@@ -207,6 +207,12 @@ + + (test-target "arm-unknown-linux-androideabi" + (endianness little) 4) ++ (test-target "armeb-unknown-linux-gnu" ++ (endianness big) 4) ++ (test-target "aarch64-linux-gnu" ++ (endianness little) 8) ++ (test-target "aarch64_be-linux-gnu" ++ (endianness big) 8) + + (pass-if-exception "unknown target" + exception:miscellaneous-error +-- +2.1.2 + +From a85c78ea1393985fdb6e6678dea19135c553d341 Mon Sep 17 00:00:00 2001 +From: Mark H Weaver +Date: Fri, 19 Sep 2014 21:18:09 -0400 +Subject: [PATCH] VM: ASM_MUL for ARM: Add earlyclobber constraint to the SMULL + outputs. + +Reported by Rob Browning . + +* libguile/vm-i-scheme.c (ASM_MUL)[ARM]: Add earlyclobber (&) constraint + to the SMULL output registers. +--- + libguile/vm-i-scheme.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c +index 587aa95..162efab 100644 +--- a/libguile/vm-i-scheme.c ++++ b/libguile/vm-i-scheme.c +@@ -1,5 +1,4 @@ +-/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013, +- * 2014 Free Software Foundation, Inc. ++/* Copyright (C) 2001, 2009-2014 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License +@@ -363,7 +362,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2) + { \ + scm_t_signed_bits rlo, rhi; \ + asm ("smull %0, %1, %2, %3\n" \ +- : "=r" (rlo), "=r" (rhi) \ ++ : "=&r" (rlo), "=&r" (rhi) \ + : "r" (SCM_UNPACK (x) - scm_tc2_int), \ + "r" (SCM_I_INUM (y))); \ + if (SCM_LIKELY (SCM_SRS (rlo, 31) == rhi)) \ +-- +2.1.2 + +From bed025bd2569b1c033f24d7d9e660e39ebf65cac Mon Sep 17 00:00:00 2001 +From: Mark H Weaver +Date: Sat, 20 Sep 2014 03:59:51 -0400 +Subject: [PATCH] VM: Allow the C compiler to choose FP_REG on ARM. + +Reported by Rob Browning . + +* libguile/vm-engine.h (IP_REG)[__arm__]: Remove explicit register + choice ("r7") for FP_REG, which was reported to cause compilation + failures on ARM. +--- + libguile/vm-engine.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h +index 46d4cff..e618be7 100644 +--- a/libguile/vm-engine.h ++++ b/libguile/vm-engine.h +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2001, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. ++/* Copyright (C) 2001, 2009-2012, 2014 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License +@@ -81,7 +81,7 @@ + #ifdef __arm__ + #define IP_REG asm("r9") + #define SP_REG asm("r8") +-#define FP_REG asm("r7") ++#define FP_REG + #endif + #endif + +-- +2.1.2 + -- cgit v1.2.3 From c154e1ea81b1eb81c5716ce5a4df694fbd05c421 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 6 Jan 2015 23:22:00 +0100 Subject: gnu: libtool: Update to 2.4.4. * gnu/packages/patches/libtool-2.4-skip-tests.patch: Rename to... * gnu/packages/patches/libtool-skip-tests.patch: ... this. * gnu/packages/patches/libtool-skip-tests-for-mips.patch: Remove. * gnu-system.am (dist_patch_DATA): Adjust accordingly. * gnu/packages/autotools.scm (libtool): Update to 2.4.4. (libtool-2.4.4): Remove. --- gnu-system.am | 2 - gnu/packages/autotools.scm | 63 ++++++++-------------- gnu/packages/patches/libtool-2.4-skip-tests.patch | 24 --------- .../patches/libtool-skip-tests-for-mips.patch | 12 ----- gnu/packages/patches/libtool-skip-tests.patch | 53 +++++++----------- 5 files changed, 42 insertions(+), 112 deletions(-) delete mode 100644 gnu/packages/patches/libtool-2.4-skip-tests.patch delete mode 100644 gnu/packages/patches/libtool-skip-tests-for-mips.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 5dd3a4937e..03b4134019 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -407,8 +407,6 @@ dist_patch_DATA = \ gnu/packages/patches/libmad-mips-newgcc.patch \ gnu/packages/patches/libtheora-config-guess.patch \ gnu/packages/patches/libtool-skip-tests.patch \ - gnu/packages/patches/libtool-skip-tests-for-mips.patch \ - gnu/packages/patches/libtool-2.4-skip-tests.patch \ gnu/packages/patches/libssh-CVE-2014-0017.patch \ gnu/packages/patches/lm-sensors-hwmon-attrs.patch \ gnu/packages/patches/luit-posix.patch \ diff --git a/gnu/packages/autotools.scm b/gnu/packages/autotools.scm index eb33009d83..0ee1d149b9 100644 --- a/gnu/packages/autotools.scm +++ b/gnu/packages/autotools.scm @@ -238,31 +238,38 @@ (define (starts-with-shebang? file) (define-public libtool (package (name "libtool") - (version "2.4.2") + (version "2.4.4") (source (origin - (method url-fetch) - (uri (string-append "mirror://gnu/libtool/libtool-" - version ".tar.gz")) - (sha256 - (base32 - "0649qfpzkswgcj9vqkkr9rn4nlcx80faxpyqscy2k1x9c94f93dk")) - (patches - (list (search-patch "libtool-skip-tests.patch") - (search-patch "libtool-skip-tests-for-mips.patch"))))) + (method url-fetch) + (uri (string-append "mirror://gnu/libtool/libtool-" + version ".tar.xz")) + (sha256 + (base32 + "0v3zq08qxv7k5067mpqrkjkjl3wphhg06i696mka90mzadc5nad8")) + (patches + (list (search-patch "libtool-skip-tests.patch"))))) (build-system gnu-build-system) (native-inputs `(("m4" ,m4) - ("perl" ,perl))) + ("perl" ,perl) + ("automake" ,automake) ;some tests rely on 'aclocal' + ("autoconf" ,(autoconf-wrapper)))) ;others on 'autom4te' ;; Separate binaries from the rest. During bootstrap, only ltdl is ;; used; not depending on the binaries allows us to avoid retaining ;; a reference to the bootstrap bash. - (outputs '("bin" ; libtoolize, libtool, etc. - "out")) ; libltdl.so, ltdl.h, etc. + (outputs '("bin" ;libtoolize, libtool, etc. + "out")) ;libltdl.so, ltdl.h, etc. (arguments (if (%current-target-system) - '() ; no `check' phase when cross-building - '(#:phases (alist-cons-before + '() ;no `check' phase when cross-building + `(;; XXX: There are test failures on mips64el-linux starting from 2.4.4: + ;; . + #:tests? ,(not (string-prefix? "mips64" + (or (%current-target-system) + (%current-system)))) + + #:phases (alist-cons-before 'check 'pre-check (lambda* (#:key inputs #:allow-other-keys) ;; Run the test suite in parallel, if possible. @@ -285,32 +292,6 @@ (define-public libtool (license gpl3+) (home-page "http://www.gnu.org/software/libtool/"))) -(define-public libtool-2.4.4 - (package (inherit libtool) - (version "2.4.4") - (source (origin - (method url-fetch) - (uri (string-append "mirror://gnu/libtool/libtool-" - version ".tar.xz")) - (sha256 - (base32 - "0v3zq08qxv7k5067mpqrkjkjl3wphhg06i696mka90mzadc5nad8")) - (patches - (list (search-patch "libtool-2.4-skip-tests.patch"))))) - - (native-inputs `(("automake" ,automake) ;some tests rely on 'aclocal' - ("autoconf" ,(autoconf-wrapper)) ;others on 'autom4te' - ,@(package-native-inputs libtool))) - - (arguments - ;; XXX: There are test failures on mips64el-linux starting from 2.4.4: - ;; . - (if (string-prefix? "mips64el" - (or (%current-target-system) (%current-system))) - `(#:tests? #f - ,@(package-arguments libtool)) - (package-arguments libtool))))) - (define-public libltdl ;; This is a libltdl package separate from the libtool package. This is ;; useful because, unlike libtool, it has zero extra dependencies (making it diff --git a/gnu/packages/patches/libtool-2.4-skip-tests.patch b/gnu/packages/patches/libtool-2.4-skip-tests.patch deleted file mode 100644 index 95747dfef0..0000000000 --- a/gnu/packages/patches/libtool-2.4-skip-tests.patch +++ /dev/null @@ -1,24 +0,0 @@ -Because our GCC 'lib' spec automatically adds '-rpath' for each '-L' -and a couple more '-rpath, there are two test failures: -one in demo.test, and one in destdir.at. Disable these. - ---- libtool-2.4.4/tests/testsuite 2014-11-29 17:43:11.000000000 +0100 -+++ libtool-2.4.4/tests/testsuite 2015-01-03 23:00:09.367775122 +0100 -@@ -9185,7 +9185,7 @@ read at_status <"$at_status_file" - #AT_START_33 - at_fn_group_banner 33 'demo.at:548' \ - "hardcoding library path" " " 3 --at_xfail=no -+at_xfail=yes - test no = "$ACLOCAL" && at_xfail=yes - test no = "$AUTOHEADER" && at_xfail=yes - test no = "$AUTOMAKE" && at_xfail=yes -@@ -27052,7 +27052,7 @@ read at_status <"$at_status_file" - #AT_START_97 - at_fn_group_banner 97 'destdir.at:75' \ - "DESTDIR with in-package deplibs" " " 7 --at_xfail=no -+at_xfail=yes - eval `$LIBTOOL --config | $GREP '^fast_install='` - case $fast_install in no) :;; *) false;; esac && at_xfail=yes - ( diff --git a/gnu/packages/patches/libtool-skip-tests-for-mips.patch b/gnu/packages/patches/libtool-skip-tests-for-mips.patch deleted file mode 100644 index 36587d23c2..0000000000 --- a/gnu/packages/patches/libtool-skip-tests-for-mips.patch +++ /dev/null @@ -1,12 +0,0 @@ -TEMPORARY HACK: Disable a test that fails on MIPS. - ---- libtool/Makefile.in.orig 2011-10-17 06:18:55.000000000 -0400 -+++ libtool/Makefile.in 2013-10-12 20:41:50.669067382 -0400 -@@ -890,7 +890,6 @@ - tests/demo-pic-make.test \ - tests/demo-pic-exec.test \ - tests/demo-nopic.test \ -- tests/demo-nopic-make.test \ - tests/demo-nopic-exec.test \ - tests/cdemo-shared.test \ - tests/cdemo-shared-make.test \ diff --git a/gnu/packages/patches/libtool-skip-tests.patch b/gnu/packages/patches/libtool-skip-tests.patch index 6e12615d51..95747dfef0 100644 --- a/gnu/packages/patches/libtool-skip-tests.patch +++ b/gnu/packages/patches/libtool-skip-tests.patch @@ -1,37 +1,24 @@ -Because our GCC `lib' spec automatically adds `-rpath' for each `-L' -and a couple more `-rpath, there are two test failures: -demo-hardcode.test, and destdir.at. Disable these. +Because our GCC 'lib' spec automatically adds '-rpath' for each '-L' +and a couple more '-rpath, there are two test failures: +one in demo.test, and one in destdir.at. Disable these. ---- libtool-2.4.2/Makefile.in 2011-10-17 12:18:55.000000000 +0200 -+++ libtool-2.4.2/Makefile.in 2012-09-13 23:50:37.000000000 +0200 -@@ -909,7 +908,7 @@ COMMON_TESTS = \ - # but they depend on the other tests being run beforehand. - INTERACTIVE_TESTS = tests/demo-shared.test tests/demo-shared-make.test \ - tests/demo-shared-exec.test tests/demo-shared-inst.test \ -- tests/demo-hardcode.test tests/demo-relink.test \ -+ tests/demo-relink.test \ - tests/demo-noinst-link.test tests/demo-shared-unst.test \ - tests/depdemo-shared.test tests/depdemo-shared-make.test \ - tests/depdemo-shared-exec.test tests/depdemo-shared-inst.test \ -@@ -2580,8 +2579,7 @@ tests/cdemo-static-make.log: tests/cdemo - - tests/demo-shared-unst.log: tests/demo-noinst-link.log - tests/demo-noinst-link.log: tests/demo-relink.log --tests/demo-relink.log: tests/demo-hardcode.log --tests/demo-hardcode.log: tests/demo-shared-inst.log -+tests/demo-relink.log: tests/demo-shared-inst.log - tests/demo-shared-inst.log: tests/demo-shared-exec.log - tests/demo-shared-exec.log: tests/demo-shared-make.log - tests/demo-shared-make.log: tests/demo-shared.log - ---- libtool-2.4.2/tests/testsuite 2011-10-17 12:19:52.000000000 +0200 -+++ libtool-2.4.2/tests/testsuite 2012-09-14 00:28:45.000000000 +0200 -@@ -14443,6 +14443,6 @@ read at_status <"$at_status_file" - #AT_START_69 - at_fn_group_banner 69 'destdir.at:75' \ - "DESTDIR with in-package deplibs" " " 4 +--- libtool-2.4.4/tests/testsuite 2014-11-29 17:43:11.000000000 +0100 ++++ libtool-2.4.4/tests/testsuite 2015-01-03 23:00:09.367775122 +0100 +@@ -9185,7 +9185,7 @@ read at_status <"$at_status_file" + #AT_START_33 + at_fn_group_banner 33 'demo.at:548' \ + "hardcoding library path" " " 3 +-at_xfail=no ++at_xfail=yes + test no = "$ACLOCAL" && at_xfail=yes + test no = "$AUTOHEADER" && at_xfail=yes + test no = "$AUTOMAKE" && at_xfail=yes +@@ -27052,7 +27052,7 @@ read at_status <"$at_status_file" + #AT_START_97 + at_fn_group_banner 97 'destdir.at:75' \ + "DESTDIR with in-package deplibs" " " 7 -at_xfail=no +at_xfail=yes - eval `$LIBTOOL --config | grep '^fast_install='` + eval `$LIBTOOL --config | $GREP '^fast_install='` case $fast_install in no) :;; *) false;; esac && at_xfail=yes - + ( -- cgit v1.2.3 From 24aaf2f257e6b611d3759ffc53c29828efce1917 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Wed, 31 Dec 2014 04:17:45 -0500 Subject: gnu: gmp: Apply fixes for armhf. * gnu/packages/patches/gmp-arm-asm-nothumb.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. * gnu/packages/multiprecision.scm (gmp): Add patch. Include --build triplet in configure args when building natively. * gnu/packages/commencement.scm (gcc-final): Use bootstrap guile to build gmp-source. --- gnu-system.am | 1 + gnu/packages/commencement.scm | 2 +- gnu/packages/multiprecision.scm | 15 +++++++++++++-- gnu/packages/patches/gmp-arm-asm-nothumb.patch | 21 +++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/gmp-arm-asm-nothumb.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 03b4134019..840b76437f 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -372,6 +372,7 @@ dist_patch_DATA = \ gnu/packages/patches/glibc-bootstrap-system.patch \ gnu/packages/patches/glibc-ldd-x86_64.patch \ gnu/packages/patches/glibc-mips-dangling-vfork-ref.patch \ + gnu/packages/patches/gmp-arm-asm-nothumb.patch \ gnu/packages/patches/gnunet-fix-scheduler.patch \ gnu/packages/patches/gnunet-fix-tests.patch \ gnu/packages/patches/gobject-introspection-cc.patch \ diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm index e6d03b184f..8fa90fed3f 100644 --- a/gnu/packages/commencement.scm +++ b/gnu/packages/commencement.scm @@ -531,7 +531,7 @@ (define-public gcc-final (native-inputs `(("texinfo" ,texinfo-boot0) ,@(package-native-inputs gcc-boot0))) - (inputs `(("gmp-source" ,(package-source gmp)) + (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp))) ("mpfr-source" ,(package-source mpfr)) ("mpc-source" ,(package-source mpc)) ("binutils" ,binutils-final) diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm index 377d922a09..ddbfc79965 100644 --- a/gnu/packages/multiprecision.scm +++ b/gnu/packages/multiprecision.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Ludovic Courtès +;;; Copyright © 2014 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,6 +23,7 @@ (define-module (gnu packages multiprecision) #:use-module (gnu packages m4) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix utils) #:use-module (guix build-system gnu)) (define-public gmp @@ -35,7 +37,8 @@ (define-public gmp version ".tar.xz")) (sha256 (base32 - "0r5pp27cy7ch3dg5v0rsny8bib1zfvrza6027g2mp5f6v8pd6mli")))) + "0r5pp27cy7ch3dg5v0rsny8bib1zfvrza6027g2mp5f6v8pd6mli")) + (patches (list (search-patch "gmp-arm-asm-nothumb.patch"))))) (build-system gnu-build-system) (native-inputs `(("m4" ,m4))) (outputs '("out" "debug")) @@ -43,7 +46,15 @@ (define-public gmp '(;; Build a "fat binary", with routines for several ;; sub-architectures. "--enable-fat" - "--enable-cxx"))) + "--enable-cxx" + + ;; FIXME: gmp-6.0.0a's config.guess fails on + ;; multi-core armhf systems. + ,@(if (%current-target-system) + '() + (let ((triplet + (nix-system->gnu-triplet (%current-system)))) + (list (string-append "--build=" triplet))))))) (synopsis "Multiple-precision arithmetic library") (description "GMP is a library for arbitrary precision arithmetic, operating on diff --git a/gnu/packages/patches/gmp-arm-asm-nothumb.patch b/gnu/packages/patches/gmp-arm-asm-nothumb.patch new file mode 100644 index 0000000000..666cf58cf6 --- /dev/null +++ b/gnu/packages/patches/gmp-arm-asm-nothumb.patch @@ -0,0 +1,21 @@ + +# HG changeset patch +# User Torbjorn Granlund +# Date 1396602422 -7200 +# Node ID 676e2d0f0e4dd301a7066079d2c9326c25c34a40 +# Parent 0194a75b56b21a9196626430af86c5bd9110c42d +Conditionalise ARM asm on !__thumb__. + +diff -r 0194a75b56b2 -r 676e2d0f0e4d mpn/generic/div_qr_1n_pi1.c +--- a/mpn/generic/div_qr_1n_pi1.c Thu Apr 03 23:58:51 2014 +0200 ++++ b/mpn/generic/div_qr_1n_pi1.c Fri Apr 04 11:07:02 2014 +0200 +@@ -130,7 +130,7 @@ + "%2" ((UDItype)(a0)), "r" ((UDItype)(b0)) __CLOBBER_CC) + #endif + +-#if defined (__arm__) && W_TYPE_SIZE == 32 ++#if defined (__arm__) && !defined (__thumb__) && W_TYPE_SIZE == 32 + #define add_mssaaaa(m, sh, sl, ah, al, bh, bl) \ + __asm__ ( "adds %2, %5, %6\n\t" \ + "adcs %1, %3, %4\n\t" \ + -- cgit v1.2.3 From f7d2b496b9a3f613aff50fef1e56d9f3aab99c7b Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 6 Jan 2015 21:41:55 +0000 Subject: gnu: patchelf: On ARM, apply experimental patch to get it working. * gnu/packages/patches/patchelf-rework-for-arm.patch: New file. * gnu-system.am: Add it. * gnu/packages/elf.scm: Apply patch when the target is ARM. --- gnu-system.am | 1 + gnu/packages/elf.scm | 21 + gnu/packages/patches/patchelf-rework-for-arm.patch | 473 +++++++++++++++++++++ 3 files changed, 495 insertions(+) create mode 100644 gnu/packages/patches/patchelf-rework-for-arm.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 840b76437f..06e96fb784 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -426,6 +426,7 @@ dist_patch_DATA = \ gnu/packages/patches/orpheus-cast-errors-and-includes.patch \ gnu/packages/patches/ots-no-include-missing-file.patch \ gnu/packages/patches/patchelf-page-size.patch \ + gnu/packages/patches/patchelf-rework-for-arm.patch \ gnu/packages/patches/patchutils-xfail-gendiff-tests.patch \ gnu/packages/patches/perl-no-sys-dirs.patch \ gnu/packages/patches/perl-tk-x11-discover.patch \ diff --git a/gnu/packages/elf.scm b/gnu/packages/elf.scm index 7fc689cb11..46c59c3a3b 100644 --- a/gnu/packages/elf.scm +++ b/gnu/packages/elf.scm @@ -100,6 +100,27 @@ (define-public patchelf "1rqpg84wrd3fa16wa9vqdvasnc05yz49w207cz1l0wrl4k8q97y9")) (patches (list (search-patch "patchelf-page-size.patch"))))) (build-system gnu-build-system) + + ;; XXX: The upstream 'patchelf' doesn't support ARM. The only available + ;; patch makes significant changes to the algorithm, possibly + ;; introducing bugs. So, we apply the patch only on ARM systems. + (inputs + (if (string-prefix? "arm" (or (%current-target-system) (%current-system))) + `(("patch/rework-for-arm" ,(search-patch + "patchelf-rework-for-arm.patch"))) + '())) + (arguments + (if (string-prefix? "arm" (or (%current-target-system) (%current-system))) + `(#:phases (alist-cons-after + 'unpack 'patch/rework-for-arm + (lambda* (#:key inputs #:allow-other-keys) + (let ((patch-file + (assoc-ref inputs "patch/rework-for-arm"))) + (zero? (system* "patch" "--force" "-p1" + "--input" patch-file)))) + %standard-phases)) + '())) + (home-page "http://nixos.org/patchelf.html") (synopsis "Modify the dynamic linker and RPATH of ELF executables") (description diff --git a/gnu/packages/patches/patchelf-rework-for-arm.patch b/gnu/packages/patches/patchelf-rework-for-arm.patch new file mode 100644 index 0000000000..6f4eb8f72b --- /dev/null +++ b/gnu/packages/patches/patchelf-rework-for-arm.patch @@ -0,0 +1,473 @@ +Rework the growing algorithm in patchelf to support ARM systems. +See . +This patch copied from: + + +From 0a96239cea6b97b9a0fff80da576e58ca2dfb2a2 Mon Sep 17 00:00:00 2001 +From: Sebastian Parschauer +Date: Sat, 28 Jun 2014 01:24:57 +0200 +Subject: [PATCH] Rework the growing algorithm + +On ARM systems there is no space in virtual memory for another LOAD +area in front of the code LOAD area. So insert data to its end +instead. At this location there should be enough space in virtual +memory due to alignment. We can extend it until the end of the +alignment but the file shift may be greater as it must be aligned +to the page size. Do the same for the data LOAD area. +--- + src/patchelf.cc | 357 ++++++++++++++++++++++---------------------------------- + 1 file changed, 142 insertions(+), 215 deletions(-) + +diff --git a/src/patchelf.cc b/src/patchelf.cc +index dcbfd38..4fce9e6 100644 +--- a/src/patchelf.cc ++++ b/src/patchelf.cc +@@ -116,7 +116,11 @@ private: + + void sortShdrs(); + +- void shiftFile(unsigned int extraPages, Elf_Addr startPage); ++ void shiftFileSingle(size_t fileShift, Elf_Off insertOff); ++ ++ void shiftFile(size_t neededCode, size_t neededData, ++ Elf_Off codeOff[], Elf_Off dataOff[], ++ Elf_Addr *codePage, Elf_Addr *dataPage); + + string getSectionName(const Elf_Shdr & shdr); + +@@ -130,13 +134,11 @@ private: + unsigned int size); + + void writeReplacedSections(Elf_Off & curOff, +- Elf_Addr startAddr, Elf_Off startOffset); ++ Elf_Addr startAddr, Elf_Off startOffset, bool isData); + + void rewriteHeaders(Elf_Addr phdrAddress); + +- void rewriteSectionsLibrary(); +- +- void rewriteSectionsExecutable(); ++ void rewriteSectionsBinary(); + + public: + +@@ -391,46 +393,119 @@ static unsigned int roundUp(unsigned int n, unsigned int m) + + + template +-void ElfFile::shiftFile(unsigned int extraPages, Elf_Addr startPage) ++void ElfFile::shiftFileSingle(size_t fileShift, ++ Elf_Off insertOff) + { +- /* Move the entire contents of the file `extraPages' pages +- further. */ + unsigned int oldSize = fileSize; +- unsigned int shift = extraPages * pageSize; +- growFile(fileSize + extraPages * pageSize); +- memmove(contents + extraPages * pageSize, contents, oldSize); +- memset(contents + sizeof(Elf_Ehdr), 0, shift - sizeof(Elf_Ehdr)); ++ ++ /* Grow at the end */ ++ growFile(fileSize + fileShift); ++ ++ /* move the data from the insertion point ++ to the end and zero inserted space */ ++ memmove(contents + insertOff + fileShift, ++ contents + insertOff, oldSize - insertOff); ++ memset(contents + insertOff, 0, fileShift); + + /* Adjust the ELF header. */ + wri(hdr->e_phoff, sizeof(Elf_Ehdr)); +- wri(hdr->e_shoff, rdi(hdr->e_shoff) + shift); ++ if (rdi(hdr->e_shoff) >= insertOff) ++ wri(hdr->e_shoff, rdi(hdr->e_shoff) + fileShift); + + /* Update the offsets in the section headers. */ +- for (int i = 1; i < rdi(hdr->e_shnum); ++i) +- wri(shdrs[i].sh_offset, rdi(shdrs[i].sh_offset) + shift); ++ for (int i = 1; i < rdi(hdr->e_shnum); ++i) { ++ if (rdi(shdrs[i].sh_offset) >= insertOff) ++ wri(shdrs[i].sh_offset, rdi(shdrs[i].sh_offset) + fileShift); ++ } + + /* Update the offsets in the program headers. */ + for (int i = 0; i < rdi(hdr->e_phnum); ++i) { +- wri(phdrs[i].p_offset, rdi(phdrs[i].p_offset) + shift); +- if (rdi(phdrs[i].p_align) != 0 && +- (rdi(phdrs[i].p_vaddr) - rdi(phdrs[i].p_offset)) % rdi(phdrs[i].p_align) != 0) { +- debug("changing alignment of program header %d from %d to %d\n", i, +- rdi(phdrs[i].p_align), pageSize); +- wri(phdrs[i].p_align, pageSize); ++ if (rdi(phdrs[i].p_offset) >= insertOff) ++ wri(phdrs[i].p_offset, rdi(phdrs[i].p_offset) + fileShift); ++ /* Check for ELF load command alignment issue the same ++ way as glibc/elf/dl-load.c does. This gives us the ++ chance to run an interpreter explicitly. */ ++ if (rdi(phdrs[i].p_type) == PT_LOAD && ((rdi(phdrs[i].p_vaddr) - ++ rdi(phdrs[i].p_offset)) & (rdi(phdrs[i].p_align) - 1)) != 0) { ++ debug("changing alignment of program header %d from %d to %d\n", ++ i, rdi(phdrs[i].p_align), pageSize); ++ wri(phdrs[i].p_align, pageSize); + } + } ++} ++ ++template ++void ElfFile::shiftFile(size_t neededCode, ++ size_t neededData, Elf_Off codeOff[], Elf_Off dataOff[], ++ Elf_Addr *codePage, Elf_Addr *dataPage) ++{ ++ /* Move some contents of the file further. The binary has one LOAD area ++ * for code and one for data. There is virtual memory space between ++ * these which we can use due to alignment. ++ */ ++ unsigned int memShift = neededCode; ++ unsigned int fileShift = roundUp(neededCode, pageSize); ++ unsigned int maxMemShift = 0; ++ ++ if (neededCode > 0) { ++ /* find the LOAD program header for code and extend it */ ++ for (int i = 0; i < rdi(hdr->e_phnum); ++i) { ++ if (rdi(phdrs[i].p_type) == PT_LOAD && ++ rdi(phdrs[i].p_flags) & PF_X) { ++ codeOff[1] = rdi(phdrs[i].p_filesz); ++ codeOff[0] = codeOff[1] + rdi(phdrs[i].p_offset); ++ maxMemShift = rdi(phdrs[i].p_memsz) % rdi(phdrs[i].p_align); ++ if (maxMemShift == 0) ++ continue; ++ maxMemShift = rdi(phdrs[i].p_align) - maxMemShift; ++ if (maxMemShift == 0 || memShift > maxMemShift) ++ continue; ++ *codePage = rdi(phdrs[i].p_vaddr); ++ wri(phdrs[i].p_filesz, rdi(phdrs[i].p_filesz) + memShift); ++ wri(phdrs[i].p_memsz, rdi(phdrs[i].p_memsz) + memShift); ++ break; ++ } ++ } ++ debug("codeOff: %#lx, memShift: %d, maxMemShift: %d, fileShift: %d\n", ++ codeOff[1], memShift, maxMemShift, fileShift); ++ if (codeOff[1] == 0 || maxMemShift == 0) ++ goto out; ++ ++ shiftFileSingle(fileShift, codeOff[0]); ++ } ++ ++ /* +++ Do the same for the data LOAD area +++ */ ++ memShift = neededData; ++ fileShift = roundUp(neededData, pageSize); ++ maxMemShift = 0; ++ if (neededData > 0) { ++ /* find the LOAD program header for data and extend it */ ++ for (int i = 0; i < rdi(hdr->e_phnum); ++i) { ++ if (rdi(phdrs[i].p_type) == PT_LOAD && ++ rdi(phdrs[i].p_flags) & PF_W) { ++ dataOff[1] = rdi(phdrs[i].p_filesz); ++ dataOff[0] = dataOff[1] + rdi(phdrs[i].p_offset); ++ maxMemShift = rdi(phdrs[i].p_memsz) % rdi(phdrs[i].p_align); ++ if (maxMemShift == 0) ++ continue; ++ maxMemShift = rdi(phdrs[i].p_align) - maxMemShift; ++ if (maxMemShift == 0 || memShift > maxMemShift) ++ continue; ++ *dataPage = rdi(phdrs[i].p_vaddr); ++ wri(phdrs[i].p_filesz, rdi(phdrs[i].p_filesz) + memShift); ++ wri(phdrs[i].p_memsz, rdi(phdrs[i].p_memsz) + memShift); ++ break; ++ } ++ } ++ debug("dataOff: %#lx, memShift: %d, maxMemShift: %d, fileShift: %d\n", ++ dataOff[1], memShift, maxMemShift, fileShift); ++ if (dataOff[1] == 0 || maxMemShift == 0) ++ goto out; + +- /* Add a segment that maps the new program/section headers and +- PT_INTERP segment into memory. Otherwise glibc will choke. */ +- phdrs.resize(rdi(hdr->e_phnum) + 1); +- wri(hdr->e_phnum, rdi(hdr->e_phnum) + 1); +- Elf_Phdr & phdr = phdrs[rdi(hdr->e_phnum) - 1]; +- wri(phdr.p_type, PT_LOAD); +- wri(phdr.p_offset, 0); +- wri(phdr.p_vaddr, wri(phdr.p_paddr, startPage)); +- wri(phdr.p_filesz, wri(phdr.p_memsz, shift)); +- wri(phdr.p_flags, PF_R | PF_W); +- wri(phdr.p_align, pageSize); ++ shiftFileSingle(fileShift, dataOff[0]); ++ } ++out: ++ return; + } + + +@@ -491,7 +566,7 @@ string & ElfFile::replaceSection(const SectionName & sectionN + + template + void ElfFile::writeReplacedSections(Elf_Off & curOff, +- Elf_Addr startAddr, Elf_Off startOffset) ++ Elf_Addr startAddr, Elf_Off startOffset, bool isData = false) + { + /* Overwrite the old section contents with 'X's. Do this + *before* writing the new section contents (below) to prevent +@@ -501,6 +576,9 @@ void ElfFile::writeReplacedSections(Elf_Off & curOff, + { + string sectionName = i->first; + Elf_Shdr & shdr = findSection(sectionName); ++ if ((!isData && rdi(shdr.sh_flags) & SHF_WRITE) || ++ (isData && ~(rdi(shdr.sh_flags)) & SHF_WRITE)) ++ continue; + memset(contents + rdi(shdr.sh_offset), 'X', rdi(shdr.sh_size)); + } + +@@ -509,6 +587,9 @@ void ElfFile::writeReplacedSections(Elf_Off & curOff, + { + string sectionName = i->first; + Elf_Shdr & shdr = findSection(sectionName); ++ if ((!isData && rdi(shdr.sh_flags) & SHF_WRITE) || ++ (isData && ~(rdi(shdr.sh_flags)) & SHF_WRITE)) ++ continue; + debug("rewriting section `%s' from offset 0x%x (size %d) to offset 0x%x (size %d)\n", + sectionName.c_str(), rdi(shdr.sh_offset), rdi(shdr.sh_size), curOff, i->second.size()); + +@@ -546,201 +627,47 @@ void ElfFile::writeReplacedSections(Elf_Off & curOff, + curOff += roundUp(i->second.size(), sectionAlignment); + } + +- replacedSections.clear(); ++ if (isData) ++ replacedSections.clear(); + } + + + template +-void ElfFile::rewriteSectionsLibrary() ++void ElfFile::rewriteSectionsBinary() + { +- /* For dynamic libraries, we just place the replacement sections +- at the end of the file. They're mapped into memory by a +- PT_LOAD segment located directly after the last virtual address +- page of other segments. */ +- Elf_Addr startPage = 0; +- for (unsigned int i = 0; i < phdrs.size(); ++i) { +- Elf_Addr thisPage = roundUp(rdi(phdrs[i].p_vaddr) + rdi(phdrs[i].p_memsz), pageSize); +- if (thisPage > startPage) startPage = thisPage; +- } +- +- debug("last page is 0x%llx\n", (unsigned long long) startPage); ++ Elf_Off codeOff[2] = {0}, dataOff[2] = {0}; ++ Elf_Addr codePage = 0, dataPage = 0; ++ size_t neededCode = 0, neededData = 0, oldCode = 0, oldData = 0; ++ Elf_Shdr shdr = findSection(".text"); ++ Elf_Addr firstPage = rdi(shdr.sh_addr) - rdi(shdr.sh_offset); + ++ debug("first page is 0x%llx\n", (unsigned long long) firstPage); + +- /* Compute the total space needed for the replaced sections and +- the program headers. */ +- off_t neededSpace = (phdrs.size() + 1) * sizeof(Elf_Phdr); ++ /* Compute the total space needed for the replaced sections */ + for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- neededSpace += roundUp(i->second.size(), sectionAlignment); +- debug("needed space is %d\n", neededSpace); +- +- +- size_t startOffset = roundUp(fileSize, pageSize); +- +- growFile(startOffset + neededSpace); +- +- +- /* Even though this file is of type ET_DYN, it could actually be +- an executable. For instance, Gold produces executables marked +- ET_DYN. In that case we can still hit the kernel bug that +- necessitated rewriteSectionsExecutable(). However, such +- executables also tend to start at virtual address 0, so +- rewriteSectionsExecutable() won't work because it doesn't have +- any virtual address space to grow downwards into. As a +- workaround, make sure that the virtual address of our new +- PT_LOAD segment relative to the first PT_LOAD segment is equal +- to its offset; otherwise we hit the kernel bug. This may +- require creating a hole in the executable. The bigger the size +- of the uninitialised data segment, the bigger the hole. */ +- if (isExecutable) { +- if (startOffset >= startPage) { +- debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); +- } else { +- size_t hole = startPage - startOffset; +- /* Print a warning, because the hole could be very big. */ +- fprintf(stderr, "warning: working around a Linux kernel bug by creating a hole of %zu bytes in ‘%s’\n", hole, fileName.c_str()); +- assert(hole % pageSize == 0); +- /* !!! We could create an actual hole in the file here, +- but it's probably not worth the effort. */ +- growFile(fileSize + hole); +- startOffset += hole; +- } +- startPage = startOffset; +- } +- +- +- /* Add a segment that maps the replaced sections and program +- headers into memory. */ +- phdrs.resize(rdi(hdr->e_phnum) + 1); +- wri(hdr->e_phnum, rdi(hdr->e_phnum) + 1); +- Elf_Phdr & phdr = phdrs[rdi(hdr->e_phnum) - 1]; +- wri(phdr.p_type, PT_LOAD); +- wri(phdr.p_offset, startOffset); +- wri(phdr.p_vaddr, wri(phdr.p_paddr, startPage)); +- wri(phdr.p_filesz, wri(phdr.p_memsz, neededSpace)); +- wri(phdr.p_flags, PF_R | PF_W); +- wri(phdr.p_align, pageSize); +- +- +- /* Write out the replaced sections. */ +- Elf_Off curOff = startOffset + phdrs.size() * sizeof(Elf_Phdr); +- writeReplacedSections(curOff, startPage, startOffset); +- assert((off_t) curOff == startOffset + neededSpace); +- +- +- /* Move the program header to the start of the new area. */ +- wri(hdr->e_phoff, startOffset); +- +- rewriteHeaders(startPage); +-} +- +- +-template +-void ElfFile::rewriteSectionsExecutable() +-{ +- /* Sort the sections by offset, otherwise we won't correctly find +- all the sections before the last replaced section. */ +- sortShdrs(); +- +- +- /* What is the index of the last replaced section? */ +- unsigned int lastReplaced = 0; +- for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) { +- string sectionName = getSectionName(shdrs[i]); +- if (replacedSections.find(sectionName) != replacedSections.end()) { +- debug("using replaced section `%s'\n", sectionName.c_str()); +- lastReplaced = i; +- } +- } +- +- assert(lastReplaced != 0); +- +- debug("last replaced is %d\n", lastReplaced); +- +- /* Try to replace all sections before that, as far as possible. +- Stop when we reach an irreplacable section (such as one of type +- SHT_PROGBITS). These cannot be moved in virtual address space +- since that would invalidate absolute references to them. */ +- assert(lastReplaced + 1 < shdrs.size()); /* !!! I'm lazy. */ +- size_t startOffset = rdi(shdrs[lastReplaced + 1].sh_offset); +- Elf_Addr startAddr = rdi(shdrs[lastReplaced + 1].sh_addr); +- string prevSection; +- for (unsigned int i = 1; i <= lastReplaced; ++i) { +- Elf_Shdr & shdr(shdrs[i]); +- string sectionName = getSectionName(shdr); +- debug("looking at section `%s'\n", sectionName.c_str()); +- /* !!! Why do we stop after a .dynstr section? I can't +- remember! */ +- if ((rdi(shdr.sh_type) == SHT_PROGBITS && sectionName != ".interp") +- || prevSection == ".dynstr") +- { +- startOffset = rdi(shdr.sh_offset); +- startAddr = rdi(shdr.sh_addr); +- lastReplaced = i - 1; +- break; ++ i != replacedSections.end(); ++i) { ++ shdr = findSection(i->first); ++ if (rdi(shdr.sh_flags) & SHF_WRITE) { ++ oldData += rdi(shdr.sh_size); ++ neededData += roundUp(i->second.size(), sectionAlignment); + } else { +- if (replacedSections.find(sectionName) == replacedSections.end()) { +- debug("replacing section `%s' which is in the way\n", sectionName.c_str()); +- replaceSection(sectionName, rdi(shdr.sh_size)); +- } ++ oldCode += rdi(shdr.sh_size); ++ neededCode += roundUp(i->second.size(), sectionAlignment); + } +- prevSection = sectionName; + } + +- debug("first reserved offset/addr is 0x%x/0x%llx\n", +- startOffset, (unsigned long long) startAddr); +- +- assert(startAddr % pageSize == startOffset % pageSize); +- Elf_Addr firstPage = startAddr - startOffset; +- debug("first page is 0x%llx\n", (unsigned long long) firstPage); +- +- /* Right now we assume that the section headers are somewhere near +- the end, which appears to be the case most of the time. +- Therefore they're not accidentally overwritten by the replaced +- sections. !!! Fix this. */ +- assert((off_t) rdi(hdr->e_shoff) >= startOffset); +- +- +- /* Compute the total space needed for the replaced sections, the +- ELF header, and the program headers. */ +- size_t neededSpace = sizeof(Elf_Ehdr) + phdrs.size() * sizeof(Elf_Phdr); +- for (ReplacedSections::iterator i = replacedSections.begin(); +- i != replacedSections.end(); ++i) +- neededSpace += roundUp(i->second.size(), sectionAlignment); +- +- debug("needed space is %d\n", neededSpace); +- +- /* If we need more space at the start of the file, then grow the +- file by the minimum number of pages and adjust internal +- offsets. */ +- if (neededSpace > startOffset) { +- +- /* We also need an additional program header, so adjust for that. */ +- neededSpace += sizeof(Elf_Phdr); +- debug("needed space is %d\n", neededSpace); +- +- unsigned int neededPages = roundUp(neededSpace - startOffset, pageSize) / pageSize; +- debug("needed pages is %d\n", neededPages); +- if (neededPages * pageSize > firstPage) +- error("virtual address space underrun!"); +- +- firstPage -= neededPages * pageSize; +- startOffset += neededPages * pageSize; +- +- shiftFile(neededPages, firstPage); +- } +- +- +- /* Clear out the free space. */ +- Elf_Off curOff = sizeof(Elf_Ehdr) + phdrs.size() * sizeof(Elf_Phdr); +- debug("clearing first %d bytes\n", startOffset - curOff); +- memset(contents + curOff, 0, startOffset - curOff); ++ debug("needed space is C: %d, D: %d\n", neededCode, neededData); + ++ /* If we need more space within the file, then grow the ++ file and adjust internal offsets. */ ++ shiftFile(neededCode, neededData, codeOff, dataOff, &codePage, ++ &dataPage); ++ assert(codeOff[0] > 0); + + /* Write out the replaced sections. */ +- writeReplacedSections(curOff, firstPage, 0); +- assert((off_t) curOff == neededSpace); +- ++ debug("codePage: %#lx, dataPage: %#lx\n", codePage, dataPage); ++ writeReplacedSections(codeOff[0], codePage + codeOff[1], codeOff[0]); ++ writeReplacedSections(dataOff[0], dataPage + dataOff[1], dataOff[0], true); + + rewriteHeaders(firstPage + rdi(hdr->e_phoff)); + } +@@ -758,10 +685,10 @@ void ElfFile::rewriteSections() + + if (rdi(hdr->e_type) == ET_DYN) { + debug("this is a dynamic library\n"); +- rewriteSectionsLibrary(); ++ rewriteSectionsBinary(); + } else if (rdi(hdr->e_type) == ET_EXEC) { + debug("this is an executable\n"); +- rewriteSectionsExecutable(); ++ rewriteSectionsBinary(); + } else error("unknown ELF type"); + } + +-- +2.1.2 + -- cgit v1.2.3 From aa1e19477b2d78884fc500fef497cd6677604d9b Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Wed, 31 Dec 2014 04:23:12 -0500 Subject: gnu: Add bootstrap binaries for 'armhf-linux'. * gnu/packages/bootstrap/armhf-linux/bash, gnu/packages/bootstrap/armhf-linux/mkdir, gnu/packages/bootstrap/armhf-linux/tar, gnu/packages/bootstrap/armhf-linux/xz: New files. * gnu-system.am (bootstrap_armhf_linuxdir, dist_bootstrap_armhf_linux_DATA) (nodist_bootstrap_armhf_linux_DATA): New variables. (DISTCLEANFILES): Add $(nodist_bootstrap_armhf_linux_DATA). (gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz): New target. * build-aux/download.scm (file-name->uri): Use newer date in URI for armhf-linux. * gnu/packages/bootstrap.scm (raw-build): Use "guile-2.0.11.tar.xz" on armhf-linux. (glibc-dynamic-linker, %bootstrap-coreutils&co, %bootstrap-binutils) (%bootstrap-glibc, %bootstrap-gcc): Add armhf-linux cases. * m4/guix.m4 (GUIX_SYSTEM_TYPE): Add armhf case. (GUIX_ASSERT_SUPPORTED_SYSTEM): Add armhf-linux to list of supported systems. * doc/guix.texi (GNU Distribution): Add armhf-linux to the list of supported systems. --- .gitignore | 1 + build-aux/download.scm | 8 +++++- doc/guix.texi | 4 +++ gnu-system.am | 13 ++++++++++ gnu/packages/bootstrap.scm | 42 +++++++++++++++++++++++++++---- gnu/packages/bootstrap/armhf-linux/bash | Bin 0 -> 802224 bytes gnu/packages/bootstrap/armhf-linux/mkdir | Bin 0 -> 401544 bytes gnu/packages/bootstrap/armhf-linux/tar | Bin 0 -> 755356 bytes gnu/packages/bootstrap/armhf-linux/xz | Bin 0 -> 502884 bytes m4/guix.m4 | 13 +++++++++- 10 files changed, 74 insertions(+), 7 deletions(-) create mode 100755 gnu/packages/bootstrap/armhf-linux/bash create mode 100755 gnu/packages/bootstrap/armhf-linux/mkdir create mode 100755 gnu/packages/bootstrap/armhf-linux/tar create mode 100755 gnu/packages/bootstrap/armhf-linux/xz (limited to 'gnu-system.am') diff --git a/.gitignore b/.gitignore index bcb82aa26d..3ec36366e3 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ config.cache /doc/version.texi /gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz /gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz +/gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz /gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz /guix/config.scm /nix/nix-daemon/nix-daemon.cc diff --git a/build-aux/download.scm b/build-aux/download.scm index 50123f59d2..a107a887dc 100644 --- a/build-aux/download.scm +++ b/build-aux/download.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Ludovic Courtès +;;; Copyright © 2014, 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -45,7 +46,12 @@ (define (file-name->uri file) (match (string-tokenize file (char-set-complement (char-set #\/))) ((_ ... system basename) (string->uri (string-append %url-base "/" system - "/20131110/" basename))))) + (match system + ("armhf-linux" + "/20150101/") + (_ + "/20131110/")) + basename))))) (match (command-line) ((_ file expected-hash) diff --git a/doc/guix.texi b/doc/guix.texi index 12a1808137..65d5eaea0e 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -3246,6 +3246,10 @@ Intel/AMD @code{x86_64} architecture, Linux-Libre kernel; @item i686-linux Intel 32-bit architecture (IA32), Linux-Libre kernel; +@item armhf-linux +ARMv7-A architecture with hard float, Thumb-2 and VFP3D16 coprocessor, +using the EABI hard-float ABI, and Linux-Libre kernel. + @item mips64el-linux little-endian 64-bit MIPS processors, specifically the Loongson series, n32 application binary interface (ABI), and Linux-Libre kernel. diff --git a/gnu-system.am b/gnu-system.am index 06e96fb784..a00b83dbf4 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -495,6 +495,7 @@ dist_patch_DATA = \ bootstrapdir = $(guilemoduledir)/gnu/packages/bootstrap bootstrap_x86_64_linuxdir = $(bootstrapdir)/x86_64-linux bootstrap_i686_linuxdir = $(bootstrapdir)/i686-linux +bootstrap_armhf_linuxdir = $(bootstrapdir)/armhf-linux bootstrap_mips64el_linuxdir = $(bootstrapdir)/mips64el-linux dist_bootstrap_x86_64_linux_DATA = \ @@ -509,6 +510,12 @@ dist_bootstrap_i686_linux_DATA = \ gnu/packages/bootstrap/i686-linux/tar \ gnu/packages/bootstrap/i686-linux/xz +dist_bootstrap_armhf_linux_DATA = \ + gnu/packages/bootstrap/armhf-linux/bash \ + gnu/packages/bootstrap/armhf-linux/mkdir \ + gnu/packages/bootstrap/armhf-linux/tar \ + gnu/packages/bootstrap/armhf-linux/xz + dist_bootstrap_mips64el_linux_DATA = \ gnu/packages/bootstrap/mips64el-linux/bash \ gnu/packages/bootstrap/mips64el-linux/mkdir \ @@ -521,6 +528,8 @@ nodist_bootstrap_x86_64_linux_DATA = \ gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz nodist_bootstrap_i686_linux_DATA = \ gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz +nodist_bootstrap_armhf_linux_DATA = \ + gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz nodist_bootstrap_mips64el_linux_DATA = \ gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz @@ -532,6 +541,7 @@ set-bootstrap-executable-permissions: DISTCLEANFILES = \ $(nodist_bootstrap_x86_64_linux_DATA) \ $(nodist_bootstrap_i686_linux_DATA) \ + $(nodist_bootstrap_armhf_linux_DATA) \ $(nodist_bootstrap_mips64el_linux_DATA) # Method to download a file from an external source. @@ -546,6 +556,9 @@ gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz: gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz: $(MKDIR_P) `dirname "$@"` $(DOWNLOAD_FILE) "$@" "b757cd46bf13ecac83fb8e955fb50096ac2d17bb610ca8eb816f29302a00a846" +gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz: + $(MKDIR_P) `dirname "$@"` + $(DOWNLOAD_FILE) "$@" "e551d05d4d385d6706ab8d574856a087758294dc90ab4c06e70a157a685e23d6" gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz: $(MKDIR_P) `dirname "$@"` $(DOWNLOAD_FILE) "$@" "994680f0001346864aa2c2cc5110f380ee7518dcd701c614291682b8e948f73b" diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index e1b50a1e4f..8373c4b5c8 100644 --- a/gnu/packages/bootstrap.scm +++ b/gnu/packages/bootstrap.scm @@ -192,7 +192,11 @@ (define (->store file) (xz (->store "xz")) (mkdir (->store "mkdir")) (bash (->store "bash")) - (guile (->store "guile-2.0.9.tar.xz")) + (guile (->store (match system + ("armhf-linux" + "guile-2.0.11.tar.xz") + (_ + "guile-2.0.9.tar.xz")))) (builder (add-text-to-store store "build-bootstrap-guile.sh" @@ -252,7 +256,11 @@ (define %bootstrap-coreutils&co (origin (method url-fetch) (uri (map (cut string-append <> "/" system - "/20131110/static-binaries.tar.xz") + (match system + ("armhf-linux" + "/20150101/static-binaries.tar.xz") + (_ + "/20131110/static-binaries.tar.xz"))) %bootstrap-base-urls)) (sha256 (match system @@ -262,6 +270,9 @@ (define %bootstrap-coreutils&co ("i686-linux" (base32 "0s5b3jb315n13m1k8095l0a5hfrsz8g0fv1b6riyc5hnxqyphlak")) + ("armhf-linux" + (base32 + "0gf0fn2kbpxkjixkmx5f4z6hv6qpmgixl69zgg74dbsfdfj8jdv5")) ("mips64el-linux" (base32 "072y4wyfsj1bs80r6vbybbafy8ya4vfy7qj25dklwk97m6g71753")))))) @@ -281,7 +292,11 @@ (define %bootstrap-binutils (origin (method url-fetch) (uri (map (cut string-append <> "/" system - "/20131110/binutils-2.23.2.tar.xz") + (match system + ("armhf-linux" + "/20150101/binutils-2.25.tar.xz") + (_ + "/20131110/binutils-2.23.2.tar.xz"))) %bootstrap-base-urls)) (sha256 (match system @@ -291,6 +306,9 @@ (define %bootstrap-binutils ("i686-linux" (base32 "14jgwf9gscd7l2pnz610b1zia06dvcm2qyzvni31b8zpgmcai2v9")) + ("armhf-linux" + (base32 + "1v7dj6bzn6m36f20gw31l99xaabq4xrhrx3gwqkhhig0mdlmr69q")) ("mips64el-linux" (base32 "1x8kkhcxmfyzg1ddpz2pxs6fbdl6412r7x0nzbmi5n7mj8zw2gy7")))))) @@ -335,7 +353,11 @@ (define %bootstrap-glibc (origin (method url-fetch) (uri (map (cut string-append <> "/" (%current-system) - "/20131110/glibc-2.18.tar.xz") + (match (%current-system) + ("armhf-linux" + "/20150101/glibc-2.20.tar.xz") + (_ + "/20131110/glibc-2.18.tar.xz"))) %bootstrap-base-urls)) (sha256 (match (%current-system) @@ -345,6 +367,9 @@ (define %bootstrap-glibc ("i686-linux" (base32 "1hgrccw1zqdc7lvgivwa54d9l3zsim5pqm0dykxg0z522h6gr05w")) + ("armhf-linux" + (base32 + "18cmgvpllqfpn6khsmivqib7ys8ymnq0hdzi3qp24prik0ykz8gn")) ("mips64el-linux" (base32 "0k97a3whzx3apsi9n2cbsrr79ad6lh00klxph9hw4fqyp1abkdsg"))))))))) @@ -406,7 +431,11 @@ (define %bootstrap-gcc (origin (method url-fetch) (uri (map (cut string-append <> "/" (%current-system) - "/20131110/gcc-4.8.2.tar.xz") + (match (%current-system) + ("armhf-linux" + "/20150101/gcc-4.8.4.tar.xz") + (_ + "/20131110/gcc-4.8.2.tar.xz"))) %bootstrap-base-urls)) (sha256 (match (%current-system) @@ -416,6 +445,9 @@ (define %bootstrap-gcc ("i686-linux" (base32 "150c1arrf2k8vfy6dpxh59vcgs4p1bgiz2av5m19dynpks7rjnyw")) + ("armhf-linux" + (base32 + "0ghz825yzp43fxw53kd6afm8nkz16f7dxi9xi40bfwc8x3nbbr8v")) ("mips64el-linux" (base32 "1m5miqkyng45l745n0sfafdpjkqv9225xf44jqkygwsipj2cv9ks"))))))))) diff --git a/gnu/packages/bootstrap/armhf-linux/bash b/gnu/packages/bootstrap/armhf-linux/bash new file mode 100755 index 0000000000..212a22c8ce Binary files /dev/null and b/gnu/packages/bootstrap/armhf-linux/bash differ diff --git a/gnu/packages/bootstrap/armhf-linux/mkdir b/gnu/packages/bootstrap/armhf-linux/mkdir new file mode 100755 index 0000000000..c3e5246e92 Binary files /dev/null and b/gnu/packages/bootstrap/armhf-linux/mkdir differ diff --git a/gnu/packages/bootstrap/armhf-linux/tar b/gnu/packages/bootstrap/armhf-linux/tar new file mode 100755 index 0000000000..5a6aac8a58 Binary files /dev/null and b/gnu/packages/bootstrap/armhf-linux/tar differ diff --git a/gnu/packages/bootstrap/armhf-linux/xz b/gnu/packages/bootstrap/armhf-linux/xz new file mode 100755 index 0000000000..a77aebc268 Binary files /dev/null and b/gnu/packages/bootstrap/armhf-linux/xz differ diff --git a/m4/guix.m4 b/m4/guix.m4 index 19e041a72c..d4415598b0 100644 --- a/m4/guix.m4 +++ b/m4/guix.m4 @@ -1,5 +1,6 @@ dnl GNU Guix --- Functional package management for GNU dnl Copyright © 2012, 2013, 2014 Ludovic Courtès +dnl Copyright © 2014 Mark H Weaver dnl dnl This file is part of GNU Guix. dnl @@ -50,6 +51,16 @@ AC_DEFUN([GUIX_SYSTEM_TYPE], [ machine_name="i686";; amd64) machine_name="x86_64";; + arm*) + # TODO: If not cross-compiling, add a sanity check to make + # sure this build machine has the needed features to + # support executables compiled using our armhf gcc, + # configured with: + # --with-arch=armv7-a + # --with-float=hard + # --with-mode=thumb + # --with-fpu=vfpv3-d16 + machine_name="armhf";; *) machine_name="$host_cpu";; esac @@ -86,7 +97,7 @@ courageous and port the GNU System distribution to it (see # Currently only Linux-based systems are supported, and only on some # platforms. case "$guix_system" in - x86_64-linux|i686-linux|mips64el-linux) + x86_64-linux|i686-linux|armhf-linux|mips64el-linux) ;; *) if test "x$guix_courageous" = "xyes"; then -- cgit v1.2.3 From 74d72608b35e1840a4e784b3a901e17d4f495dc1 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Sun, 11 Jan 2015 09:43:22 -0500 Subject: gnu: curl: Update to 7.40.0. * gnu/packages/patches/curl-gss-api-fix.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. * gnu/packages/curl.scm (curl): Update to 7.40.0. Add patch. --- gnu-system.am | 1 + gnu/packages/curl.scm | 6 +++-- gnu/packages/patches/curl-gss-api-fix.patch | 38 +++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gnu/packages/patches/curl-gss-api-fix.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 70e347d2c0..73d45a7cd1 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -348,6 +348,7 @@ dist_patch_DATA = \ gnu/packages/patches/cpio-gets-undeclared.patch \ gnu/packages/patches/cssc-gets-undeclared.patch \ gnu/packages/patches/cssc-missing-include.patch \ + gnu/packages/patches/curl-gss-api-fix.patch \ gnu/packages/patches/cursynth-wave-rand.patch \ gnu/packages/patches/dbus-localstatedir.patch \ gnu/packages/patches/diffutils-gets-undeclared.patch \ diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm index f595e7259c..8792ddceaf 100644 --- a/gnu/packages/curl.scm +++ b/gnu/packages/curl.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014 Andreas Enge +;;; Copyright © 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,14 +37,15 @@ (define-module (gnu packages curl) (define-public curl (package (name "curl") - (version "7.37.1") + (version "7.40.0") (source (origin (method url-fetch) (uri (string-append "http://curl.haxx.se/download/curl-" version ".tar.lzma")) (sha256 (base32 - "10yfh4hy8wbkj43la238hg6h8i9wyp1cvvk8kl0giac1020imn5d")))) + "1a15fdc26b3vwwmchzzpd3l1hfyhx06dn7b6lkikqd7kgwvg5ps7")) + (patches (list (search-patch "curl-gss-api-fix.patch"))))) (build-system gnu-build-system) (inputs `(("gnutls" ,gnutls) ("gss" ,gss) diff --git a/gnu/packages/patches/curl-gss-api-fix.patch b/gnu/packages/patches/curl-gss-api-fix.patch new file mode 100644 index 0000000000..ea838ae8c7 --- /dev/null +++ b/gnu/packages/patches/curl-gss-api-fix.patch @@ -0,0 +1,38 @@ +Copied from upstream: +https://github.com/bagder/curl/commit/5c0e66d63214e0306197c5a3f162441e074f3401.patch + +From 5c0e66d63214e0306197c5a3f162441e074f3401 Mon Sep 17 00:00:00 2001 +From: Steve Holme +Date: Thu, 8 Jan 2015 19:23:53 +0000 +Subject: [PATCH] sasl_gssapi: Fixed build on NetBSD with built-in GSS-API + +Bug: http://curl.haxx.se/bug/view.cgi?id=1469 +Reported-by: Thomas Klausner +--- + lib/curl_sasl_gssapi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/lib/curl_sasl_gssapi.c b/lib/curl_sasl_gssapi.c +index 6dda0e9..a50646a 100644 +--- a/lib/curl_sasl_gssapi.c ++++ b/lib/curl_sasl_gssapi.c +@@ -6,6 +6,7 @@ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2014, Steve Holme, . ++ * Copyright (C) 2015, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms +@@ -126,7 +127,7 @@ CURLcode Curl_sasl_create_gssapi_user_message(struct SessionHandle *data, + + /* Import the SPN */ + gss_major_status = gss_import_name(&gss_minor_status, &spn_token, +- gss_nt_service_name, &krb5->spn); ++ GSS_C_NT_HOSTBASED_SERVICE, &krb5->spn); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, "gss_import_name() failed: "); + +-- +2.2.1 + -- cgit v1.2.3 From 798e004538664489243d784c2dfa75b9fd7277a6 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Sun, 11 Jan 2015 15:21:19 -0500 Subject: gnu: sqlite: Update to 3.8.7.4. * gnu/packages/patches/sqlite-large-page-size-fix.patch: Remove file. * gnu-system.am (dist_patch_DATA): Remove it. * gnu/packages/databases.scm (sqlite): Update to 3.8.7.4. Remove patch. --- gnu-system.am | 1 - gnu/packages/databases.scm | 8 +- .../patches/sqlite-large-page-size-fix.patch | 180 --------------------- 3 files changed, 3 insertions(+), 186 deletions(-) delete mode 100644 gnu/packages/patches/sqlite-large-page-size-fix.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 73d45a7cd1..a166adda2d 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -459,7 +459,6 @@ dist_patch_DATA = \ gnu/packages/patches/slim-sigusr1.patch \ gnu/packages/patches/soprano-find-clucene.patch \ gnu/packages/patches/source-highlight-regexrange-test.patch \ - gnu/packages/patches/sqlite-large-page-size-fix.patch \ gnu/packages/patches/superlu-dist-scotchmetis.patch \ gnu/packages/patches/tcsh-fix-autotest.patch \ gnu/packages/patches/teckit-cstdio.patch \ diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm index 5a7b9950a1..8d21248fe5 100644 --- a/gnu/packages/databases.scm +++ b/gnu/packages/databases.scm @@ -3,7 +3,7 @@ ;;; Copyright © 2012, 2014 Andreas Enge ;;; Copyright © 2013 Cyril Roelandt ;;; Copyright © 2014 David Thompson -;;; Copyright © 2014 Mark H Weaver +;;; Copyright © 2014, 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -213,7 +213,7 @@ (define-public recutils (define-public sqlite (package (name "sqlite") - (version "3.8.4.3") + (version "3.8.7.4") (source (origin (method url-fetch) ;; TODO: Download from sqlite.org once this bug : @@ -233,9 +233,7 @@ (define-public sqlite "/sqlite-autoconf-" numeric-version ".tar.gz"))) (sha256 (base32 - "0rcdsk5sz34w8vy0g5yhfms4saiq81i872jxx5m5sjij7bi9bsg0")) - (patches - (list (search-patch "sqlite-large-page-size-fix.patch"))))) + "1v2rhgsx27in6dcvxk0pkxc0zrbl38biimjg6c1zxz85jh9hydw6")))) (build-system gnu-build-system) (inputs `(("readline" ,readline))) diff --git a/gnu/packages/patches/sqlite-large-page-size-fix.patch b/gnu/packages/patches/sqlite-large-page-size-fix.patch deleted file mode 100644 index c561fa20a2..0000000000 --- a/gnu/packages/patches/sqlite-large-page-size-fix.patch +++ /dev/null @@ -1,180 +0,0 @@ -Add an experimental fix to avoid attempting to mmap memory from an -offset that is not a multiple of the system page size on systems with -page sizes larger than 32KB. - -Patch by Dan Kennedy . - ---- sqlite-autoconf/sqlite3.c.orig 2014-03-22 23:44:47.055908203 -0400 -+++ sqlite-autoconf/sqlite3.c 2014-03-22 23:44:06.716552734 -0400 -@@ -24010,6 +24010,7 @@ - - /* Forward reference */ - static int openDirectory(const char*, int*); -+static int unixGetpagesize(void); - - /* - ** Many system calls are accessed through pointer-to-functions so that -@@ -24133,6 +24134,9 @@ - #define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[23].pCurrent) - #endif - -+ { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, -+#define osGetpagesize ((int(*)(void))aSyscall[24].pCurrent) -+ - }; /* End of the overrideable system calls */ - - /* -@@ -27792,6 +27796,36 @@ - return rc; - } - -+/* -+** Return the system page size. -+** -+** This function should not be called directly by other code in this file. -+** Instead, it should be called via macro osGetpagesize(). -+*/ -+static int unixGetpagesize(void){ -+#if defined(_BSD_SOURCE) -+ return getpagesize(); -+#else -+ return (int)sysconf(_SC_PAGESIZE); -+#endif -+} -+ -+/* -+** Return the minimum number of 32KB shm regions that should be mapped at -+** a time, assuming that each mapping must be an integer multiple of the -+** current system page-size. -+** -+** Usually, this is 1. The exception seems to be systems that are configured -+** to use 64KB pages - in this case each mapping must cover at least two -+** shm regions. -+*/ -+static int unixShmRegionPerMap(void){ -+ int shmsz = 32*1024; /* SHM region size */ -+ int pgsz = osGetpagesize(); /* System page size */ -+ assert( ((pgsz-1)&pgsz)==0 ); /* Page size must be a power of 2 */ -+ if( pgszpInode->pShmNode; - assert( unixMutexHeld() ); - if( p && p->nRef==0 ){ -+ int nShmPerMap = unixShmRegionPerMap(); - int i; - assert( p->pInode==pFd->pInode ); - sqlite3_mutex_free(p->mutex); -- for(i=0; inRegion; i++){ -+ for(i=0; inRegion; i+=nShmPerMap){ - if( p->h>=0 ){ - osMunmap(p->apRegion[i], p->szRegion); - }else{ -@@ -28013,6 +28048,8 @@ - unixShm *p; - unixShmNode *pShmNode; - int rc = SQLITE_OK; -+ int nShmPerMap = unixShmRegionPerMap(); -+ int nReqRegion; - - /* If the shared-memory file has not yet been opened, open it now. */ - if( pDbFd->pShm==0 ){ -@@ -28028,9 +28065,12 @@ - assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); - assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); - -- if( pShmNode->nRegion<=iRegion ){ -+ /* Minimum number of regions required to be mapped. */ -+ nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; -+ -+ if( pShmNode->nRegionszRegion = szRegion; -@@ -28079,17 +28119,19 @@ - - /* Map the requested memory region into this processes address space. */ - apNew = (char **)sqlite3_realloc( -- pShmNode->apRegion, (iRegion+1)*sizeof(char *) -+ pShmNode->apRegion, nReqRegion*sizeof(char *) - ); - if( !apNew ){ - rc = SQLITE_IOERR_NOMEM; - goto shmpage_out; - } - pShmNode->apRegion = apNew; -- while(pShmNode->nRegion<=iRegion){ -+ while( pShmNode->nRegionh>=0 ){ -- pMem = osMmap(0, szRegion, -+ pMem = osMmap(0, nMap, - pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, - MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion - ); -@@ -28105,8 +28147,11 @@ - } - memset(pMem, 0, szRegion); - } -- pShmNode->apRegion[pShmNode->nRegion] = pMem; -- pShmNode->nRegion++; -+ -+ for(i=0; iapRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; -+ } -+ pShmNode->nRegion += nShmPerMap; - } - } - -@@ -28321,19 +28366,6 @@ - } - - /* --** Return the system page size. --*/ --static int unixGetPagesize(void){ --#if HAVE_MREMAP -- return 512; --#elif defined(_BSD_SOURCE) -- return getpagesize(); --#else -- return (int)sysconf(_SC_PAGESIZE); --#endif --} -- --/* - ** Attempt to set the size of the memory mapping maintained by file - ** descriptor pFd to nNew bytes. Any existing mapping is discarded. - ** -@@ -28369,8 +28401,12 @@ - if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; - - if( pOrig ){ -- const int szSyspage = unixGetPagesize(); -+#if HAVE_MREMAP -+ i64 nReuse = pFd->mmapSize; -+#else -+ const int szSyspage = osGetpagesize(); - i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); -+#endif - u8 *pReq = &pOrig[nReuse]; - - /* Unmap any pages of the existing mapping that cannot be reused. */ -@@ -31116,7 +31152,7 @@ - - /* Double-check that the aSyscall[] array has been constructed - ** correctly. See ticket [bb3a86e890c8e96ab] */ -- assert( ArraySize(aSyscall)==24 ); -+ assert( ArraySize(aSyscall)==25 ); - - /* Register all VFSes defined in the aVfs[] array */ - for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ -- cgit v1.2.3 From b01a0ba86e93012044f42c41ba5cbc7d7936c356 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Thu, 15 Jan 2015 18:46:23 -0500 Subject: gnu: gd: Update to 2.1.1. * gnu/packages/patches/gd-mips64-deplibs-fix.patch: Remove file. * gnu-system.am (dist_patch_DATA): Remove it. * gnu/packages/gd.scm (gd): Update to 2.1.1. Update source URI. Remove patch. Remove 'chdir' phase. Add pkg-config to native-inputs. --- gnu-system.am | 1 - gnu/packages/gd.scm | 22 ++++++++++------------ gnu/packages/patches/gd-mips64-deplibs-fix.patch | 17 ----------------- 3 files changed, 10 insertions(+), 30 deletions(-) delete mode 100644 gnu/packages/patches/gd-mips64-deplibs-fix.patch (limited to 'gnu-system.am') diff --git a/gnu-system.am b/gnu-system.am index 4473651ab9..8cd2c68e0b 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -362,7 +362,6 @@ dist_patch_DATA = \ gnu/packages/patches/flex-bison-tests.patch \ gnu/packages/patches/gawk-shell.patch \ gnu/packages/patches/gcc-cross-environment-variables.patch \ - gnu/packages/patches/gd-mips64-deplibs-fix.patch \ gnu/packages/patches/glib-tests-desktop.patch \ gnu/packages/patches/glib-tests-homedir.patch \ gnu/packages/patches/glib-tests-prlimit.patch \ diff --git a/gnu/packages/gd.scm b/gnu/packages/gd.scm index caeaeae36b..2d6ccb8d7d 100644 --- a/gnu/packages/gd.scm +++ b/gnu/packages/gd.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Ludovic Courtès +;;; Copyright © 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,7 @@ (define-module (gnu packages gd) #:use-module (gnu packages image) #:use-module (gnu packages fontutils) #:use-module (gnu packages compression) + #:use-module (gnu packages pkg-config) #:use-module ((guix licenses) #:select (bsd-style))) (define-public gd @@ -31,25 +33,21 @@ (define-public gd (name "gd") ;; Note: With libgd.org now pointing to bitbucket.org, genuine old - ;; tarballs are no longer available. Notably, versions 2.0.34 and .35 are + ;; tarballs are no longer available. Notably, versions 2.0.x are ;; missing. - (version "2.0.33") + (version "2.1.1") (source (origin (method url-fetch) - (uri "https://bitbucket.org/libgd/gd-libgd/get/GD_2_0_33.tar.gz") + (uri (string-append + "https://bitbucket.org/libgd/gd-libgd/downloads/" + "libgd-" version ".tar.xz")) (sha256 (base32 - "0yrbx8mj9pykyzm0zl1q86xlkdvkajcsf5jmg688vhw9yc5wmbbw")) - (patches - (list (search-patch "gd-mips64-deplibs-fix.patch"))))) + "11djy9flzxczphigqgp7fbbblbq35gqwwhn9xfcckawlapa1xnls")))) (build-system gnu-build-system) - (arguments - '(#:phases (alist-cons-after - 'unpack 'chdir - (lambda _ - (chdir "src")) - %standard-phases))) + (native-inputs + `(("pkg-config" ,pkg-config))) (inputs `(("freetype" ,freetype) ("libpng" ,libpng) diff --git a/gnu/packages/patches/gd-mips64-deplibs-fix.patch b/gnu/packages/patches/gd-mips64-deplibs-fix.patch deleted file mode 100644 index 6231310cdb..0000000000 --- a/gnu/packages/patches/gd-mips64-deplibs-fix.patch +++ /dev/null @@ -1,17 +0,0 @@ -Patch configure script to choose pass_all deplibs check method for -linux-gnu* systems on mips64. This is a temporary hack until libgd -bootstraps their build system with a newer libtool. - -Patch by Mark H Weaver . - ---- libgd-gd/src/configure.orig 2006-04-05 11:56:57.000000000 -0400 -+++ libgd-gd/src/configure 2013-11-02 17:56:19.123995838 -0400 -@@ -4457,7 +4457,7 @@ - # This must be Linux ELF. - linux-gnu*) - case $host_cpu in -- alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64* | s390* | x86_64*) -+ alpha* | hppa* | i*86 | mips | mipsel | mips64 | mips64el | powerpc* | sparc* | ia64* | s390* | x86_64*) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM -- cgit v1.2.3