summaryrefslogtreecommitdiff
path: root/extra/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'extra/scripts')
-rwxr-xr-xextra/scripts/get-needed-libgcc-objects.sh70
1 files changed, 70 insertions, 0 deletions
diff --git a/extra/scripts/get-needed-libgcc-objects.sh b/extra/scripts/get-needed-libgcc-objects.sh
new file mode 100755
index 000000000..e4fa96a78
--- /dev/null
+++ b/extra/scripts/get-needed-libgcc-objects.sh
@@ -0,0 +1,70 @@
+#!/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?
+
+LIBGCC=`$CC -print-libgcc-file-name`
+
+echo Finding missing symbols in libc.a ...
+echo " partial linking..."
+rm -f libc.ldr
+ld -r -o libc.ldr ../crt0.o *.o
+
+if nm -s libc.ldr | grep -v " main$" | grep " U " > sym.need ; then
+ rm -f obj.need
+ touch obj.need
+ for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
+ if nm -s $LIBGCC | grep -q $SYM" in " ; then
+ nm -s $LIBGCC | grep $SYM" in " | cut -d' ' -f3 >> obj.need
+ else
+ echo Symbol $SYM needed by libc.a but not found in libgcc.a
+ fi
+ done
+else
+ echo No missing symbols found.
+ exit 0
+fi
+
+rm -rf tmp-gcc
+mkdir tmp-gcc
+(cd tmp-gcc ; ar -x $LIBGCC)
+rm libgcc.ldr
+
+echo Extracting referenced libgcc.a objects ...
+
+rm -f obj.need.0
+touch obj.need.0
+while [ -s obj.need ] && ! cmp -s obj.need obj.need.0 ; do
+ (cd tmp-gcc ; cat ../obj.need | xargs ld -r -o ../libgcc.ldr)
+ cp obj.need obj.need.0
+ if nm -s libgcc.ldr | grep " U " > sym.need ; then
+ for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
+ if nm -s $LIBGCC | grep -q $SYM" in " ; then
+ nm -s $LIBGCC | grep $SYM" in " | cut -d' ' -f3 >> obj.need
+ fi
+ done
+ fi
+done
+
+cat obj.need | sort | uniq > obj.need.0
+(cd tmp-gcc ; cp `cat ../obj.need` ..)
+
+echo Objects added from $LIBGCC:
+cat obj.need.0
+
+if [ -s sym.need ] ; then
+ echo Symbols missing from libgcc.a:
+ cat sym.need
+else
+ echo Done
+fi
+exit 0 \ No newline at end of file