[net.bugs] lorder bug

adam@gec-mi-at.co.uk (Adam Quantrill) (08/20/86)

Apologies if someone has fixed this before, but here goes...

I've got the onerous task of porting some of our crashware from
its nice, safe home on 4.2BSD to horrible sysV (flame flame!! 8^).
Anyway, while creating the libraries, I noticed something was awry
(mainly 'cos the damn thing wouldn't compile!) and I narrowed the problem
down to the fact that lorder doesn't spot global ints when making its
dependency decisions. This is because nm flags these symbols as 'C'.
Here's the fix:

--------8><-------cut-here----------8><--------------
19c
	/[TDC] /{
.
w
q
--------8><-------cut-here----------8><--------------

Run it via ed on the lorder shell script. If you use bss symbols (whatever
they are) you may wish to add a 'B' after the 'C' above. I've even put in the
w q for the lazy amongst us!

P.S. - Does this make me a wizard?

guy@sun.uucp (Guy Harris) (08/22/86)

> Anyway, while creating the libraries, I noticed something was awry
> (mainly 'cos the damn thing wouldn't compile!) and I narrowed the problem
> down to the fact that lorder doesn't spot global ints when making its
> dependency decisions. This is because nm flags these symbols as 'C'.

That's odd:

1) System V has "ranlib" built into "ar", so the only thing "lorder" should
do is perhaps make "ld" run faster.

2) The 4.2BSD "lorder" has "/[TD] /" on line 19.

3) The System V, Release 2 "lorder" doesn't have "/[TD] /" anywhere in it,
and line 19 is in the middle of a comment.

Did you do the "lorder"ing on a 4.2 or an S5 machine?  If the latter, you
don't have the S5 "lorder", and probably don't have the S5 object file
format.  You might have "ranlib", though; try running "ranlib" on the
library.  (There may, in fact, be a bug in "lorder" on 4.2, but not one that
causes problems since everybody "ranlib"s their libraries.  I think that
"lorder" dates back to V7, which had a "ranlib" as well but didn't document
it and didn't use it on "libc".)
-- 
	Guy Harris
	{ihnp4, decvax, seismo, decwrl, ...}!sun!guy
	guy@sun.com (or guy@sun.arpa)

sam@think.COM (Sam Kendall) (08/22/86)

In article <6425@sun.uucp> guy@sun.uucp (Guy Harris) writes:
>> Anyway, while creating the libraries, I noticed something was awry
>> (mainly 'cos the damn thing wouldn't compile!) and I narrowed the problem
>> down to the fact that lorder doesn't spot global ints when making its
>> dependency decisions. This is because nm flags these symbols as 'C'.

I (as sam@delftcc.UUCP) posted a fix to this a while ago, probably
sometime last year.  I don't have the fix handy.  Guy is right that
this bug shouldn't affect System V, although there really is a bug in
lorder.

On pre-COFF (AT&T Common Object File Format) UNIX systems, these are the
meanings of symbol types output by nm(1):

	Letter	Meaning				C example
	-----   -------				---------
	 U	Undefined			extern int i;
	 C	Common (in the Fortran sense)	int i;
	 D	Definition			int i = 5;
	 T	Text				f(){}
	 B	BSS (initialized to 0)		int i; after ld-ing

A 'C' symbol results from a noninitialized declaration of a global
variable.  'C' symbols appear only in relocatable object files.  Here
are a the rules for how ld(1) combines 'C' symbols:

	U* + C* + D => D
	U* + C*     => B

In other words, when any number of 'U's and 'C's combine with a 'D',
then the 'D' becomes the defining instance; but when any number of 'U's
and 'C's combine alone, the largest 'C' becomes the defining instance,
and the symbol is made into a 'B'.

The bug in lorder is that it recognizes only two classes of symbols for
the purposes of partial ordering: 'T' and 'D', and everything else.
But 'C' forms a middle class: symbols should be ordered 'U' first, then
'C', then 'T' or 'D'.

In putting the fix into lorder, you need to add a third temporary file,
and then run three joins instead of one.

---
Sam Kendall			sam@godot.think.com
Thinking Machines Corp.		ihnp4!think!sam