83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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"
 |