You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.5 KiB
83 lines
2.5 KiB
#!/bin/sh
|
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
# This script is internal to CMake and meant only to be
|
|
# invoked by CMake-generated build systems on AIX.
|
|
|
|
usage='usage: ExportImportList -o <out-file> -c <compiler> [-l <lib>] [-n] [--] <objects>...'
|
|
|
|
die() {
|
|
echo "$@" 1>&2; exit 1
|
|
}
|
|
|
|
# Process command-line arguments.
|
|
out=''
|
|
lib=''
|
|
no_objects=''
|
|
compiler=''
|
|
while test "$#" != 0; do
|
|
case "$1" in
|
|
-l) shift; lib="$1" ;;
|
|
-o) shift; out="$1" ;;
|
|
-n) no_objects='1' ;;
|
|
-c) shift; compiler="$1" ;;
|
|
--) shift; break ;;
|
|
-*) die "$usage" ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
test -n "$out" || die "$usage"
|
|
# We need the compiler executable to resolve where the ibm-llvm-nm executable is
|
|
test -n "$compiler" || die "$usage"
|
|
|
|
# Build a temporary file that atomically replaces the output later.
|
|
out_tmp="$out.tmp$$"
|
|
trap 'rm -f "$out_tmp"' EXIT INT TERM
|
|
> "$out_tmp"
|
|
|
|
# If IPA was enabled and a compiler from the IBMClang family is used, then
|
|
# the object files contain LLVM bitcode[0] rather than XCOFF objects and so
|
|
# need to be handled differently.
|
|
#
|
|
# [0]: https://www.ibm.com/docs/en/openxl-c-and-cpp-aix/17.1.0?topic=compatibility-link-time-optimization-lto
|
|
NM="$(dirname "$compiler")/../libexec/ibm-llvm-nm"
|
|
|
|
function IsBitcode {
|
|
# N4 = first 4 bytes, -tx = output in hexadecimal, -An = don't display offset
|
|
# cut: trim off the preceding whitespace where the offset would be
|
|
# 4243code is the hexadecimal magic number for LLVM bitcode
|
|
[ "$(od -N4 -tx -An $1 | cut -d ' ' -f 2)" == "4243c0de" ];
|
|
}
|
|
|
|
# Collect symbols exported from all object files.
|
|
if test -z "$no_objects"; then
|
|
for f in "$@"; do
|
|
if IsBitcode "$f"; then
|
|
"$NM" "$f" --defined-only --extern-only --just-symbol-name 2>/dev/null
|
|
else
|
|
dump -tov -X 32_64 "$f" |
|
|
awk '
|
|
BEGIN {
|
|
V["EXPORTED"]=" export"
|
|
V["PROTECTED"]=" protected"
|
|
}
|
|
/^\[[0-9]+\]\tm +[^ ]+ +\.(text|data|bss) +[^ ]+ +(extern|weak) +(EXPORTED|PROTECTED| ) / {
|
|
if (!match($NF,/^(\.|__sinit|__sterm|__[0-9]+__)/)) {
|
|
print $NF V[$(NF-1)]
|
|
}
|
|
}
|
|
'
|
|
fi
|
|
done >> "$out_tmp"
|
|
fi
|
|
|
|
# Generate the export/import file.
|
|
{
|
|
if test -n "$lib"; then
|
|
echo "#! $lib"
|
|
fi
|
|
sort -u "$out_tmp"
|
|
} > "$out"
|