From owner-freebsd-bugs@FreeBSD.ORG Sun Apr 19 19:30:02 2009 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6D7A1106564A for ; Sun, 19 Apr 2009 19:30:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 453518FC14 for ; Sun, 19 Apr 2009 19:30:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id n3JJU2At031827 for ; Sun, 19 Apr 2009 19:30:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id n3JJU2eR031826; Sun, 19 Apr 2009 19:30:02 GMT (envelope-from gnats) Resent-Date: Sun, 19 Apr 2009 19:30:02 GMT Resent-Message-Id: <200904191930.n3JJU2eR031826@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, John Hein Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 21FFD106566B for ; 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 ; 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 ; 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 To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/133860: lorder misses symbols defined in read only data section. X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: John Hein List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Apr 2009 19:30:02 -0000 >Number: 133860 >Category: bin >Synopsis: lorder 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: >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 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: