From 5134010d88b4aab286b4480822a8d8db8c32d903 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 20 Oct 2015 16:16:16 +0200 Subject: [PATCH] scripts/trylink: fix bit-rotted linker option verification To that end, *make it complain* when check_cc fails on options we usually want to succeed. text data bss dec hex filename 929697 932 17692 948321 e7861 busybox-1.23.2/busybox 915361 911 17484 933756 e3f7c busybox-1.23.2.fixed/busybox 927725 932 17448 946105 e6fb9 busybox-1.24.0/busybox 913630 911 17240 931781 e37c5 busybox-1.24.0.fixed/busybox Signed-off-by: Denys Vlasenko --- scripts/trylink | 59 +++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/scripts/trylink b/scripts/trylink index 48c487bcd..26099976a 100755 --- a/scripts/trylink +++ b/scripts/trylink @@ -47,18 +47,22 @@ try() { check_cc() { local tempname="$(mktemp)" + local r + echo "int main(int argc,char**argv){return argv?argc:0;}" >"$tempname".c # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :( - # "-xc": C language. "/dev/null" is an empty source file. - if $CC $CPPFLAGS $CFLAGS $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then - echo "$1"; - else - echo "$2"; - fi - rm -f "$tempname" "$tempname".o + # Was using "-xc /dev/null", but we need a valid C program. + # "eval" is needed because CFLAGS can contain + # '... -D"BB_VER=KBUILD_STR(1.N.M)" ...' + # and we need shell to process quotes! + eval $CC $CPPFLAGS $CFLAGS $1 "$tempname".c -o "$tempname" >/dev/null 2>&1 + r=$? + rm -f "$tempname" "$tempname".c "$tempname".o + return $r } check_libc_is_glibc() { local tempname="$(mktemp)" + local r echo "\ #include /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ @@ -66,12 +70,10 @@ check_libc_is_glibc() { syntax error here #endif " >"$tempname".c - if $CC $CPPFLAGS $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then - echo "$2"; - else - echo "$1"; - fi - rm -f "$tempname" "$tempname".[co] + $CC $CPPFLAGS $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1 + r=$? + rm -f "$tempname" "$tempname".c "$tempname".o + return $r } EXE="$1" @@ -83,32 +85,41 @@ A_FILES="$6" LDLIBS="$7" # The --sort-section option is not supported by older versions of ld -SORT_SECTION=`check_cc "-Wl,--sort-section,alignment" ""` +SORT_SECTION="-Wl,--sort-section,alignment" +if ! check_cc "-Wl,--sort-section,alignment"; then + echo "Your linker does not support --sort-section,alignment" + SORT_SECTION="" +fi START_GROUP="-Wl,--start-group" END_GROUP="-Wl,--end-group" INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose" # gold may not support --sort-common (yet) -SORT_COMMON=`check_cc "-Wl,--sort-common" ""` +SORT_COMMON="-Wl,--sort-common" +if ! check_cc "-Wl,--sort-common"; then + echo "Your linker does not support --sort-common" + SORT_COMMON="" +fi # Static linking against glibc produces buggy executables # (glibc does not cope well with ld --gc-sections). # See sources.redhat.com/bugzilla/show_bug.cgi?id=3400 # Note that glibc is unsuitable for static linking anyway. # We are removing -Wl,--gc-sections from link command line. -GC_SECTIONS=`( -. ./.config -if test x"$CONFIG_STATIC" = x"y"; then - check_libc_is_glibc "" "-Wl,--gc-sections" -else - echo "-Wl,--gc-sections" +GC_SECTIONS="-Wl,--gc-sections" +if (. ./.config && test x"$CONFIG_STATIC" = x"y") then + if check_libc_is_glibc; then + echo "Static linking against glibc, can't use --gc-sections" + GC_SECTIONS="" + fi fi -)` - # The --gc-sections option is not supported by older versions of ld if test -n "$GC_SECTIONS"; then - GC_SECTIONS=`check_cc "$GC_SECTIONS" ""` + if ! check_cc "$GC_SECTIONS"; then + echo "Your linker does not support $GC_SECTIONS" + GC_SECTIONS="" + fi fi # Sanitize lib list (dups, extra spaces etc) -- 2.25.1