| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | #!/bin/sh## Manuel Novoa III       Jan 2001## The purpose of this script is to extract the object files from libgcc.a# that are needed by the shared uClibc so that they won't be linked with# each application.## I'm sure people with better shell programming skills can improve this.# Feel free!  ;-)  At this point though, it gets the job done for me.## Possible problems (paranioa mode):  Are any of the objects in libgcc.a# needed to actually load the shared library on any archs?#Enable this when debugging#set -xLIBGCC=`$CC -print-libgcc-file-name`echo Finding missing symbols in libc.a ...echo "    partial linking..."rm -f libc.ldr$LD -r -o libc.ldr ../../lib/crt0.o ../../lib/crti.o ../../lib/crtn.o --whole-archive ../libc.aif $NM --undefined-only libc.ldr 2>&1 | grep -v "^main$" | grep -v "^_GLOBAL_OFFSET_TABLE_$" | grep -v "_gp_disp" > sym.need ; then    EXIT_WITH_ERROR=0    rm -f obj.need    touch obj.need    for SYM in `cat sym.need | sed -e 's/ U //g'` ; do	if $NM -s $LIBGCC 2>&1 | grep -q $SYM" in " ; then	    $NM -s $LIBGCC 2>&1 | grep $SYM" in " | cut -d' ' -f3 >> obj.need	else	    echo Symbol $SYM needed by libc.a but not found in libgcc.a	    EXIT_WITH_ERROR=1	fi    done    if [ $EXIT_WITH_ERROR != 0 ]; then	exit $EXIT_WITH_ERROR    fielse    echo No missing symbols found.    exit 0firm -rf tmp-gccmkdir tmp-gcc(cd tmp-gcc && $AR -x $LIBGCC)rm -f libgcc.ldrecho Extracting referenced libgcc.a objects ...rm -f obj.need.0touch obj.need.0cmp -s obj.need obj.need.0 ; state=$?while [ -s obj.need ] && [ $state -ne 0 ] ; do    (cd tmp-gcc && cat ../obj.need | sort | uniq | xargs $LD -r -o ../libgcc.ldr)    cp obj.need obj.need.0    if $NM --undefined-only libgcc.ldr > sym.need 2>&1 ; then	for SYM in `cat sym.need | sed -e 's/ U //g'` ; do	    if $NM -s $LIBGCC 2>&1 | grep -q $SYM" in " ; then		$NM -s $LIBGCC 2>&1 | grep $SYM" in " | cut -d' ' -f3 >> obj.need	    fi	done    fi    cmp -s obj.need obj.need.0 ; state=$?donecat obj.need | sort | uniq > obj.need.0(cd tmp-gcc && cp `cat ../obj.need` ..)if [ -s obj.need.0 ] ; then    echo Objects added from $LIBGCC:    cat obj.need.0    (cd tmp-gcc && cat ../obj.need | sort | uniq | xargs $AR r ../libgcc-need.a)else    echo No objects added from $LIBGCC.fiif [ -s sym.need ] ; then    echo Symbols missing from libgcc.a:    cat sym.needelse    echo Donefiexit 0
 |