ld_so_aix 5.83 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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

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

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

169
CCOPT="-Wl,-e$entry -Wl,-bE:$expfile -Wl,-bI:$impfile -Wl,-bhalt:4"
170 171
CCOPT="$CCOPT -Wl,-bM:SRE -Wl,-T512 -Wl,-H512 -lm -o $objfile"
CCARGS="$args"
172

173
# Export list generation.
174 175
#echo $makexp $expfile "$objfile" $objs
$makexp $expfile "$objfile" $objs
176 177

# Perform the link.
178 179
#echo $CC $CCOPT $CCARGS
$CC $CCOPT $CCARGS
180 181 182

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