#! /bin/sh -f # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # Copyright (c) 1989 AT&T # All Rights Reserved # # Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved. # # COMMON LORDER # # if test -z $TMPDIR { setvar TDIR = ""/tmp"" } else { setvar TDIR = "$TMPDIR" } trap "rm -f $TDIR/$Pidsymdef $TDIR/$Pidsymref $TDIR/$Pidtmp; exit" 1 2 13 15 setvar PFX = '' setvar WHERE = '/usr/bin' setvar USAGE = ""Usage: ${PFX}lorder file ..."" for i in [@ARGV] { match $i { with -* echo $USAGE; exit 2 } if test ! -r $i { echo "${PFX}lorder: $i: cannot open" exit 2; } } match $Argc { with 0 echo $USAGE exit 2 with 1 match $1 { with *.o set $1 $1 } } # The following sed script is commented here. # The first three expressions in the sed script # insures that we only have lines # that contain file names and the external # declarations associated with each file. # The next two parts of the sed script put the pattern # (in this case the file name) into the hold space # and creates the "filename filename" lines and # writes them out. The first part is for .o files, # the second is for .o's in archives. # The last 2 sections of code are exactly alike but # they handle different external symbols, namely the # symbols that are defined in the text section, data section, bss # section or common symbols and symbols # that are referenced but not defined in this file. # A line containing the symbol (from the pattern space) and # the file it is referenced in (from the hold space) is # put into the pattern space. # If its text, data, bss or common it is written out to the # symbol definition (symdef) file, otherwise it was referenced # but not declared in this file so it is written out to the # symbol referenced (symref) file. # # ${WHERE}/${PFX}nm -p $ifsjoin(ARGV) 2>$TDIR/$$tmp | sed -e '/^[ ]*$/d' -e ' /^[0-9]* R $/d / [a-zFLS] /d /[^]]:$/{ s/:// h s/.*/& &/ p d } /]:$/{ s/]:// s/^.*\[// h s/.*/& &/ p d } / [TDBNCAR] /{ s/^.* [TDBNCAR] // G s/\n/ / w '$TDIR/$Pidsymdef' d } / U /{ s/^.* U // G s/\n/ / w '$TDIR/$Pidsymref' d } ' if test -s $TDIR/$Pidtmp { sed -e "s/^${PFX}nm:/${PFX}lorder:/" < $TDIR/$$tmp >&2 rm -f $TDIR/$Pidsymdef $TDIR/$Pidsymref $TDIR/$Pidtmp exit 1 } sort $TDIR/$Pidsymdef -o $TDIR/$Pidsymdef sort $TDIR/$Pidsymref -o $TDIR/$Pidsymref join $TDIR/$Pidsymref $TDIR/$Pidsymdef | sed 's/[^ ]* *//' rm -f $TDIR/$Pidsymdef $TDIR/$Pidsymref $TDIR/$Pidtmp