get-needed-libgcc-objects.sh 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/bin/sh
  2. #
  3. # Manuel Novoa III Jan 2001
  4. #
  5. # The purpose of this script is to extract the object files from libgcc.a
  6. # that are needed by the shared uClibc so that they won't be linked with
  7. # each application.
  8. #
  9. # I'm sure people with better shell programming skills can improve this.
  10. # Feel free! ;-) At this point though, it gets the job done for me.
  11. #
  12. # Possible problems (paranioa mode): Are any of the objects in libgcc.a
  13. # needed to actually load the shared library on any archs?
  14. LIBGCC=`$CC -print-libgcc-file-name`
  15. echo Finding missing symbols in libc.a ...
  16. echo " partial linking..."
  17. rm -f libc.ldr
  18. ld -r -o libc.ldr ../crt0.o *.o
  19. if nm -s libc.ldr | grep -v " main$" | grep " U " > sym.need ; then
  20. rm -f obj.need
  21. touch obj.need
  22. for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
  23. if nm -s $LIBGCC | grep -q $SYM" in " ; then
  24. nm -s $LIBGCC | grep $SYM" in " | cut -d' ' -f3 >> obj.need
  25. else
  26. echo Symbol $SYM needed by libc.a but not found in libgcc.a
  27. fi
  28. done
  29. else
  30. echo No missing symbols found.
  31. exit 0
  32. fi
  33. rm -rf tmp-gcc
  34. mkdir tmp-gcc
  35. (cd tmp-gcc ; ar -x $LIBGCC)
  36. rm libgcc.ldr
  37. echo Extracting referenced libgcc.a objects ...
  38. rm -f obj.need.0
  39. touch obj.need.0
  40. while [ -s obj.need ] && ! cmp -s obj.need obj.need.0 ; do
  41. (cd tmp-gcc ; cat ../obj.need | xargs ld -r -o ../libgcc.ldr)
  42. cp obj.need obj.need.0
  43. if nm -s libgcc.ldr | grep " U " > sym.need ; then
  44. for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
  45. if nm -s $LIBGCC | grep -q $SYM" in " ; then
  46. nm -s $LIBGCC | grep $SYM" in " | cut -d' ' -f3 >> obj.need
  47. fi
  48. done
  49. fi
  50. done
  51. cat obj.need | sort | uniq > obj.need.0
  52. (cd tmp-gcc ; cp `cat ../obj.need` ..)
  53. echo Objects added from $LIBGCC:
  54. cat obj.need.0
  55. if [ -s sym.need ] ; then
  56. echo Symbols missing from libgcc.a:
  57. cat sym.need
  58. else
  59. echo Done
  60. fi
  61. exit 0