summaryrefslogtreecommitdiff
path: root/share/cmake-3.22/Modules/Platform/AIX/ExportImportList
blob: 891bce76d9e3dd1b914e38c013fffc7139418f52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/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> [-l <lib>] [-n] [--] <objects>...'

die() {
    echo "$@" 1>&2; exit 1
}

# Process command-line arguments.
out=''
lib=''
no_objects=''
while test "$#" != 0; do
    case "$1" in
    -l) shift; lib="$1" ;;
    -o) shift; out="$1" ;;
    -n) no_objects='1' ;;
    --) shift; break ;;
    -*) die "$usage" ;;
    *)  break ;;
    esac
    shift
done
test -n "$out" || 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"

# Collect symbols exported from all object files.
if test -z "$no_objects"; then
    for f in "$@"; do
        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)]
                }
            }
        '
    done >> "$out_tmp"
fi

# Generate the export/import file.
{
    if test -n "$lib"; then
        echo "#! $lib"
    fi
    sort -u "$out_tmp"
} > "$out"