Magellan Linux

Annotation of /tags/mkinitrd-6_1_12/busybox/scripts/trylink

Parent Directory Parent Directory | Revision Log Revision Log


Revision 816 - (hide annotations) (download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 2 months ago) by niro
Original Path: trunk/mkinitrd-magellan/busybox/scripts/trylink
File size: 8966 byte(s)
-updated to busybox-1.13.4
1 niro 532 #!/bin/sh
2    
3     debug=false
4    
5 niro 816 # Linker flags used:
6     #
7     # Informational:
8     # --warn-common
9     # -Map $EXE.map
10     # --verbose
11     #
12     # Optimizations:
13     # --sort-common reduces padding
14     # --sort-section alignment reduces padding
15     # --gc-sections throws out unused sections,
16     # does not work for shared libs
17     # -On Not used, maybe useful?
18     #
19     # List of files to link:
20     # $l_list == --start-group -llib1 -llib2 --end-group
21     # --start-group $O_FILES $A_FILES --end-group
22     #
23     # Shared library link:
24     # -shared self-explanatory
25     # -fPIC position-independent code
26     # --enable-new-dtags ?
27     # -z,combreloc ?
28     # -soname="libbusybox.so.$BB_VER"
29     # --undefined=lbb_main Seed name to start pulling from
30     # (otherwise we'll need --whole-archive)
31     # -static Not used, but may be useful! manpage:
32     # "... This option can be used with -shared.
33     # Doing so means that a shared library
34     # is being created but that all of the library's
35     # external references must be resolved by pulling
36     # in entries from static libraries."
37    
38    
39     try() {
40     printf "%s\n" "Output of:" >$EXE.out
41     printf "%s\n" "$*" >>$EXE.out
42     printf "%s\n" "==========" >>$EXE.out
43     $debug && echo "Trying: $*"
44     $@ >>$EXE.out 2>&1
45     return $?
46 niro 532 }
47    
48 niro 816 check_cc() {
49     local tempname="/tmp/temp.$$.$RANDOM"
50     # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :(
51     # "-xc": C language. "/dev/null" is an empty source file.
52     if $CC $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then
53     echo "$1";
54     else
55     echo "$2";
56     fi
57     rm "$tempname".o 2>/dev/null
58     }
59    
60     check_libc_is_glibc() {
61     local tempname="/tmp/temp.$$.$RANDOM"
62     echo "\
63     #include <stdlib.h>
64     /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */
65     #if defined(__GLIBC__) && !defined(__UCLIBC__)
66     syntax error here
67     #endif
68     " >"$tempname".c
69     if $CC "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then
70     echo "$2";
71     else
72     echo "$1";
73     fi
74     rm "$tempname".c "$tempname".o 2>/dev/null
75     }
76    
77     EXE="$1"
78     CC="$2"
79     CFLAGS="$3"
80     LDFLAGS="$4"
81     O_FILES="$5"
82     A_FILES="$6"
83     LDLIBS="$7"
84    
85     # The --sort-section option is not supported by older versions of ld
86     SORT_SECTION=`check_cc "-Wl,--sort-section,alignment" ""`
87    
88     # Static linking against glibc produces buggy executables
89     # (glibc does not cope well with ld --gc-sections).
90     # See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
91     # Note that glibc is unsuitable for static linking anyway.
92     # We are removing -Wl,--gc-sections from link command line.
93     GC_SECTIONS=`(
94     . ./.config
95     if test x"$CONFIG_STATIC" = x"y"; then
96     check_libc_is_glibc "" "-Wl,--gc-sections"
97     else
98     echo "-Wl,--gc-sections"
99     fi
100     )`
101    
102     # Sanitize lib list (dups, extra spaces etc)
103     LDLIBS=`echo "$LDLIBS" | xargs -n1 | sort | uniq | xargs`
104    
105     # First link with all libs. If it fails, bail out
106     echo "Trying libraries: $LDLIBS"
107     # "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
108     l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
109     test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
110     try $CC $CFLAGS $LDFLAGS \
111     -o $EXE \
112     -Wl,--sort-common \
113     $SORT_SECTION \
114     $GC_SECTIONS \
115     -Wl,--start-group $O_FILES $A_FILES -Wl,--end-group \
116     $l_list \
117     || {
118     echo "Failed: $l_list"
119     cat $EXE.out
120     exit 1
121     }
122    
123     # Now try to remove each lib and build without it.
124     # Stop when no lib can be removed.
125     while test "$LDLIBS"; do
126     $debug && echo "Trying libraries: $LDLIBS"
127     all_needed=true
128     last_needed=false
129     for one in $LDLIBS; do
130     without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs`
131     # "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
132     l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
133     test x"$l_list" != x"" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
134     $debug && echo "Trying -l options: '$l_list'"
135     try $CC $CFLAGS $LDFLAGS \
136     -o $EXE \
137     -Wl,--sort-common \
138     $SORT_SECTION \
139     $GC_SECTIONS \
140     -Wl,--start-group $O_FILES $A_FILES -Wl,--end-group \
141     $l_list
142     if test $? = 0; then
143     echo " Library $one is not needed, excluding it"
144     LDLIBS="$without_one"
145     all_needed=false
146     last_needed=false
147     else
148     echo " Library $one is needed, can't exclude it (yet)"
149     last_needed=true
150     fi
151     done
152     # All libs were needed, can't remove any
153     $all_needed && break
154     # Optimization: was the last tried lib needed?
155     if $last_needed; then
156     # Was it the only one lib left? Don't test again then.
157     { echo "$LDLIBS" | grep -q ' '; } || break
158     fi
159     done
160    
161     # Make the binary with final, minimal list of libs
162     echo "Final link with: ${LDLIBS:-<none>}"
163     l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
164     test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
165     # --verbose gives us gobs of info to stdout (e.g. linker script used)
166     if ! test -f busybox_ldscript; then
167     try $CC $CFLAGS $LDFLAGS \
168     -o $EXE \
169     -Wl,--sort-common \
170     $SORT_SECTION \
171     $GC_SECTIONS \
172     -Wl,--start-group $O_FILES $A_FILES -Wl,--end-group \
173     $l_list \
174     -Wl,--warn-common \
175     -Wl,-Map,$EXE.map \
176     -Wl,--verbose \
177     || {
178     cat $EXE.out
179     exit 1
180     }
181     else
182     echo "Custom linker script 'busybox_ldscript' found, using it"
183     # Add SORT_BY_ALIGNMENT to linker script (found in $EXE.out):
184     # .rodata : { *(.rodata SORT_BY_ALIGNMENT(.rodata.*) .gnu.linkonce.r.*) }
185     # *(.data SORT_BY_ALIGNMENT(.data.*) .gnu.linkonce.d.*)
186     # *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*)
187     # This will eliminate most of the padding (~3kb).
188     # Hmm, "ld --sort-section alignment" should do it too.
189     try $CC $CFLAGS $LDFLAGS \
190     -o $EXE \
191     -Wl,--sort-common \
192     $SORT_SECTION \
193     $GC_SECTIONS \
194     -Wl,-T,busybox_ldscript \
195     -Wl,--start-group $O_FILES $A_FILES -Wl,--end-group \
196     $l_list \
197     -Wl,--warn-common \
198     -Wl,-Map,$EXE.map \
199     -Wl,--verbose \
200     || {
201     cat $EXE.out
202     exit 1
203     }
204     fi
205    
206     . ./.config
207    
208     sharedlib_dir="0_lib"
209    
210     if test "$CONFIG_BUILD_LIBBUSYBOX" = y; then
211     mkdir "$sharedlib_dir" 2>/dev/null
212     test -d "$sharedlib_dir" || {
213     echo "Cannot make directory $sharedlib_dir"
214     exit 1
215     }
216     ln -s "libbusybox.so.$BB_VER" "$sharedlib_dir"/libbusybox.so 2>/dev/null
217    
218     EXE="$sharedlib_dir/libbusybox.so.${BB_VER}_unstripped"
219     try $CC $CFLAGS $LDFLAGS \
220     -o $EXE \
221     -shared -fPIC \
222     -Wl,--enable-new-dtags \
223     -Wl,-z,combreloc \
224     -Wl,-soname="libbusybox.so.$BB_VER" \
225     -Wl,--undefined=lbb_main \
226     -Wl,--sort-common \
227     $SORT_SECTION \
228     -Wl,--start-group $A_FILES -Wl,--end-group \
229     $l_list \
230     -Wl,--warn-common \
231     -Wl,-Map,$EXE.map \
232     -Wl,--verbose \
233     || {
234     echo "Linking $EXE failed"
235     cat $EXE.out
236     exit 1
237     }
238     $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER"
239     chmod a+x "$sharedlib_dir/libbusybox.so.$BB_VER"
240     echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER"
241     fi
242    
243     if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then
244     EXE="$sharedlib_dir/busybox_unstripped"
245     try $CC $CFLAGS $LDFLAGS \
246     -o $EXE \
247     -Wl,--sort-common \
248     $SORT_SECTION \
249     $GC_SECTIONS \
250     -Wl,--start-group $O_FILES -Wl,--end-group \
251     -L"$sharedlib_dir" -lbusybox \
252     -Wl,--warn-common \
253     -Wl,-Map,$EXE.map \
254     -Wl,--verbose \
255     || {
256     echo "Linking $EXE failed"
257     cat $EXE.out
258     exit 1
259     }
260     $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/busybox"
261     echo "busybox linked against libbusybox: $sharedlib_dir/busybox"
262     fi
263    
264     if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then
265     echo "Linking individual applets against libbusybox (see $sharedlib_dir/*)"
266     gcc -DNAME_MAIN_CNAME -E -include include/autoconf.h include/applets.h \
267     | grep -v "^#" \
268     | grep -v "^$" \
269     > applet_lst.tmp
270     while read name main junk; do
271    
272     echo "\
273     void lbb_prepare(const char *applet, char **argv);
274     int $main(int argc, char **argv);
275    
276     int main(int argc, char **argv)
277     {
278     lbb_prepare(\"$name\", argv);
279     return $main(argc, argv);
280     }
281     " >"$sharedlib_dir/applet.c"
282    
283     EXE="$sharedlib_dir/$name"
284     try $CC $CFLAGS $LDFLAGS "$sharedlib_dir/applet.c" \
285     -o $EXE \
286     -Wl,--sort-common \
287     $SORT_SECTION \
288     $GC_SECTIONS \
289     -L"$sharedlib_dir" -lbusybox \
290     -Wl,--warn-common \
291     || {
292     echo "Linking $EXE failed"
293     cat $EXE.out
294     exit 1
295     }
296     rm -- "$sharedlib_dir/applet.c" $EXE.out
297     $STRIP -s --remove-section=.note --remove-section=.comment $EXE
298    
299     done <applet_lst.tmp
300     fi
301    
302     # libbusybox.so is needed only for -lbusybox at link time,
303     # it is not needed at runtime. Deleting to reduce confusion.
304     rm "$sharedlib_dir"/libbusybox.so 2>/dev/null
305     exit 0 # or else we may confuse make

Properties

Name Value
svn:executable *