Skip to content

Instantly share code, notes, and snippets.

@tpoechtrager
Last active August 29, 2015 14:22
Show Gist options
  • Save tpoechtrager/1a645ac9f498c589a2bf to your computer and use it in GitHub Desktop.
Save tpoechtrager/1a645ac9f498c589a2bf to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
if [ -z "$HOSTPREFIX" ]; then
PLATFORM=$(uname -s)
if [[ $PLATFORM == *NT* ]] || [[ $PLATFORM == *WIN* ]]; then
HOSTPREFIX=i686-w64-mingw32
fi
fi
if [ -z "$SYMBOLS_TO_EXPORT" -o $# -eq 0 ]; then
echo -n "usage: SYMBOLS_TO_EXPORT=\"sym1 *sym2*, ...\" [HOSTPREFIX=...]"
echo "$0 obj1.o obj2.o ..."
exit 1
fi
SYMBOLS_TO_EXPORT=${SYMBOLS_TO_EXPORT//\"/}
if [[ $HOSTPREFIX == *mingw* ]]; then
LLVM_NM="llvm-nm"
LLVM_DIS="llvm-dis"
NM=$(which $LLVM_NM 2>/dev/null || which $HOSTPREFIX-nm 2>/dev/null || \
echo "nm")
SYMBOLS=""
for obj in $*; do
X86=0
FILETYPE=$(file $obj)
if [[ $FILETYPE == *LLVM\ IR\ bitcode* ]]; then
[[ $($LLVM_DIS $obj && cat $obj.ll | grep "target triple =" | head -n1 ;
rm $obj.ll) == *i*86* ]] && X86=1
else
[[ $FILETYPE == *80386* ]] && X86=1
fi
if [ $X86 -eq 1 ] || [[ $NM == *$LLVM_NM ]]; then
if [ $X86 -eq 1 ]; then
CHARSTOSKIP=13
else
CHARSTOSKIP=12
fi
else
CHARSTOSKIP=20
fi
OBJSYMBOLS=$($NM $obj --defined-only | grep -E " T | B " | \
cut -c ${CHARSTOSKIP}-)
SYMBOLS+=" $OBJSYMBOLS"
done
DEF="EXPORTS"
for symbol in $SYMBOLS; do
for symbol_to_export in ${SYMBOLS_TO_EXPORT//\*/\?}; do
eval "[[ "$symbol" == ${symbol_to_export//\?/\*} ]]"
if [ $? -eq 0 ]; then
DEF+=$'\n'"$symbol"
break
fi
done
done
echo "$DEF" > tmp.def
echo "tmp.def"
else
VERSCRIPT="{"$'\n'
VERSCRIPT+="global:"$'\n'
for symbol_to_export in ${SYMBOLS_TO_EXPORT//\*/\?}; do
VERSCRIPT+=" ${symbol_to_export//\?/\*};"$'\n'
done
VERSCRIPT+="local:"$'\n'" *;"$'\n'
VERSCRIPT+="};"
echo $VERSCRIPT > tmp.exports
echo "-Wl,--version-script=tmp.exports"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment