summaryrefslogtreecommitdiffstats
path: root/relink-static.sh
blob: 9dd5a22263cdbcf18de86df9a86a2441f1d7de97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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 <rjones@redhat.com>
#
# 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[@]}"