#! /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 ($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