#!/bin/sh

rm *.log
rm busybox
rm libLIBRARY.so
rm busybox_SHARED
rm busybox_CHEAT
rm libCHEAT.so
rm busybox_SHARED2

SEED_O="built-in.o"
FILE_A="archival/lib.a archival/libunarchive/lib.a console-tools/lib.a coreutils/lib.a coreutils/libcoreutils/lib.a debianutils/lib.a e2fsprogs/lib.a editors/lib.a findutils/lib.a init/lib.a ipsvd/lib.a libbb/lib.a libpwdgrp/lib.a loginutils/lib.a miscutils/lib.a modutils/lib.a networking/lib.a networking/libiproute/lib.a networking/udhcp/lib.a procps/lib.a runit/lib.a shell/lib.a sysklogd/lib.a util-linux/lib.a"

echo "Building static busybox"
gcc -o busybox -Wl,--sort-common -Wl,--gc-sections \
    -Wl,--start-group $SEED_O $FILE_A -Wl,--end-group \
    -Wl,--start-group -lcrypt -lm -Wl,--end-group \
>busybox.log 2>&1 \
|| exit 1

# ./busybox - works!


echo "Building libLIBRARY.so"
gcc -o libLIBRARY.so -shared -fPIC -Wl,--enable-new-dtags \
    -Wl,--start-group -Wl,--whole-archive $FILE_A -Wl,--no-whole-archive -Wl,--end-group \
    -Wl,--start-group -lcrypt -lm -Wl,--end-group \
    -Wl,-soname=libLIBRARY.so -Wl,-z,combreloc \
>libLIBRARY.so 2>&1 \
|| exit 1

echo "Building busybox_SHARED"
gcc -o busybox_SHARED -Wl,--sort-common -Wl,--gc-sections \
    -Wl,--start-group $SEED_O -Wl,--end-group -L. -lLIBRARY \
>busybox_SHARED.log 2>&1 \
|| exit 1

# ./busybox_SHARED - ./busybox_SHARED: error while loading shared libraries: libLIBRARY.so: cannot open shared object file: No such file or directory
# (as expected)
# LD_LIBRARY_PATH=. ./busybox_SHARED - works!


echo "Building busybox_CHEAT"
ld -o busybox_CHEAT \
    \
    --entry=main \
    --unresolved-symbols=ignore-all \
    \
    --sort-common \
    --gc-sections \
    --start-group \
    $SEED_O $FILE_A \
    --end-group \
>busybox_CHEAT.log 2>&1 \
|| exit 1

# If I add --emit-relocs to ld invocation above, I get this later, whn I try to build busybox_SHARED2:
# /usr/lib/gcc/../../i386-pc-linux-gnu/bin/ld: ./libCHEAT.so(.text+0x80480a1): reloc against `isspace@@GLIBC_2.0': error 2
# /usr/lib/gcc/../../i386-pc-linux-gnu/bin/ld: final link failed: Nonrepresentable section on output
# collect2: ld returned 1 exit status

echo "Converting busybox_CHEAT into libCHEAT.so"
ld -o libCHEAT.so -r busybox_CHEAT \
|| exit 1

echo "Building busybox_SHARED2 using libCHEAT.so"
gcc -o busybox_SHARED2 \
    \
    -Wl,--allow-multiple-definition \
    \
    -Wl,--sort-common \
    -Wl,--gc-sections \
    -Wl,--start-group \
    $SEED_O \
    -Wl,--end-group -L. -lCHEAT \
>busybox_SHARED2.log 2>&1 \
|| exit 1

# ./busybox_SHARED2 - segfaults
# LD_LIBRARY_PATH=. ./busybox_SHARED2 - segfaults
