From a1b1cdbab2fb5326a6b6347805660fa167b260f5 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 21 Oct 1996 15:10:39 +0000 Subject: Major upgrade by Vladimir Marangozov. --- Modules/ld_so_aix | 180 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 144 insertions(+), 36 deletions(-) diff --git a/Modules/ld_so_aix b/Modules/ld_so_aix index e5da17e..57fbdeb 100755 --- a/Modules/ld_so_aix +++ b/Modules/ld_so_aix @@ -5,32 +5,53 @@ # TYPE: executable, uses makexp_aix # SYSTEM: AIX # -# DESCRIPTION: Creates a shareable .o from a pre-compiled (unshared) -# .o file +# DESCRIPTION: Creates a shareable .o from a set of pre-compiled +# (unshared) .o files # # USAGE: ld_so_aix [CC] [arguments] # -# ARGUMENTS: Same as for "ld". The -bM, -bE, -bI, -H, -T, and -lm -# arguments will be supplied by this script. The compiler -# specific ("-lc" or "-lc_r", "-lpthreads", etc) arguments -# will be automatically passed to "ld" according to the CC -# command provided as a first argument to this script. -# Usually, the same CC command was used to produce the -# pre-compiled .o file. +# ARGUMENTS: Same as for "ld". The following arguments are processed +# or supplied by this script (those marked with an asterisk +# can be overriden from command line): # -# NOTES: 1. Currently specific to the building of Python -# interpreter shared objects, in that the entry -# point name is hardcoded based on the object file -# name (the "mathmodule.o" file will expect an -# entry point of "initmath"). This could be remedied -# by the support (or simple expectation) of a "-e" -# argument. -# 2. The resulting shared object file is left in the -# current directory with the extension .so -# 3. Uncommenting the "echo" lines gives detailed output +# Argument Default value +# (*) -o [OutputFileName] -o shr.o +# (*) -e [EntryPointLabel] -e init[OutputBaseName] +# (*) -bE:[ExportFile] -bE:[OutputBaseName].exp +# (*) -bI:[ImportFile] -bI:./python.exp +# -bM:[ModuleType] -bM:SRE +# -T[Number] -T512 +# -H[Number] -H512 +# -lm +# +# The compiler specific ("-lc" or "-lc_r", "-lpthreads",...) +# arguments will be automatically passed to "ld" according +# to the CC command provided as a first argument to this +# script. Usually, the same CC command was used to produce +# the pre-compiled .o file(s). +# +# NOTES: 1. Since "ld_so_aix" was originally written for building +# shared modules for the Python interpreter, the -e and +# -bI default values match Python's conventions. In +# Python, the entry point for a shared module is based +# on the module's name (e.g., the "mathmodule" will +# expect an entry point of "initmath"). +# 2. The script accepts multiple .o or .a input files and +# creates a single (shared) output file. The export list +# that is created is based on the output file's basename +# with the suffix ".exp". +# 3. The resulting shared object file is left in the +# current directory. +# 4. Uncommenting the "echo" lines gives detailed output # about the commands executed in the script. +# # -# HISTORY: Aug-6-1996 -- Take care of the compiler specific -- +# HISTORY: Oct-1996 -- Support added for multiple .o files -- +# -- and optional arguments processing. -- +# Chris Myers (myers@tc.cornell.edu), Keith Kwok +# (kkwok@tc.cornell.edu) and Vladimir Marangozov +# +# Aug-6-1996 -- Take care of the compiler specific -- # -- args by leaving CC to invoke "ld". -- # Vladimir Marangozov # @@ -42,21 +63,113 @@ # ======================================================================== # -# Variables +usage="Usage: ld_so_aix [CC command] [ld arguments]" +if test ! -n "$*"; then + echo $usage; exit 2 +fi + +# Check for existence of compiler. CC=$1; shift +whichcc=`which $CC` + +if test ! -x "$whichcc"; then + echo "ld_so_aix: Compiler '$CC' not found; exiting." + exit 2 +fi + +if test ! -n "$*"; then + echo $usage; exit 2 +fi + +# Default import file for Python +# Can be overriden by providing a -bI: argument. +impfile="./python.exp" + +# Parse arguments +while test -n "$1" +do + case "$1" in + -e | -Wl,-e) + if test -z "$2"; then + echo "ld_so_aix: The -e flag needs a parameter; exiting."; exit 2 + else + shift; entry=$1 + fi + ;; + -e* | -Wl,-e*) + entry=`echo $1 | sed -e "s/-Wl,//" -e "s/-e//"` + ;; + -o) + if test -z "$2"; then + echo "ld_so_aix: The -o flag needs a parameter; exiting."; exit 2 + else + shift; objfile=$1 + fi + ;; + -o*) + objfile=`echo $1 | sed "s/-o//"` + ;; + -bI:* | -Wl,-bI:*) + impfile=`echo $1 | sed -e "s/-Wl,//" -e "s/-bI://"` + ;; + -bE:* | -Wl,-bE:*) + expfile=`echo $1 | sed -e "s/-Wl,//" -e "s/-bE://"` + ;; + *.o | *.a) + objs="$objs $1" + args="$args $1" + ;; + -bM:* | -Wl,-bM:* | -H* | -Wl,-H* | -T* | -Wl,-T* | -lm) + ;; + *) + args="$args $1" + ;; + esac + shift +done -objfile=$1; shift -filename=`echo $objfile | sed -e "s:.*/\([^/]*\)$:\1:" -e "s/\..*$//"` -entry=init`echo $filename | sed "s/module.*//"` -expfile="$filename.exp" -impfile="python.exp" + +if test -z "$objs"; then + echo "ld_so_aix: No input files; exiting." + exit 2 +elif test ! -r "$impfile"; then + echo "ld_so_aix: Import file '$impfile' not found or not readable; exiting." + exit 2 +fi + +# If -o wasn't specified, assume "-o shr.o" +if test -z "$objfile"; then + objfile=shr.o +fi + +filename=`basename $objfile | sed "s/\.[^.]*$//"` + +# If -bE: wasn't specified, assume "-bE:$filename.exp" +if test -z "$expfile"; then + expfile="$filename.exp" +fi + +# Default entry symbol for Python modules = init[modulename] +# Can be overriden by providing a -e argument. +if test -z "$entry"; then + entry=init`echo $filename | sed "s/module.*//"` +fi + +#echo "ld_so_aix: Debug info section +#echo " -> output file : $objfile" +#echo " -> import file : $impfile" +#echo " -> export file : $expfile" +#echo " -> entry point : $entry" +#echo " -> object files: $objs" +#echo " -> CC arguments: $args" CCOPT="-Wl,-e$entry -Wl,-bE:$expfile -Wl,-bI:$impfile" -CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -lm" -CCARGS="$objfile $*" +CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -lm -o $objfile" +CCARGS="$args" -# Export list generation -makexp_aix $filename.exp "$objfile" $objfile +# Export list generation. +#echo makexp_aix $expfile "$objfile" $objs +makexp_aix $expfile "$objfile" $objs # Perform the link. #echo $CC $CCOPT $CCARGS @@ -64,9 +177,4 @@ $CC $CCOPT $CCARGS # Delete the module's export list file. # Comment this line if you need it. -rm -f $filename.exp - -# Remove the exec rights on the shared module. -#echo chmod -x `echo $objfile | sed "s/\.o$/.so/"` -chmod -x `echo $objfile | sed "s/\.o$/.so/"` - +rm -f $expfile -- cgit v0.12