X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;ds=inline;f=relink-static.sh;fp=relink-static.sh;h=9dd5a22263cdbcf18de86df9a86a2441f1d7de97;hb=a0d514f13d3334b79745d7d1f90a6ac615afa7c2;hp=0000000000000000000000000000000000000000;hpb=27ef6f9171127afd248f38d280cf3d0eae51fdaf;p=libguestfs.git diff --git a/relink-static.sh b/relink-static.sh new file mode 100755 index 0000000..9dd5a22 --- /dev/null +++ b/relink-static.sh @@ -0,0 +1,75 @@ +#!/bin/bash - +# Copyright (C) 2010 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# Written by Richard W.M. Jones +# +# Take a dynamically linked ELF binary and relink it, maximizing the +# use of static libraries. +# +# Example: +# binary foo +# ---> dynamically links to libbar.so.0 +# ---> dynamically links to libzab.so.3 +# If libbar.a is available, but there is no libzab.a, then we would +# end up with: +# binary foo.static with libbar.a statically inside it +# ---> still dynamically linking with libzab.so.3 +# +# We need to have access to the original link command. This script +# works by post-processing it to find the '-lbar' arguments, which are +# replaced sometimes by direct static library names. +# +# Therefore to use this, you have to add this rule to your +# Makefile.am: +# +# foo.static$(EXEEXT): $(foo_OBJECTS) $(foo_DEPENDENCIES) +# relink-static.sh \ +# $(foo_LINK) $(foo_OBJECTS) -static $(foo_LDADD) $(foo_LIBS) + +declare -a args + +i=0 +for arg; do + case "$arg" in + -l*) # get just the library name (eg. "xml2") + lib=${arg:2} + # does a static version exist? + for d in /usr/local/lib{64,} /usr/lib{64,} /lib{64,}; do + path="$d/lib$lib.a" + if [ -f "$path" ]; then + arg="$path" + break + fi + done + ;; + *.la) # hack around libtool mess + d=$(dirname "$arg") + b=$(basename "$arg") + b=${b:0:${#b}-3} + if [ -f "$d/.libs/$b.a" ]; then + arg="$d/.libs/$b.a" + fi + ;; + *) ;; + esac + args[$i]="$arg" + i=$(($i+1)) +done + +# Run the final command. +echo "${args[@]}" +"${args[@]}"