Spaces:
Runtime error
Runtime error
# Copyright (c) 2013, Derek Buitenhuis | |
# | |
# Permission to use, copy, modify, and/or distribute this software for any | |
# purpose with or without fee is hereby granted, provided that the above | |
# copyright notice and this permission notice appear in all copies. | |
# | |
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
# mktemp isn't POSIX, so supply an implementation | |
mktemp() { | |
echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" | |
} | |
if [ $# -lt 2 ]; then | |
echo "Usage: makedef <version_script> <objects>" >&2 | |
exit 0 | |
fi | |
vscript=$1 | |
shift | |
if [ ! -f "$vscript" ]; then | |
echo "Version script does not exist" >&2 | |
exit 1 | |
fi | |
for object in "$@"; do | |
if [ ! -f "$object" ]; then | |
echo "Object does not exist: ${object}" >&2 | |
exit 1 | |
fi | |
done | |
# Create a lib temporarily to dump symbols from. | |
# It's just much easier to do it this way | |
libname=$(mktemp -u "library").lib | |
trap 'rm -f -- $libname' EXIT | |
if [ -n "$AR" ]; then | |
$AR rcs ${libname} $@ >/dev/null | |
else | |
lib.exe -out:${libname} $@ >/dev/null | |
fi | |
if [ $? != 0 ]; then | |
echo "Could not create temporary library." >&2 | |
exit 1 | |
fi | |
IFS=' | |
' | |
prefix="$EXTERN_PREFIX" | |
started=0 | |
regex="none" | |
for line in $(cat ${vscript} | tr '\t' ' '); do | |
# We only care about global symbols | |
echo "${line}" | grep -q '^ \+global:' | |
if [ $? = 0 ]; then | |
started=1 | |
line=$(echo "${line}" | sed -e 's/^ \{1,\}global: *//') | |
else | |
echo "${line}" | grep -q '^ \+local:' | |
if [ $? = 0 ]; then | |
started=0 | |
fi | |
fi | |
if [ ${started} = 0 ]; then | |
continue | |
fi | |
# Handle multiple symbols on one line | |
IFS=';' | |
# Work around stupid expansion to filenames | |
line=$(echo "${line}" | sed -e 's/\*/.\\+/g') | |
for exp in ${line}; do | |
# Remove leading and trailing whitespace | |
exp=$(echo "${exp}" | sed -e 's/^ *//' -e 's/ *$//') | |
if [ "${regex}" = "none" ]; then | |
regex="${exp}" | |
else | |
regex="${regex};${exp}" | |
fi | |
done | |
IFS=' | |
' | |
done | |
if [ -n "$NM" ]; then | |
# Use eval, since NM="nm -g" | |
dump=$(eval "$NM --defined-only -g ${libname}" | | |
grep -v : | | |
grep -v ^$ | | |
cut -d' ' -f3 | | |
sed -e "s/^${prefix}//") | |
else | |
dump=$(dumpbin.exe -linkermember:1 ${libname} | | |
sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' | | |
tail -n +2 | | |
cut -d' ' -f3) | |
fi | |
rm ${libname} | |
IFS=';' | |
list="" | |
for exp in ${regex}; do | |
list="${list}"' | |
'$(echo "${dump}" | | |
grep "^${exp}" | | |
sed -e 's/^/ /') | |
done | |
echo "EXPORTS" | |
echo "${list}" | sort | uniq | tail -n +2 | |