bin/133860: lorder misses symbols defined in read only data section.
John Hein
jhein at timing.com
Sun Apr 19 19:30:02 UTC 2009
>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 <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:
More information about the freebsd-bugs
mailing list