#!/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 -c [-l ] [-n] [--] ...' 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"