Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/scripts/trylink


Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/scripts/trylink

    r1765 r2725  
    33debug=false
    44
     5# 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
    539try() {
    6     added="$1"
    7     shift
    8     $debug && echo "Trying: $* $added"
    9     "$@" $added 2>busybox_ld.err
    10 }
     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}
     47
     48check_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
     60check_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
     77EXE="$1"
     78CC="$2"
     79CFLAGS="$3"
     80LDFLAGS="$4"
     81O_FILES="$5"
     82A_FILES="$6"
     83LDLIBS="$7"
     84
     85# The --sort-section option is not supported by older versions of ld
     86SORT_SECTION=`check_cc "-Wl,--sort-section,alignment" ""`
     87
     88START_GROUP="-Wl,--start-group"
     89END_GROUP="-Wl,--end-group"
     90INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose"
     91
     92# gold may not support --sort-common (yet)
     93SORT_COMMON=`check_cc "-Wl,--sort-common" ""`
     94
     95# Static linking against glibc produces buggy executables
     96# (glibc does not cope well with ld --gc-sections).
     97# See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
     98# Note that glibc is unsuitable for static linking anyway.
     99# We are removing -Wl,--gc-sections from link command line.
     100GC_SECTIONS=`(
     101. ./.config
     102if test x"$CONFIG_STATIC" = x"y"; then
     103    check_libc_is_glibc "" "-Wl,--gc-sections"
     104else
     105    echo "-Wl,--gc-sections"
     106fi
     107)`
     108
     109# The --gc-sections option is not supported by older versions of ld
     110if test -n "$GC_SECTIONS"; then
     111    GC_SECTIONS=`check_cc "$GC_SECTIONS" ""`
     112fi
    11113
    12114# Sanitize lib list (dups, extra spaces etc)
    13 #echo "BBOX_LIB_LIST=$BBOX_LIB_LIST"
    14 BBOX_LIB_LIST=`echo "$BBOX_LIB_LIST" | xargs -n1 | sort | uniq | xargs`
     115LDLIBS=`echo "$LDLIBS" | xargs -n1 | sort | uniq | xargs`
    15116
    16117# First link with all libs. If it fails, bail out
    17 echo "Trying libraries: $BBOX_LIB_LIST"
    18 l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
    19 test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
    20 try "$l_list" "$@" \
     118echo "Trying libraries: $LDLIBS"
     119# "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
     120l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
     121test "x$l_list" != "x" && l_list="$START_GROUP $l_list $END_GROUP"
     122try $CC $CFLAGS $LDFLAGS \
     123    -o $EXE \
     124    $SORT_COMMON \
     125    $SORT_SECTION \
     126    $GC_SECTIONS \
     127    $START_GROUP $O_FILES $A_FILES $END_GROUP \
     128    $l_list \
    21129|| {
    22     echo "Failed: $* -Wl,--start-group $l_list -Wl,--end-group"
    23     cat busybox_ld.err
     130    echo "Failed: $l_list"
     131    cat $EXE.out
    24132    exit 1
    25133}
     
    27135# Now try to remove each lib and build without it.
    28136# Stop when no lib can be removed.
    29 while test "$BBOX_LIB_LIST"; do
    30     $debug && echo "Trying libraries: $BBOX_LIB_LIST"
     137while test "$LDLIBS"; do
     138    $debug && echo "Trying libraries: $LDLIBS"
    31139    all_needed=true
    32     for one in $BBOX_LIB_LIST; do
    33     without_one=`echo " $BBOX_LIB_LIST " | sed "s/ $one / /g" | xargs`
     140    last_needed=false
     141    for one in $LDLIBS; do
     142    without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs`
     143    # "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
    34144    l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
    35     test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
     145    test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP"
    36146    $debug && echo "Trying -l options: '$l_list'"
    37     if try "$l_list" "$@"; then
    38         echo "Library $one is not needed"
    39         BBOX_LIB_LIST="$without_one"
    40         all_needed=false
     147    try $CC $CFLAGS $LDFLAGS \
     148        -o $EXE \
     149        $SORT_COMMON \
     150        $SORT_SECTION \
     151        $GC_SECTIONS \
     152        $START_GROUP $O_FILES $A_FILES $END_GROUP \
     153        $l_list
     154    if test $? = 0; then
     155        echo " Library $one is not needed, excluding it"
     156        LDLIBS="$without_one"
     157        all_needed=false
     158        last_needed=false
    41159    else
    42         echo "Library $one is needed"
     160        echo " Library $one is needed, can't exclude it (yet)"
     161        last_needed=true
    43162    fi
    44163    done
    45164    # All libs were needed, can't remove any
    46165    $all_needed && break
    47     # If there is no space char, the list has just one lib.
    48     # I'm not sure that in this case lib really is 100% needed.
    49     # Let's try linking without it anyway... thus commented out.
    50     #{ echo "$BBOX_LIB_LIST" | grep -q ' '; } || break
     166    # Optimization: was the last tried lib needed?
     167    if $last_needed; then
     168    # Was it the only one lib left? Don't test again then.
     169    { echo "$LDLIBS" | grep -q ' '; } || break
     170    fi
    51171done
    52172
    53173# Make the binary with final, minimal list of libs
    54 echo "Final link with: $BBOX_LIB_LIST"
    55 l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
    56 test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group -Wl,--verbose"
     174echo "Final link with: ${LDLIBS:-<none>}"
     175l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
     176test "x$l_list" != "x" && l_list="$START_GROUP $l_list $END_GROUP"
    57177# --verbose gives us gobs of info to stdout (e.g. linker script used)
    58178if ! test -f busybox_ldscript; then
    59     try "$l_list -Wl,--verbose" "$@" >busybox_ld.out
     179    try $CC $CFLAGS $LDFLAGS \
     180        -o $EXE \
     181        $SORT_COMMON \
     182        $SORT_SECTION \
     183        $GC_SECTIONS \
     184        $START_GROUP $O_FILES $A_FILES $END_GROUP \
     185        $l_list \
     186        $INFO_OPTS \
     187    || {
     188    cat $EXE.out
     189    exit 1
     190    }
    60191else
    61192    echo "Custom linker script 'busybox_ldscript' found, using it"
    62     # Add SORT_BY_ALIGNMENT to linker script (found in busybox_ld.out):
     193    # Add SORT_BY_ALIGNMENT to linker script (found in $EXE.out):
    63194    #  .rodata         : { *(.rodata SORT_BY_ALIGNMENT(.rodata.*) .gnu.linkonce.r.*) }
    64195    #  *(.data SORT_BY_ALIGNMENT(.data.*) .gnu.linkonce.d.*)
    65196    #  *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*)
    66     # This will eliminate most of the data padding (~3kb).
    67     try "$l_list -Wl,--verbose -Wl,-T -Wl,busybox_ldscript" "$@" >busybox_ld.out
    68 fi
     197    # This will eliminate most of the padding (~3kb).
     198    # Hmm, "ld --sort-section alignment" should do it too.
     199    try $CC $CFLAGS $LDFLAGS \
     200        -o $EXE \
     201        $SORT_COMMON \
     202        $SORT_SECTION \
     203        $GC_SECTIONS \
     204        -Wl,-T,busybox_ldscript \
     205        $START_GROUP $O_FILES $A_FILES $END_GROUP \
     206        $l_list \
     207        $INFO_OPTS \
     208    || {
     209    cat $EXE.out
     210    exit 1
     211    }
     212fi
     213
     214. ./.config
     215
     216sharedlib_dir="0_lib"
     217
     218if test "$CONFIG_BUILD_LIBBUSYBOX" = y; then
     219    mkdir "$sharedlib_dir" 2>/dev/null
     220    test -d "$sharedlib_dir" || {
     221    echo "Cannot make directory $sharedlib_dir"
     222    exit 1
     223    }
     224    ln -s "libbusybox.so.$BB_VER" "$sharedlib_dir"/libbusybox.so 2>/dev/null
     225
     226    EXE="$sharedlib_dir/libbusybox.so.${BB_VER}_unstripped"
     227    try $CC $CFLAGS $LDFLAGS \
     228        -o $EXE \
     229        -shared -fPIC \
     230        -Wl,--enable-new-dtags \
     231        -Wl,-z,combreloc \
     232        -Wl,-soname="libbusybox.so.$BB_VER" \
     233        -Wl,--undefined=lbb_main \
     234        $SORT_COMMON \
     235        $SORT_SECTION \
     236        $START_GROUP $A_FILES $END_GROUP \
     237        $l_list \
     238        $INFO_OPTS \
     239    || {
     240    echo "Linking $EXE failed"
     241    cat $EXE.out
     242    exit 1
     243    }
     244    $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER"
     245    chmod a+x "$sharedlib_dir/libbusybox.so.$BB_VER"
     246    echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER"
     247fi
     248
     249if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then
     250    EXE="$sharedlib_dir/busybox_unstripped"
     251    try $CC $CFLAGS $LDFLAGS \
     252        -o $EXE \
     253        $SORT_COMMON \
     254        $SORT_SECTION \
     255        $GC_SECTIONS \
     256        $START_GROUP $O_FILES $END_GROUP \
     257        -L"$sharedlib_dir" -lbusybox \
     258        $INFO_OPTS \
     259    || {
     260    echo "Linking $EXE failed"
     261    cat $EXE.out
     262    exit 1
     263    }
     264    $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/busybox"
     265    echo "busybox linked against libbusybox: $sharedlib_dir/busybox"
     266fi
     267
     268if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then
     269    echo "Linking individual applets against libbusybox (see $sharedlib_dir/*)"
     270    gcc -DNAME_MAIN_CNAME -E -include include/autoconf.h include/applets.h \
     271    | grep -v "^#" \
     272    | grep -v "^$" \
     273    > applet_lst.tmp
     274    while read name main junk; do
     275
     276    echo "\
     277void lbb_prepare(const char *applet, char **argv);
     278int $main(int argc, char **argv);
     279
     280int main(int argc, char **argv)
     281{
     282    lbb_prepare(\"$name\", argv);
     283    return $main(argc, argv);
     284}
     285" >"$sharedlib_dir/applet.c"
     286
     287    EXE="$sharedlib_dir/$name"
     288    try $CC $CFLAGS $LDFLAGS "$sharedlib_dir/applet.c" \
     289        -o $EXE \
     290        $SORT_COMMON \
     291        $SORT_SECTION \
     292        $GC_SECTIONS \
     293        -L"$sharedlib_dir" -lbusybox \
     294        -Wl,--warn-common \
     295    || {
     296        echo "Linking $EXE failed"
     297        cat $EXE.out
     298        exit 1
     299    }
     300    rm -- "$sharedlib_dir/applet.c" $EXE.out
     301    $STRIP -s --remove-section=.note --remove-section=.comment $EXE
     302
     303    done <applet_lst.tmp
     304fi
     305
     306# libbusybox.so is needed only for -lbusybox at link time,
     307# it is not needed at runtime. Deleting to reduce confusion.
     308rm "$sharedlib_dir"/libbusybox.so 2>/dev/null
     309exit 0 # or else we may confuse make
Note: See TracChangeset for help on using the changeset viewer.