~ruther/guix-local

0841dcf7dd8e6c3e474f75cfa5b95a7feaf6f112 — Mark H Weaver 12 years ago e7fc17b
gnu: patchelf: Fix platform page size determination.

* gnu/packages/patches/patchelf-page-size.patch: New file.
* gnu/packages/elf.scm (patchelf): Add the patch.
* gnu-system.am (dist_patch_DATA): Add the patch.
3 files changed, 73 insertions(+), 1 deletions(-)

M gnu-system.am
M gnu/packages/elf.scm
A gnu/packages/patches/patchelf-page-size.patch
M gnu-system.am => gnu-system.am +1 -0
@@ 291,6 291,7 @@ dist_patch_DATA =						\
  gnu/packages/patches/make-impure-dirs.patch			\
  gnu/packages/patches/mcron-install.patch			\
  gnu/packages/patches/mit-krb5-init-fix.patch			\
  gnu/packages/patches/patchelf-page-size.patch			\
  gnu/packages/patches/perl-no-sys-dirs.patch			\
  gnu/packages/patches/plotutils-libpng-jmpbuf.patch		\
  gnu/packages/patches/procps-make-3.82.patch			\

M gnu/packages/elf.scm => gnu/packages/elf.scm +3 -1
@@ 21,6 21,7 @@
  #:use-module (guix download)
  #:use-module (guix build-system gnu)
  #:use-module ((guix licenses) #:select (gpl3+ lgpl3+ lgpl2.0+))
  #:use-module (gnu packages)
  #:use-module (gnu packages m4)
  #:use-module (gnu packages compression))



@@ 92,7 93,8 @@
                   "/patchelf-" version ".tar.bz2"))
             (sha256
              (base32
               "00bw29vdsscsili65wcb5ay0gvg1w0ljd00sb5xc6br8bylpyzpw"))))
               "00bw29vdsscsili65wcb5ay0gvg1w0ljd00sb5xc6br8bylpyzpw"))
             (patches (list (search-patch "patchelf-page-size.patch")))))
    (build-system gnu-build-system)
    (home-page "http://nixos.org/patchelf.html")
    (synopsis "Modify the dynamic linker and RPATH of ELF executables")

A gnu/packages/patches/patchelf-page-size.patch => gnu/packages/patches/patchelf-page-size.patch +69 -0
@@ 0,0 1,69 @@
Improve the determination of pageSize in patchelf.cc.

Patch by Mark H Weaver <mhw@netris.org>.

--- patchelf/src/patchelf.cc.orig	1969-12-31 19:00:01.000000000 -0500
+++ patchelf/src/patchelf.cc	2014-02-16 20:15:06.283203125 -0500
@@ -21,11 +21,19 @@
 using namespace std;
 
 
-#ifdef MIPSEL
-/* The lemote fuloong 2f kernel defconfig sets a page size of 16KB */
-const unsigned int pageSize = 4096*4;
-#else
+/* Note that some platforms support multiple page sizes.  Therefore,
+   it is not enough to query the current page size.  'pageSize' must
+   be the maximum architectural page size for the platform, which is
+   typically defined in the corresponding ABI document.
+
+   XXX FIXME: This won't work when we're cross-compiling.  */
+
+#if defined __MIPSEL__ || defined __MIPSEB__ || defined __aarch64__
+const unsigned int pageSize = 65536;
+#elif defined __x86_64__ || defined __i386__ || defined __arm__
 const unsigned int pageSize = 4096;
+#else
+# error maximum architectural page size unknown for this platform
 #endif
 
 
--- patchelf/tests/no-rpath.sh.orig	1969-12-31 19:00:01.000000000 -0500
+++ patchelf/tests/no-rpath.sh	2014-02-16 20:44:12.036376953 -0500
@@ -1,22 +1,22 @@
 #! /bin/sh -e
 
-rm -rf scratch
-mkdir -p scratch
+if [ "$(uname -m)" = i686 -a "$(uname -s)" = Linux ]; then
+    rm -rf scratch
+    mkdir -p scratch
 
-cp no-rpath scratch/
+    cp no-rpath scratch/
 
-oldRPath=$(../src/patchelf --print-rpath scratch/no-rpath)
-if test -n "$oldRPath"; then exit 1; fi
-../src/patchelf \
-  --set-interpreter "$(../src/patchelf --print-interpreter ../src/patchelf)" \
-  --set-rpath /foo:/bar:/xxxxxxxxxxxxxxx scratch/no-rpath
+    oldRPath=$(../src/patchelf --print-rpath scratch/no-rpath)
+    if test -n "$oldRPath"; then exit 1; fi
+    ../src/patchelf \
+      --set-interpreter "$(../src/patchelf --print-interpreter ../src/patchelf)" \
+      --set-rpath /foo:/bar:/xxxxxxxxxxxxxxx scratch/no-rpath
 
-newRPath=$(../src/patchelf --print-rpath scratch/no-rpath)
-if ! echo "$newRPath" | grep -q '/foo:/bar'; then
-    echo "incomplete RPATH"
-    exit 1
-fi
+    newRPath=$(../src/patchelf --print-rpath scratch/no-rpath)
+    if ! echo "$newRPath" | grep -q '/foo:/bar'; then
+        echo "incomplete RPATH"
+        exit 1
+    fi
 
-if [ "$(uname -m)" = i686 -a "$(uname -s)" = Linux ]; then
     cd scratch && ./no-rpath
 fi