From 150d2fa114d626761a67e529959433226793e733 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 17 Jul 2007 20:39:27 +0000 Subject: [PATCH] Modify method of linking against libs. Now we fisrt try all specified libs, and if it succeeds, we try to remove them one-by-one. If link succeeds, then library is thrown out. Should solve the problem with SELinux linking in libsepol even when not needed. --- Makefile.flags | 13 ++++++++++--- scripts/trylink | 52 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/Makefile.flags b/Makefile.flags index b54679047..d8817bed6 100644 --- a/Makefile.flags +++ b/Makefile.flags @@ -59,18 +59,25 @@ ifeq ($(CONFIG_STATIC),y) LDFLAGS += -static endif +BBOX_LIB_LIST = m crypt ifeq ($(CONFIG_SELINUX),y) -LDLIBS += -lselinux -lsepol +#LDLIBS += -lselinux -lsepol +BBOX_LIB_LIST += selinux sepol endif ifeq ($(CONFIG_EFENCE),y) -LDLIBS += -lefence +#LDLIBS += -lefence +BBOX_LIB_LIST += efence endif ifeq ($(CONFIG_DMALLOC),y) -LDLIBS += -ldmalloc +#LDLIBS += -ldmalloc +BBOX_LIB_LIST += dmalloc endif +# For scripts/trylink +export BBOX_LIB_LIST + #LDFLAGS += -nostdlib LDFLAGS_ELF2FLT = -Wl,-elf2flt diff --git a/scripts/trylink b/scripts/trylink index 52931b01c..ddd7fb179 100755 --- a/scripts/trylink +++ b/scripts/trylink @@ -6,13 +6,49 @@ try() { added="$1" shift $debug && echo "Trying: $* $added" - "$@" $added >busybox.map 2>busybox_ld.err \ - && { rm busybox_ld.err; exit 0; } + "$@" $added >busybox.map 2>busybox_ld.err } -try "" "$@" -try "-lm" "$@" -try "-lcrypt" "$@" -try "-Wl,--start-group -lcrypt -lm -Wl,--end-group" "$@" -# It failed. Let people see the error messages -cat 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 +} + +# Now try to remove each lib and build without. +# Stop when no lib can be removed. +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/'` + $debug && echo "Trying -l options: $l_list" + if try "-Wl,--start-group $l_list -Wl,--end-group" "$@"; then + echo "Library $one is not needed" + BBOX_LIB_LIST="$without_one" + all_needed=false + else + echo "Library $one is needed" + fi + done + # All libs were needed, can't remove any + $all_needed && break + # If there is no space, 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 + +# Ok, make the binary +echo "Final link with: $BBOX_LIB_LIST" +l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/'` +try "-Wl,--start-group $l_list -Wl,--end-group" "$@"