Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108310867
D44133.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D44133.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D44133: lorder: Clean up and improve robustness.
Attached
Detach File
Event Timeline
Log In to Comment