blob: cec06a47bd3765626cba65757d609eb29c6d0229 [file] [log] [blame]
#! /usr/bin/env /bin/ksh
# Copyright 1999-2011 Gentoo Foundation; Distributed under the GPL v2
# $Id$
# Upon '-soname' and similar flags, create a "shared library" on AIX being an
# archive file containing an Import File and the shared object file, as in:
# http://lists.gnu.org/archive/html/libtool/2011-01/msg00023.html
# with updates in:
# http://lists.gnu.org/archive/html/libtool/2011-02/msg00000.html
#
# This helper script is meant not depend on anything Gentoo specific.
ld=/usr/ccs/bin/ld
ar=/usr/ccs/bin/ar
strip=/usr/ccs/bin/strip
dump=/usr/sbin/dump
awk=/usr/bin/awk
rm=/usr/bin/rm
mkdir=/usr/bin/mkdir
mv=/usr/bin/mv
ln=/usr/bin/ln
oldargs=
output=
soname=
newargs=
OBJECT_MODE=${OBJECT_MODE:-32}
while [[ $# -gt 0 ]]
do
arg=$1
shift
oldargs="${oldargs} '${arg}'"
case ${arg} in
-o)
newargs="${newargs} -o '$1'"
output=$1
oldargs="${oldargs} '$1'"
shift
;;
-bM:SRE)
newargs="${newargs} '-G' '-bernotok'"
;;
-soname=*)
soname=${arg#-soname=}
;;
-h*)
soname=${arg#-h}
;;
-soname|-h)
soname=$1
shift
;;
-b32)
newargs="${newargs} '${arg}'"
OBJECT_MODE=32
;;
-b64)
newargs="${newargs} '${arg}'"
OBJECT_MODE=64
;;
*)
newargs="${newargs} '${arg}'"
;;
esac
done
if [[ -z ${output} || -z ${soname} ]]; then
eval "exec ${ld} ${oldargs}"
exit 1
fi
# Running ld against the orginal target file to retain
# ld error message when there's a problem with it:
eval "${ld} -o '${output}' ${newargs}" || exit 1
workdir="${output}.$$"
${rm} -rf "${workdir}" || exit 1
trap "${rm} -rf '${workdir}'" 0
case ${soname} in
*\(*\))
shro=${soname#*\(}
shro=${shro%\)}
shri=${shro%.*}.imp
;;
*\[*\])
shro=${soname#*\[}
shro=${shro%\]}
shri=${shro%.*}.imp
;;
none) # loadable only module, not linkable: no import file
shro='shr.o'
soname="${output##*/}(${shro})"
shri=
;;
auto)
shro='shr.o'
soname=${output##*/}
if [[ ${soname} == lib*.so* ]]; then
# linkable library: need import file
shri=${shro%.*}.imp
else
# loadable only module, not linkable: no import file
shri=
fi
soname="${soname}(${shro})"
;;
*)
shro='shr.o'
shri=${shro%.*}.imp
soname="${soname}(${shro})"
;;
esac
export OBJECT_MODE
${mkdir} "${workdir}" || exit 1
${strip} -e "${output}" || exit 1
if [[ -n ${shri} ]]; then
${dump} -Tv "${output}" > "${workdir}"/syms || exit 1
${awk} '
BEGIN {
print "#! '"${soname}"'"
print "# '"${OBJECT_MODE}"'"
}
{
if ($6 != "SECdef") {
if ($4 == "EXP" || $4 == "ImpExp") {
print $8
} else
if ($4 == "wEXP") {
print $8" weak"
}
}
}' <"${workdir}"/syms > "${workdir}"/${shri} || exit 1
fi
${mv} "${output}" "${workdir}/${shro}" || exit 1
${ar} rc "${output}" ${shri:+"${workdir}/${shri}"} "${workdir}/${shro}" || exit 1
exit 0