xref: /freebsd/usr.bin/lorder/lorder.sh (revision 3494f7c0)
1#!/bin/sh -
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5# Copyright (c) 1990, 1993
6#	The Regents of the University of California.  All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the University nor the names of its contributors
17#    may be used to endorse or promote products derived from this software
18#    without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31
32# only one argument is a special case, just output the name twice
33case $# in
34	0)
35		echo "usage: lorder file ...";
36		exit ;;
37	1)
38		echo $1 $1;
39		exit ;;
40esac
41
42# temporary files
43R=$(mktemp -t _reference_)
44S=$(mktemp -t _symbol_)
45NM=${NM:-nm}
46
47# remove temporary files on HUP, INT, QUIT, PIPE, TERM
48trap "rm -f $R $S $T; exit 1" 1 2 3 13 15
49
50# make sure all the files get into the output
51for i in $*; do
52	echo $i $i
53done
54
55# if the line has " [RTDW] " it's a globally defined symbol, put it
56# into the symbol file.
57#
58# if the line has " U " it's a globally undefined symbol, put it into
59# the reference file.
60${NM} ${NMFLAGS} -go $* | sed "
61	/ [RTDW] / {
62		s/:.* [RTDW] / /
63		w $S
64		d
65	}
66	/ U / {
67		s/:.* U / /
68		w $R
69	}
70	d
71"
72
73export LC_ALL=C
74# eliminate references that can be resolved by the same library.
75if [ $(expr "$*" : '.*\.a[[:>:]]') -ne 0 ]; then
76	sort -u -o $S $S
77	sort -u -o $R $R
78	T=$(mktemp -t _temp_)
79	comm -23 $R $S >$T
80	mv $T $R
81fi
82
83# sort references and symbols on the second field (the symbol),
84# join on that field, and print out the file names.
85sort -k 2 -o $R $R
86sort -k 2 -o $S $S
87join -j 2 -o 1.1 2.1 $R $S
88rm -f $R $S
89