blob: b198cc5ac26f347ccdf127196efd60f9ae782c2f [file] [log] [blame]
#!/bin/bash
###################################################################
# This script does the following: for implemented platforms, #
# it echos for each given path a line with the following format: #
# #
# <arch>;<obj>;<soname>;<rpath1:rpathN>;<needed1,neededN> #
# #
# arch may be any string, e.g. "PE32". obj is the full (!) path #
# to the file itself. soname, rpath and needed should be self #
# explaining - rpath is ":" separated, needed is "," separated. #
# #
# WARNING: Depends on CHOST argument to decide what to do! #
# #
# WARNING: The Script does _never_ fail! If required binaries #
# are missing, or information gathering fails, the #
# script will SILENTLY (!) exit, to not disturb the #
# normal merging process. #
# #
# WARNING: The _first_ argument needs to be a valid CHOST!!! #
# #
###################################################################
# Interix: Uses native objdump, since thats the only facility that
# knows about the native shared library information data.
# objdump is there in all interix installations where the GNU SDK
# is installed, which is a prerequisite for prefix anyway.
scanbin_interix() {
local _itx_objdump="/opt/gcc.3.3/bin/objdump"
[[ -x ${_itx_objdump} ]] || _itx_objdump="/opt/gcc.4.2/bin/objdump"
[[ -x ${_itx_objdump} ]] || exit 0
# objdump is there, so now gather the information
_itx_full_info() {
local obj="$(cd "$(dirname "$1")"; pwd)/${1##*/}"
local so=
local rp=
local ne=
{ file -L "${obj}" | grep "PE" > /dev/null 2>&1; } || return
_itx_gather() {
${_itx_objdump} -p "$1" | while IFS= read line; do
[[ ${line} == *RPATH* || ${line} == *NEEDED* || ${line} == *SONAME* ]] || continue
eval "$(echo "${line}" | sed -e 's,[[:space:]]*\([A-Z]*\)[[:space:]]*\(.*\)$,key=\1;value="\2",g')"
case "${key}" in
RPATH) echo "rp=\"${value}\"" ;;
NEEDED) echo "test -n \"\${ne}\" && ne=\"\${ne},${value}\"; test -z \"\${ne}\" && ne=\"${value}\"" ;;
SONAME) echo "so=\"${value}\"" ;;
esac
done
}
eval "$(_itx_gather ${obj})"
echo "386;${obj};${so};${rp};${ne}"
}
for x in "$@"; do
_itx_full_info "${x}"
done
exit 0
}
# Native Windows: Uses the winnt compiler ("parity") to gather
# information. parity is the only one knowing about the location
# and format of the relevant data, and it is there always when
# wanting to build native win32 executables.
scanbin_winnt() {
local _winnt_inspector="$(type -P "parity.inspector")"
[[ -x ${_winnt_inspector} ]] || exit 0
_winnt_full_info () {
local obj="$(cd "$(dirname "$1")"; pwd)/${1##*/}"
{ file -L "${obj}" | grep "PE" > /dev/null 2>&1; } || exit 0
# parity.inspector in --raw mode has exactly the format we
# want - wonder, wonder, i implemented that switch :)
local info="$(${_winnt_inspector} --raw "${obj}")"
echo "386;${obj};${info}"
}
for x in "$@"; do
_winnt_full_info "${x}"
done
}
# CHOST is the first argument!
_chost=$1
# verify CHOST...
[[ -z ${_chost} ]] && { echo "CHOST not set!!"; exit 1; }
[[ ${_chost} == *-*-* ]] || { echo "invalid CHOST!!"; exit 1; }
shift
case "${_chost}" in
*-interix*) scanbin_interix "$@" ;;
*-winnt*) scanbin_winnt "$@" ;;
esac