#!/bin/sh

#debug=true
debug=false

# Linker flags used:
#
# Informational:
# --warn-common
# -Map $EXE.map
# --verbose
#
# Optimizations:
# --sort-common                 reduces padding
# --sort-section alignment      reduces padding
# --gc-sections                 throws out unused sections,
#                               does not work for shared libs
# -On                           Not used, maybe useful?
#
# List of files to link:
# $l_list                       == --start-group -llib1 -llib2 --end-group
# --start-group $O_FILES $A_FILES --end-group
#
# Shared library link:
# -shared                       self-explanatory
# -fPIC                         position-independent code
# --enable-new-dtags            ?
# -z,combreloc                  ?
# -soname="libbusybox.so.$BB_VER"
# --undefined=lbb_main          Seed name to start pulling from
#                               (otherwise we'll need --whole-archive)
# -static                       Not used, but may be useful! manpage:
#                               "... This option can be used with -shared.
#                               Doing so means that a shared library
#                               is being created but that all of the library's
#                               external references must be resolved by pulling
#                               in entries from static libraries."


try() {
    printf "%s\n" "Output of:" >$EXE.out
    printf "%s\n" "$*" >>$EXE.out
    printf "%s\n" "==========" >>$EXE.out
    $debug && echo "Trying: $*"
    $@ >>$EXE.out 2>&1
    return $?
}

check_cc() {
    tempname="$(mktemp tmp.XXXXXXXXXX)"
    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! :(
    # Was using "-xc /dev/null", but we need a valid C program.
    $CC $CFLAGS $LDFLAGS $1 "$tempname".c -o "$tempname" >/dev/null 2>&1
    exitcode=$?
    rm -f "$tempname" "$tempname".c "$tempname".o
    return $exitcode
}

check_libc_is_glibc() {
    tempname="$(mktemp tmp.XXXXXXXXXX)"
    echo "\
	#include <stdlib.h>
	/* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */
	#if defined(__GLIBC__) && !defined(__UCLIBC__)
	syntax error here
	#endif
	" >"$tempname".c
    ! $CC $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1
    exitcode=$?
    rm -f "$tempname" "$tempname".c "$tempname".o
    return $exitcode
}

EXE="$1"
CC="$2"
CFLAGS="$3"
LDFLAGS="$4"
O_FILES="$5"
A_FILES="$6"
# We try to drop libraries from LDLIBS if build works without them,
# but ones from CONFIG_EXTRA_LDLIBS are always linked in.
# (For example, musl has stub utmp implementation, and if you link with
# a real utmp library in LDLIBS, dropping it "works" but resulting binary
# does not work properly).
LDLIBS="$7"
CONFIG_EXTRA_LDLIBS="$8"

# The --sort-section option is not supported by older versions of ld
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() {
	echo "-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose"
}

# gold may not support --sort-common (yet)
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="-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
    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)
LDLIBS=`echo "$LDLIBS" | xargs -n1 | sort | uniq | xargs`

# First link with all libs. If it fails, bail out
echo "Trying libraries: $LDLIBS"
# "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
l_list=`echo " $LDLIBS $CONFIG_EXTRA_LDLIBS " | sed -e 's: \([^- ][^ ]*\): -l\1:g' -e 's/^ *//'`
test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP"
try $CC $CFLAGS $LDFLAGS \
	-o $EXE \
	$SORT_COMMON \
	$SORT_SECTION \
	$GC_SECTIONS \
	$START_GROUP $O_FILES $A_FILES $END_GROUP \
	$l_list \
|| {
    echo "Failed: $l_list"
    cat $EXE.out
    echo 'Note: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS.'
    echo 'Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam"'
    exit 1
}

