ld_so_aix.in 6.08 KB
Newer Older
1 2 3 4 5 6 7
#!/bin/sh
#
#   ========================================================================
#   FILE:           ld_so_aix
#   TYPE:           executable, uses makexp_aix
#   SYSTEM:         AIX
#
8 9
#   DESCRIPTION:    Creates a shareable .o from a set of pre-compiled 
#                   (unshared) .o files
10
#
11 12
#   USAGE:          ld_so_aix [CC] [arguments]
#
13 14 15
#   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):
16
#
17 18 19 20 21 22
#                       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
23
#                       -bhalt:[Number]              -bhalt:4
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#                       -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
47
#                       about the commands executed in the script.
48
#
49
#                       
50 51 52 53 54 55
#   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  --
56 57 58 59
#                               -- args by leaving CC to invoke "ld".  --
#                   Vladimir Marangozov
#
#                   Jul-1-1996  -- Make sure to use /usr/ccs/bin/ld    --
60 61 62 63 64 65 66
#                               -- Use makexp_aix for the export list. --
#                   Vladimir Marangozov     (Vladimir.Marangozov@imag.fr)
#
#                   Manus Hand (mhand@csn.net) -- Initial code -- 6/24/96
#   ========================================================================
#

67 68 69 70 71
usage="Usage: ld_so_aix [CC command] [ld arguments]"
if test ! -n "$*"; then
  echo $usage; exit 2
fi

72 73
makexp=`dirname $0`/makexp_aix

74
# Check for existence of compiler.
75
CC=$1; shift
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
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
133

134
if test "$objfile" = "libpython@VERSION@@ABIFLAGS@.so"; then
135 136
  ldsocoremode="true" 
fi
137 138 139 140

if test -z "$objs"; then
  echo "ld_so_aix: No input files; exiting."
  exit 2
141
elif test ! -r "$impfile" -a -z "$ldsocoremode"; then
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
  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
161
  entry=PyInit_`echo $filename | sed "s/module.*//"`
162 163
fi

164
#echo "ld_so_aix: Debug info section"
165 166 167 168 169 170
#echo "  -> output file : $objfile"
#echo "  -> import file : $impfile"
#echo "  -> export file : $expfile"
#echo "  -> entry point : $entry"
#echo "  -> object files: $objs"
#echo "  -> CC arguments: $args"
171

172 173 174 175 176 177
if test -z "$ldsocoremode"; then
  CCOPT="-Wl,-e$entry -Wl,-bE:$expfile -Wl,-bI:$impfile -Wl,-bhalt:4"
else
  CCOPT="-Wl,-bnoentry -Wl,-bE:$expfile -Wl,-bhalt:4"
fi
CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -Wl,-brtl -Wl,-bnortllib -lm -o $objfile"
178

179
CCARGS="$args"
180

181
# Export list generation.
182 183
#echo $makexp $expfile "$objfile" $objs
$makexp $expfile "$objfile" $objs
184 185

# Perform the link.
186 187
#echo $CC $CCOPT $CCARGS
$CC $CCOPT $CCARGS
188
retval=$?
189 190 191

# Delete the module's export list file.
# Comment this line if you need it.
192
rm -f $expfile
193 194

exit $retval