diff options
-rw-r--r-- | Makefile | 21 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/install/Linux_standalone.mdwn | 4 | ||||
-rw-r--r-- | standalone/linux/README | 23 | ||||
-rw-r--r-- | standalone/linux/glibc-libs | 45 | ||||
-rwxr-xr-x | standalone/linux/runshell | 21 |
6 files changed, 48 insertions, 68 deletions
@@ -122,7 +122,7 @@ linuxstandalone: Build/Standalone install -d "$(LINUXSTANDALONE_DEST)/templates" touch "$(LINUXSTANDALONE_DEST)/libdirs.tmp" - for lib in $$(ldd "$(LINUXSTANDALONE_DEST)"/bin/* $$(find "$(LINUXSTANDALONE_DEST)"/git-core/ -type f) | grep -v -f standalone/linux/glibc-libs | grep -v "not a dynamic executable" | egrep '^ ' | sed 's/^\t//' | sed 's/.*=> //' | cut -d ' ' -f 1 | sort | uniq); do \ + for lib in $$(ldd "$(LINUXSTANDALONE_DEST)"/bin/* $$(find "$(LINUXSTANDALONE_DEST)"/git-core/ -type f) | grep -v "not a dynamic executable" | egrep '^ ' | sed 's/^\t//' | sed 's/.*=> //' | cut -d ' ' -f 1 | sort | uniq); do \ dir=$$(dirname "$$lib"); \ install -d "$(LINUXSTANDALONE_DEST)/$$dir"; \ echo "$$dir" >> "$(LINUXSTANDALONE_DEST)/libdirs.tmp"; \ @@ -134,7 +134,26 @@ linuxstandalone: Build/Standalone done sort "$(LINUXSTANDALONE_DEST)/libdirs.tmp" | uniq > "$(LINUXSTANDALONE_DEST)/libdirs" rm -f "$(LINUXSTANDALONE_DEST)/libdirs.tmp" + + # Ensure bundle includes all glibc libs, and other support + # files it loads. + # XXX Debian specific. + cd $(LINUXSTANDALONE_DEST) && dpkg -L libc6 | grep \.so|tar c --files-from=- | tar x + + find $(LINUXSTANDALONE_DEST) -type d -name gconv | head -n 1 > $(LINUXSTANDALONE_DEST)/gconvdir + find $(LINUXSTANDALONE_DEST) | grep ld-linux | head -n 1 | sed 's!$(LINUXSTANDALONE_DEST)/*!!' > $(LINUXSTANDALONE_DEST)/linker + # Install linker shim for each binary. + for file in $$(find "$(LINUXSTANDALONE_DEST)" -type f); do \ + if file "$$file" | grep ELF | grep -q executable; then \ + mkdir -p "$(LINUXSTANDALONE_DEST)/shimmed"; \ + mv "$$file" "$(LINUXSTANDALONE_DEST)/shimmed"; \ + echo "#!/bin/sh" > "$$file"; \ + echo "exec \"\$$GIT_ANNEX_LINKER\" --library-path \"\$$GIT_ANNEX_LD_LIBRARY_PATH\" \"\$$GIT_ANNEX_SHIMMED/$$(basename "$$file")\"" >> "$$file"; \ + chmod +x "$$file"; \ + fi; \ + done + $(MAKE) install-mans DESTDIR="$(LINUXSTANDALONE_DEST)" cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST diff --git a/debian/changelog b/debian/changelog index a88475d69..8b8968c4d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,8 @@ git-annex (5.20131214) UNRELEASED; urgency=low into a directory in PATH as an alternative installation method, and will use readlink to find where the build was unpacked. * Include man pages in Linux and OSX standalone builds. + * Linux standalone build now includes its own glibc and forces the linker to + use it, to remove dependence on the host glibc. -- Joey Hess <joeyh@debian.org> Sun, 15 Dec 2013 13:32:49 -0400 diff --git a/doc/install/Linux_standalone.mdwn b/doc/install/Linux_standalone.mdwn index 8ee669113..98230d3d7 100644 --- a/doc/install/Linux_standalone.mdwn +++ b/doc/install/Linux_standalone.mdwn @@ -2,8 +2,8 @@ If your Linux distribution does not have git-annex packaged up for you, you can either build it [[fromscratch]], or you can use a handy prebuilt tarball of the most recent release. -This tarball should work on most Linux systems. It does not depend -on anything except for glibc. +This tarball should work on most Linux systems. It has basically no +dependencies and is self-contained. [download tarball](https://downloads.kitenet.net/git-annex/linux/current/) diff --git a/standalone/linux/README b/standalone/linux/README index 18983fd7a..2a321845f 100644 --- a/standalone/linux/README +++ b/standalone/linux/README @@ -1,4 +1,5 @@ -You can put this directory into your PATH, and use git-annex the same +You can put this directory into your PATH, or symlink the programs in this +directory to anyplace already in your PATH, and use git-annex the same as if you'd installed it using a package manager. Or, you can use the runshell script in this directory to start a shell @@ -6,20 +7,14 @@ that is configured to use git-annex and the other utilities included in this bundle, including git, gpg, rsync, ssh, etc. This should work on any Linux system of the appropriate architecture. -More or less. There are no external dependencies, except for glibc. -Any recent-ish version of glibc should work (2.13 is ok; so is 2.11). +More or less. How it works: This directory tree contains a lot of libraries and programs -that git-annex needs. But it's not a chroot. Instead, runshell sets PATH -and LD_LIBRARY_PATH to point to the stuff in here. +that git-annex needs. But it's not a chroot. Instead, runshell sets a lot +of environment variables to cause files from here to be used, and a shim +around the binaries arranges for them to be run with the libraries in here. -The glibc libs are not included. Instead, it runs with the host system's -glibc. We trust that glibc's excellent backwards and forward compatability -is good enough to run binaries that were linked for a newer or older -version. Of course, this could fail. Particularly if the binaries try to -use some new glibc feature. But hopefully not. - -Why not bundle glibc too? I've not gotten it to work! The host system's -ld-linux.so will be used for sure, as that's hardcoded into the binaries. -When I tried including libraries from glibc in here, everything segfaulted. +It shouldn't even be dependent on the host system's glibc libraries. +All that's needed is a kernel that supports the glibc included in this +bundle. diff --git a/standalone/linux/glibc-libs b/standalone/linux/glibc-libs deleted file mode 100644 index d37ad4eb4..000000000 --- a/standalone/linux/glibc-libs +++ /dev/null @@ -1,45 +0,0 @@ -libanl-.*.so -libutil-.*.so -libnss_hesiod-.*.so -libcrypt-.*.so -libnss_compat-.*.so -libm-.*.so -libr.so -libpcprofile.so -libnss_nis-.*.so -libSegFault.so -libpthread-.*.so -librt-.*.so -libnss_dns-.*.so -libdl-.*.so -libBrokenLocale-.*.so -libnss_nisplus-.*.so -libthread_db-1.0.so -libmemusage.so -libcidn-.*.so -libnss_files-.*.so -libnsl-.*.so -libc-.*.so -ld-.*.so -libnss_nis.so -libthread_db.so -libanl.so -libr.so -libnss_compat.so -libm.so -libnss_dns.so -libpthread.so -libc.so -librt.so -libcidn.so -libnss_nisplus.so -libnsl.so -libutil.so -libBrokenLocale.so -ld-linux.so -libnss_files.so -libdl.so -libnss_hesiod.so -libcrypt.so -linux-vdso.so -linux-gate.so diff --git a/standalone/linux/runshell b/standalone/linux/runshell index 76ed94df5..40440a1bd 100755 --- a/standalone/linux/runshell +++ b/standalone/linux/runshell @@ -46,12 +46,20 @@ export ORIG_PATH PATH=$base/bin:$PATH export PATH -ORIG_LD_LIBRARY_PATH="$LD_LIBRARY_PATH" -export ORIG_LD_LIBRARY_PATH +# This is used by the shim wrapper around each binary. for lib in $(cat $base/libdirs); do - LD_LIBRARY_PATH="$base/$lib:$LD_LIBRARY_PATH" + GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH" done -export LD_LIBRARY_PATH +export GIT_ANNEX_LD_LIBRARY_PATH +GIT_ANNEX_LINKER=$(cat $base/linker) +export GIT_ANNEX_LINKER +GIT_ANNEX_SHIMMED="$base/shimmed" +export GIT_ANNEX_SHIMMED + +ORIG_GCONV_PATH="$GCONV_PATH" +export ORIG_GCONV_PATH +GCONV_PATH=$base/$(cat $base/gconvdir) +export GCONV_PATH ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH" export ORIG_GIT_EXEC_PATH @@ -68,8 +76,9 @@ export ORIG_MANPATH MANPATH="$base/usr/share/man:$MANPATH" export MANPATH -# Indicate which variables were exported above. -GIT_ANNEX_STANDLONE_ENV="PATH LD_LIBRARY_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH" +# Indicate which variables were exported above and should be cleaned +# when running non-bundled programs. +GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH" export GIT_ANNEX_STANDLONE_ENV if [ "$1" ]; then |