# Now try to remove each lib and build without it.
# Stop when no lib can be removed.
while test "$LDLIBS"; do
    $debug && echo "Trying libraries: $LDLIBS"
    dropped_non_first_lib=false
    first_lib=true
    for one in $LDLIBS; do
	without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs`
	# "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
	l_list=`echo " $without_one $CONFIG_EXTRA_LDLIBS " | sed -e 's: \([^- ][^ ]*\): -l\1:g' -e 's/^ *//'`
	test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP"
	$debug && echo "Trying -l options: '$l_list'"
	try $CC $CFLAGS $LDFLAGS \
		-o $EXE \
		$SORT_COMMON \
		$SORT_SECTION \
		$GC_SECTIONS \
		$START_GROUP $O_FILES $A_FILES $END_GROUP \
		$l_list
	if test $? = 0; then
	    echo " Library $one is not needed, excluding it"
	    LDLIBS="$without_one"
	    $first_lib || dropped_non_first_lib=true
	else
	    echo " Library $one is needed, can't exclude it (yet)"
	    first_lib=false
	fi
    done
    # We can stop trying to drop libs if either all libs were needed,
    # or we excluded only the _first_ few.
    # (else: we dropped some intermediate lib(s), maybe now we can succeed
    # in dropping some of the preceding ones)
    $dropped_non_first_lib || break
done

# Make the binary with final, minimal list of libs
echo "Final link with: ${LDLIBS:-<none>}"
l_list=`echo " $LDLIBS $CONFIG_EXTRA_LDLIBS " | sed -e 's: \([^- ][^ ]*\): -l\1:g' -e 's/^ *//'`
test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP"
# --verbose gives us gobs of info to stdout (e.g. linker script used)
if ! test -f busybox_ldscript; then
    try $CC $CFLAGS $LDFLAGS \
	    -o $EXE \
	    $SORT_COMMON \
	    $SORT_SECTION \
	    $GC_SECTIONS \
	    $START_GROUP $O_FILES $A_FILES $END_GROUP \
	    $l_list \
	    `INFO_OPTS` \
    || {
	cat $EXE.out
	exit 1
    }
else
    echo "Custom linker script 'busybox_ldscript' found, using it"
    # Add SORT_BY_ALIGNMENT to linker script (found in $EXE.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 padding (~3kb).
    # Hmm, "ld --sort-section alignment" should do it too.
    #
    # There is a ld hack which is meant to decrease disk usage
    # at the cost of more RAM usage (??!!) in standard ld script:
    #  /* Adjust the address for the data segment.  We want to adjust up to
    #     the same address within the page on the next page up.  */
    #  . = ALIGN (0x1000) - ((0x1000 - .) & (0x1000 - 1)); . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
    # Replace it with:
    #  . = ALIGN (0x1000); . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
    # to unconditionally align .data to the next page boundary,
    # instead of "next page, plus current offset in this page"
    try $CC $CFLAGS $LDFLAGS \
	    -o $EXE \
	    $SORT_COMMON \
	    $SORT_SECTION \
	    $GC_SECTIONS \
	    -Wl,-T,busybox_ldscript \
	    $START_GROUP $O_FILES $A_FILES $END_GROUP \
	    $l_list \
	    `INFO_OPTS` \
    || {
	cat $EXE.out
	exit 1
    }
fi

. ./.config

sharedlib_dir="0_lib"

if test "$CONFIG_BUILD_LIBBUSYBOX" = y; then
    mkdir "$sharedlib_dir" 2>/dev/null
    test -d "$sharedlib_dir" || {
	echo "Cannot make directory $sharedlib_dir"
	exit 1
    }
    ln -s "libbusybox.so.$BB_VER" "$sharedlib_dir"/libbusybox.so 2>/dev/null

    # Yes, "ld -shared -static" is a thing. It's a shared library which is itself static.
    LBB_STATIC=""
    test "$CONFIG_FEATURE_LIBBUSYBOX_STATIC" = y && LBB_STATIC="-Wl,-static"

    EXE="$sharedlib_dir/libbusybox.so.${BB_VER}_unstripped"
    try $CC $CFLAGS $LDFLAGS \
	    -o $EXE \
	    -shared -fPIC $LBB_STATIC \
	    -Wl,--enable-new-dtags \
	    -Wl,-z,combreloc \
	    -Wl,-soname="libbusybox.so.$BB_VER" \
	    -Wl,--undefined=lbb_main \
	    $SORT_COMMON \
	    $SORT_SECTION \
	    $START_GROUP $A_FILES $END_GROUP \
	    $l_list \
	    `INFO_OPTS` \
    || {
	echo "Linking $EXE failed"
	cat $EXE.out
	exit 1
    }
    $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER"
    chmod a+x "$sharedlib_dir/libbusybox.so.$BB_VER"
    echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER"
fi

if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then
    EXE="$sharedlib_dir/busybox_unstripped"
    try $CC $CFLAGS $LDFLAGS \
	    -o $EXE \
	    $SORT_COMMON \
	    $SORT_SECTION \
	    $GC_SECTIONS \
	    $START_GROUP $O_FILES $END_GROUP \
	    -L"$sharedlib_dir" -lbusybox \
	    $l_list \
	    `INFO_OPTS` \
    || {
	echo "Linking $EXE failed"
	cat $EXE.out
	exit 1
    }
    $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/busybox"
    echo "busybox linked against libbusybox: $sharedlib_dir/busybox"
fi

if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then
    echo "Linking individual applets against libbusybox (see $sharedlib_dir/*)"
    gcc -DNAME_MAIN -E -include include/autoconf.h include/applets.h \
    | grep -v "^#" \
    | grep -v "^ *$" \
    > applet_lst.tmp
    while read name main junk; do

	echo "\
void lbb_prepare(const char *applet, char **argv);
int $main(int argc, char **argv);

int main(int argc, char **argv)
{
	lbb_prepare(\"$name\", argv);
	return $main(argc, argv);
}
" >"$sharedlib_dir/applet.c"

	EXE="$sharedlib_dir/$name"
	try $CC $CFLAGS $LDFLAGS "$sharedlib_dir/applet.c" \
		-o $EXE \
		$SORT_COMMON \
		$SORT_SECTION \
		$GC_SECTIONS \
		-L"$sharedlib_dir" -lbusybox \
		-Wl,--warn-common \
	|| {
	    echo "Linking $EXE failed"
	    cat $EXE.out
	    exit 1
	}
	rm -- "$sharedlib_dir/applet.c" $EXE.out
	$STRIP -s --remove-section=.note --remove-section=.comment $EXE
	# Let user see that we do something - list the names of created binaries:
	echo "$EXE"

    done <applet_lst.tmp
fi

# libbusybox.so is needed only for -lbusybox at link time,
# it is not needed at runtime. Deleting to reduce confusion.
rm "$sharedlib_dir"/libbusybox.so 2>/dev/null
exit 0 # or else we may confuse make
