Page MenuHomeFreeBSD

D44133.diff
No OneTemporary

D44133.diff

diff --git a/usr.bin/lorder/lorder.1 b/usr.bin/lorder/lorder.1
--- a/usr.bin/lorder/lorder.1
+++ b/usr.bin/lorder/lorder.1
@@ -25,7 +25,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd March 21, 2023
+.Dd February 27, 2024
.Dt LORDER 1
.Os
.Sh NAME
@@ -44,13 +44,10 @@
.Nm
utility uses
.Xr nm 1
-to determine interdependencies in the list of object files
-and library archives
-specified on the command line.
-The
-.Nm
-utility outputs a list of file names where the first file contains a symbol
-which is defined by the second file.
+to determine interdependencies between object files and library
+archives listed on its command line.
+It then outputs a list of pairs of file names such that the first file
+in each pair references at least one symbol defined by the second.
.Pp
The output is normally used with
.Xr tsort 1
@@ -58,11 +55,11 @@
object modules so that all references may be resolved in a single
pass of the loader.
.Pp
-When linking static binaries,
+Similarly, when linking static binaries,
.Nm
and
.Xr tsort 1
-can be used to properly order library archives automatically.
+can be used to sort libraries in order of dependency.
.Pp
The use of
.Nm
@@ -97,3 +94,8 @@
.Nm
utility appeared in
.At v7 .
+.Sh CAVEATS
+The
+.Nm
+utility will not work properly if given file names with spaces or
+newlines in them.
diff --git a/usr.bin/lorder/lorder.sh b/usr.bin/lorder/lorder.sh
--- a/usr.bin/lorder/lorder.sh
+++ b/usr.bin/lorder/lorder.sh
@@ -29,35 +29,50 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
-# only one argument is a special case, just output the name twice
-case $# in
- 0)
- echo "usage: lorder file ...";
- exit ;;
- 1)
- echo $1 $1;
- exit ;;
-esac
+export LC_CTYPE=C
+export LC_COLLATE=C
+set -e
-# temporary files
+usage() {
+ echo "usage: lorder file ..." >&2
+ exit 1
+}
+
+while getopts "" opt ; do
+ case $opt in
+ *)
+ usage
+ ;;
+ esac
+done
+shift $(($OPTIND - 1))
+if [ $# -eq 0 ] ; then
+ usage
+fi
+
+#
+# Create temporary files.
+#
+N=$(mktemp -t _nm_)
R=$(mktemp -t _reference_)
S=$(mktemp -t _symbol_)
+T=$(mktemp -t _temp_)
NM=${NM:-nm}
-# remove temporary files on HUP, INT, QUIT, PIPE, TERM
-trap "rm -f $R $S $T; exit 1" 1 2 3 13 15
-
-# make sure all the files get into the output
-for i in $*; do
- echo $i $i
-done
+#
+# Remove temporary files on termination.
+#
+trap "rm -f $N $R $S $T" EXIT 1 2 3 13 15
-# if the line has " [RTDW] " it's a globally defined symbol, put it
-# into the symbol file.
#
-# if the line has " U " it's a globally undefined symbol, put it into
-# the reference file.
-${NM} ${NMFLAGS} -go $* | sed "
+# A line matching " [RTDW] " indicates that the input defines a symbol
+# with external linkage; put it in the symbol file.
+#
+# A line matching " U " indicates that the input references an
+# undefined symbol; put it in the reference file.
+#
+${NM} ${NMFLAGS} -go "$@" >$N
+sed -e "
/ [RTDW] / {
s/:.* [RTDW] / /
w $S
@@ -68,21 +83,28 @@
w $R
}
d
-"
+" <$N
-export LC_ALL=C
-# eliminate references that can be resolved by the same library.
-if [ $(expr "$*" : '.*\.a[[:>:]]') -ne 0 ]; then
- sort -u -o $S $S
- sort -u -o $R $R
- T=$(mktemp -t _temp_)
- comm -23 $R $S >$T
- mv $T $R
-fi
+#
+# Elide entries representing a reference to a symbol from within the
+# library that defines it.
+#
+sort -u -o $S $S
+sort -u -o $R $R
+comm -23 $R $S >$T
+mv $T $R
+
+#
+# Make sure that all inputs get into the output.
+#
+for i ; do
+ echo "$i" "$i"
+done
-# sort references and symbols on the second field (the symbol),
-# join on that field, and print out the file names.
+#
+# Sort references and symbols on the second field (the symbol), join
+# on that field, and print out the file names.
+#
sort -k 2 -o $R $R
sort -k 2 -o $S $S
join -j 2 -o 1.1 2.1 $R $S
-rm -f $R $S

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 24, 6:42 PM (21 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16096874
Default Alt Text
D44133.diff (3 KB)

Event Timeline