get-needed-libgcc-objects.sh 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. #Enable this when debugging
  15. #set -x
  16. LIBGCC=`$CC -print-libgcc-file-name`
  17. echo Finding missing symbols in libc.a ...
  18. echo " partial linking..."
  19. rm -f libc.ldr
  20. $LD -r -o libc.ldr ../../lib/crt0.o ../../lib/crti.o ../../lib/crtn.o --whole-archive ../libc.a
  21. if $NM --undefined-only libc.ldr 2>&1 | grep -v "^main$" | grep -v "^_GLOBAL_OFFSET_TABLE_$" | grep -v "_gp_disp" > sym.need ; then
  22. EXIT_WITH_ERROR=0
  23. rm -f obj.need
  24. touch obj.need
  25. for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
  26. if $NM -s $LIBGCC 2>&1 | grep -q $SYM" in " ; then
  27. $NM -s $LIBGCC 2>&1 | grep $SYM" in " | cut -d' ' -f3 >> obj.need
  28. else
  29. echo Symbol $SYM needed by libc.a but not found in libgcc.a
  30. EXIT_WITH_ERROR=1
  31. fi
  32. done
  33. if [ $EXIT_WITH_ERROR != 0 ]; then
  34. exit $EXIT_WITH_ERROR
  35. fi
  36. else
  37. echo No missing symbols found.
  38. exit 0
  39. fi
  40. rm -rf tmp-gcc
  41. mkdir tmp-gcc
  42. (cd tmp-gcc && $AR -x $LIBGCC)
  43. rm -f libgcc.ldr
  44. echo Extracting referenced libgcc.a objects ...
  45. rm -f obj.need.0
  46. touch obj.need.0
  47. cmp -s obj.need obj.need.0 ; state=$?
  48. while [ -s obj.need ] && [ $state -ne 0 ] ; do
  49. (cd tmp-gcc && cat ../obj.need | sort | uniq | xargs $LD -r -o ../libgcc.ldr)
  50. cp obj.need obj.need.0
  51. if $NM --undefined-only libgcc.ldr > sym.need 2>&1 ; then
  52. for SYM in `cat sym.need | sed -e 's/ U //g'` ; do
  53. if $NM -s $LIBGCC 2>&1 | grep -q $SYM" in " ; then
  54. $NM -s $LIBGCC 2>&1 | grep $SYM" in " | cut -d' ' -f3 >> obj.need
  55. fi
  56. done
  57. fi
  58. cmp -s obj.need obj.need.0 ; state=$?
  59. done
  60. cat obj.need | sort | uniq > obj.need.0
  61. (cd tmp-gcc && cp `cat ../obj.need` ..)
  62. if [ -s obj.need.0 ] ; then
  63. echo Objects added from $LIBGCC:
  64. cat obj.need.0
  65. (cd tmp-gcc && cat ../obj.need | sort | uniq | xargs $AR r ../libgcc-need.a)
  66. else
  67. echo No objects added from $LIBGCC.
  68. fi
  69. if [ -s sym.need ] ; then
  70. echo Symbols missing from libgcc.a:
  71. cat sym.need
  72. else
  73. echo Done
  74. fi
  75. exit 0