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