From jhein@timing.com  Sun Apr 19 19:27:15 2009
Return-Path: <jhein@timing.com>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 21FFD106566B
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 19 Apr 2009 19:27:15 +0000 (UTC)
	(envelope-from jhein@timing.com)
Received: from Daffy.timing.com (ns2.timing.com [206.168.13.218])
	by mx1.freebsd.org (Postfix) with ESMTP id C7AA88FC0C
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 19 Apr 2009 19:27:14 +0000 (UTC)
	(envelope-from jhein@timing.com)
Received: from gromit.timing.com (gromit.timing.com [206.168.13.209])
	by Daffy.timing.com (8.13.1/8.13.1) with ESMTP id n3JJRDKE081441
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 19 Apr 2009 13:27:14 -0600 (MDT)
	(envelope-from jhein@timing.com)
Received: from gromit.timing.com (localhost [127.0.0.1])
	by gromit.timing.com (8.14.3/8.14.3) with ESMTP id n3JJR7lV018135;
	Sun, 19 Apr 2009 13:27:07 -0600 (MDT)
	(envelope-from jhein@gromit.timing.com)
Received: (from jhein@localhost)
	by gromit.timing.com (8.14.3/8.14.3/Submit) id n3JJR7aO018133;
	Sun, 19 Apr 2009 13:27:07 -0600 (MDT)
	(envelope-from jhein)
Message-Id: <200904191927.n3JJR7aO018133@gromit.timing.com>
Date: Sun, 19 Apr 2009 13:27:07 -0600 (MDT)
From: John Hein <jhein@timing.com>
Reply-To: John Hein <jhein@timing.com>
To: FreeBSD-gnats-submit@freebsd.org
Subject: lorder misses symbols defined in read only data section.
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         133860
>Category:       bin
>Synopsis:       [patch] lorder(1) misses symbols defined in read only data section.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Apr 19 19:30:01 UTC 2009
>Closed-Date:    
>Last-Modified:  Mon Apr 20 06:49:35 UTC 2009
>Originator:     John Hein
>Release:        FreeBSD 8.x 20090418 and earlier
>Organization:
>Environment:

>Description:

If a symbol is defined in the read only data section (shows up as an 'R'
in nm output), lorder(1) doesn't see it as a defined symbol.  As a result,
lorder can miss dependencies.

>How-To-Repeat:

Here is a contrived example that tries to use a read only symbol
defined in libz...

% cat ltest.c
#include <stdio.h>
extern int _dist_code;
int
main()
{
    printf("_dist_code: %d\n", _dist_code);
    return 0;
}
% nm -o ltest.o
ltest.o:         U _dist_code
ltest.o:00000000 T main
ltest.o:         U printf
% nm -go /usr/lib/libz.a | grep dist_code
/usr/lib/libz.a:deflate.o:         U _dist_code
/usr/lib/libz.a:trees.o:00000000 R _dist_code
% lorder ltest.o /usr/lib/libz.a /usr/lib/libc.a
ltest.o ltest.o
/usr/lib/libz.a /usr/lib/libz.a
/usr/lib/libc.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
ltest.o /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a
/usr/lib/libz.a /usr/lib/libc.a

Notice the missing dependency of ltest.o on libz.a.

So if you use lorder | tsort to determine link order, it can fail...

% gcc --nostdlib /usr/lib/libc.a `lorder ltest.o /usr/lib/libz.a |tsort -q` -o ltest
ltest.o(.text+0x12): In function `main':
: undefined reference to `_dist_code'



>Fix:

Index: lorder.sh
===================================================================
RCS file: /base/FreeBSD-CVS/src/usr.bin/lorder/lorder.sh,v
retrieving revision 1.7
diff -u -p -r1.7 lorder.sh
--- lorder.sh	15 Jul 2005 15:21:12 -0000	1.7
+++ lorder.sh	19 Apr 2009 18:43:01 -0000
@@ -65,8 +65,8 @@ done
 # if the line has " U " it's a globally undefined symbol, put it into
 # the reference file.
 ${NM} -go $* | sed "
-	/ [TDW] / {
-		s/:.* [TDW] / /
+	/ [RTDW] / {
+		s/:.* [RTDW] / /
 		w $S
 		d
 	}
>Release-Note:
>Audit-Trail:
>Unformatted:
