/Modules/ld_so_aix

http://unladen-swallow.googlecode.com/ · Shell · 190 lines · 81 code · 20 blank · 89 comment · 10 complexity · 83475aef231af282a7e339ff5b52ca1a MD5 · raw file

  1. #!/bin/sh
  2. #
  3. # ========================================================================
  4. # FILE: ld_so_aix
  5. # TYPE: executable, uses makexp_aix
  6. # SYSTEM: AIX
  7. #
  8. # DESCRIPTION: Creates a shareable .o from a set of pre-compiled
  9. # (unshared) .o files
  10. #
  11. # USAGE: ld_so_aix [CC] [arguments]
  12. #
  13. # ARGUMENTS: Same as for "ld". The following arguments are processed
  14. # or supplied by this script (those marked with an asterisk
  15. # can be overriden from command line):
  16. #
  17. # Argument Default value
  18. # (*) -o [OutputFileName] -o shr.o
  19. # (*) -e [EntryPointLabel] -e init[OutputBaseName]
  20. # (*) -bE:[ExportFile] -bE:[OutputBaseName].exp
  21. # (*) -bI:[ImportFile] -bI:./python.exp
  22. # -bM:[ModuleType] -bM:SRE
  23. # -bhalt:[Number] -bhalt:4
  24. # -T[Number] -T512
  25. # -H[Number] -H512
  26. # -lm
  27. #
  28. # The compiler specific ("-lc" or "-lc_r", "-lpthreads",...)
  29. # arguments will be automatically passed to "ld" according
  30. # to the CC command provided as a first argument to this
  31. # script. Usually, the same CC command was used to produce
  32. # the pre-compiled .o file(s).
  33. #
  34. # NOTES: 1. Since "ld_so_aix" was originally written for building
  35. # shared modules for the Python interpreter, the -e and
  36. # -bI default values match Python's conventions. In
  37. # Python, the entry point for a shared module is based
  38. # on the module's name (e.g., the "mathmodule" will
  39. # expect an entry point of "initmath").
  40. # 2. The script accepts multiple .o or .a input files and
  41. # creates a single (shared) output file. The export list
  42. # that is created is based on the output file's basename
  43. # with the suffix ".exp".
  44. # 3. The resulting shared object file is left in the
  45. # current directory.
  46. # 4. Uncommenting the "echo" lines gives detailed output
  47. # about the commands executed in the script.
  48. #
  49. #
  50. # HISTORY: Oct-1996 -- Support added for multiple .o files --
  51. # -- and optional arguments processing. --
  52. # Chris Myers (myers@tc.cornell.edu), Keith Kwok
  53. # (kkwok@tc.cornell.edu) and Vladimir Marangozov
  54. #
  55. # Aug-6-1996 -- Take care of the compiler specific --
  56. # -- args by leaving CC to invoke "ld". --
  57. # Vladimir Marangozov
  58. #
  59. # Jul-1-1996 -- Make sure to use /usr/ccs/bin/ld --
  60. # -- Use makexp_aix for the export list. --
  61. # Vladimir Marangozov (Vladimir.Marangozov@imag.fr)
  62. #
  63. # Manus Hand (mhand@csn.net) -- Initial code -- 6/24/96
  64. # ========================================================================
  65. #
  66. usage="Usage: ld_so_aix [CC command] [ld arguments]"
  67. if test ! -n "$*"; then
  68. echo $usage; exit 2
  69. fi
  70. makexp=`dirname $0`/makexp_aix
  71. # Check for existence of compiler.
  72. CC=$1; shift
  73. whichcc=`which $CC`
  74. if test ! -x "$whichcc"; then
  75. echo "ld_so_aix: Compiler '$CC' not found; exiting."
  76. exit 2
  77. fi
  78. if test ! -n "$*"; then
  79. echo $usage; exit 2
  80. fi
  81. # Default import file for Python
  82. # Can be overriden by providing a -bI: argument.
  83. impfile="./python.exp"
  84. # Parse arguments
  85. while test -n "$1"
  86. do
  87. case "$1" in
  88. -e | -Wl,-e)
  89. if test -z "$2"; then
  90. echo "ld_so_aix: The -e flag needs a parameter; exiting."; exit 2
  91. else
  92. shift; entry=$1
  93. fi
  94. ;;
  95. -e* | -Wl,-e*)
  96. entry=`echo $1 | sed -e "s/-Wl,//" -e "s/-e//"`
  97. ;;
  98. -o)
  99. if test -z "$2"; then
  100. echo "ld_so_aix: The -o flag needs a parameter; exiting."; exit 2
  101. else
  102. shift; objfile=$1
  103. fi
  104. ;;
  105. -o*)
  106. objfile=`echo $1 | sed "s/-o//"`
  107. ;;
  108. -bI:* | -Wl,-bI:*)
  109. impfile=`echo $1 | sed -e "s/-Wl,//" -e "s/-bI://"`
  110. ;;
  111. -bE:* | -Wl,-bE:*)
  112. expfile=`echo $1 | sed -e "s/-Wl,//" -e "s/-bE://"`
  113. ;;
  114. *.o | *.a)
  115. objs="$objs $1"
  116. args="$args $1"
  117. ;;
  118. -bM:* | -Wl,-bM:* | -H* | -Wl,-H* | -T* | -Wl,-T* | -lm)
  119. ;;
  120. *)
  121. args="$args $1"
  122. ;;
  123. esac
  124. shift
  125. done
  126. if test -z "$objs"; then
  127. echo "ld_so_aix: No input files; exiting."
  128. exit 2
  129. elif test ! -r "$impfile"; then
  130. echo "ld_so_aix: Import file '$impfile' not found or not readable; exiting."
  131. exit 2
  132. fi
  133. # If -o wasn't specified, assume "-o shr.o"
  134. if test -z "$objfile"; then
  135. objfile=shr.o
  136. fi
  137. filename=`basename $objfile | sed "s/\.[^.]*$//"`
  138. # If -bE: wasn't specified, assume "-bE:$filename.exp"
  139. if test -z "$expfile"; then
  140. expfile="$filename.exp"
  141. fi
  142. # Default entry symbol for Python modules = init[modulename]
  143. # Can be overriden by providing a -e argument.
  144. if test -z "$entry"; then
  145. entry=init`echo $filename | sed "s/module.*//"`
  146. fi
  147. #echo "ld_so_aix: Debug info section"
  148. #echo " -> output file : $objfile"
  149. #echo " -> import file : $impfile"
  150. #echo " -> export file : $expfile"
  151. #echo " -> entry point : $entry"
  152. #echo " -> object files: $objs"
  153. #echo " -> CC arguments: $args"
  154. CCOPT="-Wl,-e$entry -Wl,-bE:$expfile -Wl,-bI:$impfile -Wl,-bhalt:4"
  155. CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -lm -o $objfile"
  156. # Note: to use dynamic libraries like libtcl8.4.so and libtk8.4.so
  157. # you may need to replace the second CCOPT line above with the following:
  158. # CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -brtl -bnortllib -lm -o $objfile"
  159. CCARGS="$args"
  160. # Export list generation.
  161. #echo $makexp $expfile "$objfile" $objs
  162. $makexp $expfile "$objfile" $objs
  163. # Perform the link.
  164. #echo $CC $CCOPT $CCARGS
  165. $CC $CCOPT $CCARGS
  166. retval=$?
  167. # Delete the module's export list file.
  168. # Comment this line if you need it.
  169. rm -f $expfile
  170. exit $retval