8d91c13df5
For BBOX_LIB_LIST="crypt m" trylink ... with just applet true, we pulled in libm because in this case we tried to use invalid flags (plain "-l" without a lib) which of course failed, thus the script thought that -lm was needed. The fix is not to pass "-l" without a lib if we are about to check if any or the last remaining lib is really needed.
90 lines
3.2 KiB
Bash
Executable File
90 lines
3.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
debug=false
|
|
|
|
try() {
|
|
added="$1"
|
|
shift
|
|
$debug && echo "Trying: $* $added"
|
|
"$@" $added 2>busybox_ld.err
|
|
}
|
|
|
|
# Sanitize lib list (dups, extra spaces etc)
|
|
#echo "BBOX_LIB_LIST=$BBOX_LIB_LIST"
|
|
BBOX_LIB_LIST=`echo "$BBOX_LIB_LIST" | xargs -n1 | sort | uniq | xargs`
|
|
|
|
# First link with all libs. If it fails, bail out
|
|
l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/'`
|
|
echo "Trying libraries: $BBOX_LIB_LIST"
|
|
try "-Wl,--start-group $l_list -Wl,--end-group" "$@" \
|
|
|| {
|
|
echo "Failed: $* -Wl,--start-group $l_list -Wl,--end-group"
|
|
cat busybox_ld.err
|
|
exit 1
|
|
}
|
|
|
|
#### Hack disabled: conflicts with ld --verbose flag in last link phase
|
|
|
|
##### Hack: we are not supposed to know executable name,
|
|
##### but this hack cuts down link time
|
|
####mv busybox_unstripped busybox_unstripped.tmp
|
|
####mv busybox.map busybox.map.tmp
|
|
|
|
# Now try to remove each lib and build without it.
|
|
# Stop when no lib can be removed.
|
|
####ever_discarded=false
|
|
while test "$BBOX_LIB_LIST"; do
|
|
$debug && echo "Trying libraries: $BBOX_LIB_LIST"
|
|
all_needed=true
|
|
for one in $BBOX_LIB_LIST; do
|
|
without_one=`echo " $BBOX_LIB_LIST " | sed "s/ $one / /g" | xargs`
|
|
l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/'`
|
|
# If l_list is just "-l" without a lib, then make sure to test the
|
|
# correct thing to fail: just using -l will fail, so the last lib
|
|
# (usually m in my case) will incorrectly be added as needed.
|
|
if test "x$without_one" != "x"; then
|
|
l_list="-Wl,--start-group $l_list -Wl,--end-group"
|
|
else
|
|
# without_one is empty, so l_list has to be empty too
|
|
l_list=""
|
|
fi
|
|
$debug && echo "Trying -l options: '$l_list'"
|
|
if try "$l_list" "$@"; then
|
|
echo "Library $one is not needed"
|
|
BBOX_LIB_LIST="$without_one"
|
|
all_needed=false
|
|
#### ever_discarded=true
|
|
else
|
|
echo "Library $one is needed"
|
|
fi
|
|
done
|
|
# All libs were needed, can't remove any
|
|
$all_needed && break
|
|
# If there is no space char, the list has just one lib.
|
|
# I'm not sure that in this case lib really is 100% needed.
|
|
# Let's try linking without it anyway... thus commented out.
|
|
#{ echo "$BBOX_LIB_LIST" | grep -q ' '; } || break
|
|
done
|
|
|
|
####mv busybox_unstripped.tmp busybox_unstripped
|
|
####mv busybox.map.tmp busybox.map
|
|
####$ever_discarded && {
|
|
# Make the binary with final, minimal list of libs
|
|
echo "Final link with: $BBOX_LIB_LIST"
|
|
l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/'`
|
|
# --verbose gives us gobs of info to stdout (e.g. linker script used)
|
|
if ! test -f busybox_ldscript; then
|
|
try "-Wl,--start-group $l_list -Wl,--end-group -Wl,--verbose" "$@" >busybox_ld.out ####|| exit 1
|
|
else
|
|
echo "Custom linker script 'busybox_ldscript' found, using it"
|
|
# Add SORT_BY_ALIGNMENT to linker script (found in busybox_ld.out):
|
|
# .rodata : { *(.rodata SORT_BY_ALIGNMENT(.rodata.*) .gnu.linkonce.r.*) }
|
|
# *(.data SORT_BY_ALIGNMENT(.data.*) .gnu.linkonce.d.*)
|
|
# *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*)
|
|
# This will eliminate most of the data padding (~3kb).
|
|
try "-Wl,--start-group $l_list -Wl,--end-group -Wl,--verbose -Wl,-T -Wl,busybox_ldscript" "$@" >busybox_ld.out
|
|
fi
|
|
####}
|
|
####rm busybox_ld.err
|
|
####exit 0 # Ensure "success" exit code
|