The Unix Heritage Society mailing list
 help / color / mirror / Atom feed
* Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-31  3:22 Rudi Blom
  0 siblings, 0 replies; 23+ messages in thread
From: Rudi Blom @ 2018-12-31  3:22 UTC (permalink / raw)
  To: tuhs

>Date: Sun, 30 Dec 2018 14:24:55 -0500
>From: Paul Winalski <paul.winalski@gmail.com>
>To: Norman Wilson <norman@oclsc.org>
>Cc: tuhs@tuhs.org
>Subject: Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
>Message-ID:
>        <CABH=_VTqZzNXPNecFCVZeqfMTnoJiWHbXZz->BriRGtxBY0J10Q@mail.gmail.com>
>Content-Type: text/plain; charset="UTF-8"
>
>On 12/30/18, Norman Wilson <norman@oclsc.org> wrote:
>
>> <snip>
>>
>> Nowadays ranlib is no longer a separate program: ar
>> recognizes object files and maintains an index if any are
>> present.  I never especially liked that; ar is in.
>> principle a general tool so why should it have a special
>> case for one type of file?  But in practice I don't know
>> anyone who uses ar for anything except libraries any more
>> (everyone uses tar for the general case, since .it does a.
>> better job).
>
>As you say, nobody these days uses ar for anything except object
>module libraries.  And just about anything you do that modifies an ar
>library will require re-running ranlib afterwards.  So as a
>convenience and as a way to avoid cockpit errors, it makes sense to
>merge the ranlib function into ar.  MacOS still uses an independent
>ranlib, and it's a pain in the butt to have to remember to run ranlib
>after each time you modify an archive.
>
Maybe not on some of the older, more (resource) restricted systems,
but now normally wouldn't modifying an archive be part of
definitions/rules in a makefile and as such wouldn't the makefile
include using ranlib if an archive was modified ?

uncle rubl

^ permalink raw reply	[flat|nested] 23+ messages in thread
* Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-31  2:28 Doug McIlroy
  2018-12-31  3:34 ` Will Senn
  0 siblings, 1 reply; 23+ messages in thread
From: Doug McIlroy @ 2018-12-31  2:28 UTC (permalink / raw)
  To: tuhs

> But wasn't it tsort that did the heavy lifting to get things in order?

An amusing notion. Having written tsort, I can assure you it couldn't
lift anything heavy--it used the most naive quadratic algorithm. But
it was good enough for libc.

Doug

^ permalink raw reply	[flat|nested] 23+ messages in thread
* Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-30 19:07 Norman Wilson
  2018-12-30 19:24 ` Paul Winalski
  2018-12-31  6:57 ` arnold
  0 siblings, 2 replies; 23+ messages in thread
From: Norman Wilson @ 2018-12-30 19:07 UTC (permalink / raw)
  To: tuhs

Warner Losh:

  But wasn't it tsort that did the heavy lifting to get things in order?

  ar c foo.a `tsort *.o`

  Ranlib just made it fast by adding an index..

====

There's a little more than that to ranlib.

Without ranlib, ld made a single pass through each library,
loading the modules that resolved unresolved symbols.  If
a module itself had unresolved symbols (as many do) and
some of those symbols were defined in a module ld had
already passed, you were out of luck, unless you explicitly
told ld to run a second pass, e.g. cc x.o y.o -la -la.
Hence the importance of explicit ordering when building
the library archive, and the usefulness of tsort.

Ranlib makes a list of all the .o file in this archive and
the global symbols defined or used by each module, and
places the list first in the archive.  If ld is (as it
was) changed to recognize the index, it can then make a
list of all the object files needed from this archive, even
if needed only by some file it will load from the same
archive, then collect all required modules in a single pass.

Ld could all along have just made two passes through the
library, one to assemble the same list ranlib did in advance,
a second to load the files.  (Or perhaps a first pass to
load what it knows it needs and assemble the list, and a
second only if necessary.)  Presumably it didn't both to
make ld simpler and because disk I/O was much slower back
then (especially on a heavily-loaded time-sharing system,
something far less common today).  I suspect it would work
fine just to do it that way today.

Nowadays ranlib is no longer a separate program: ar
recognizes object files and maintains an index if any are
present.  I never especially liked that; ar is in
principle a general tool so why should it have a special
case for one type of file?  But in practice I don't know
anyone who uses ar for anything except libraries any more
(everyone uses tar for the general case, since it does a
better job).  Were I to wave flags over the matter I'd
rather push to ditch ar entirely save for compatibility
with the past, move to using tar rather than ar for object
libraries, and let ld do two passes when necessary rather
than requiring that libraries be specially prepared.  As
I say, I think modern systems are fast enough that that
would work fine.

Norman Wilson
Toronto ON

^ permalink raw reply	[flat|nested] 23+ messages in thread
* Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-29 14:13 Noel Chiappa
  0 siblings, 0 replies; 23+ messages in thread
From: Noel Chiappa @ 2018-12-29 14:13 UTC (permalink / raw)
  To: tuhs; +Cc: jnc

    > From: Warren Toomey

    > I just tried it here. I had to do:
    > ...
    > ar r ../lib1 *.o
    > ...
    > to get them to rebuild. Otherwise, I had empty libraries.

Duhh. I never noticed the missing "*.o"!

I wonder how that one slipped through? Looking at 'run', it really does look
like it was used to prepare the systems on the distribution tape. So probably
the libraries just happened to already hold the latest and greatest, so that
error had no effect.


The thing with needing to order the library contents properly to cause all the
modules to get loaded is, I reckon, the reason why 'ar' has those arguments to
specify where in the archive a given file goes.

	Noel

^ permalink raw reply	[flat|nested] 23+ messages in thread
* Re: [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-29  1:09 Noel Chiappa
  2018-12-29  1:26 ` Will Senn
                   ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Noel Chiappa @ 2018-12-29  1:09 UTC (permalink / raw)
  To: tuhs; +Cc: jnc

    > From: Will Senn

    > I whacked /usr/sys/lib1 and lib2 'accidentally' meaning I logged in as
    > bin changed to /usr/sys and typed rm lib1 and rm lib2 :).

Doesn't sound very accidental... :-)

    > sh run as bin doesn't do it.

Odd. 'run' in /usr/sys on my V6 machine (not that I use that, mind) says:
  
  chdir ken
  cc -c -O *.c
  ar r ../lib1
  rm *.o
  chdir ../dmr
  cc -c -O *.c
  ar r ../lib2
  rm *.o        

which should regenerate them - sort of. I suspect you really meant 'doing sh
run creates a lib1 and lib2, but then I get errors from the ld phase with
missing symbols'. Yes?

If so, the thing is that the V6 linker won't pull in an object module from a
library unless a global in it satisfies an already existing (i.e. in the
linking process) undefined global. (I don't know if this is true of later
linkers; never used 'em.) In other words, when loading a multi-module system,
the module with 'main' has to be first, and then the rest in an order such
that each one holds a previously-undefined symbol.

So the order of the object modules you'll get in lib? from the above, if you
precede them with 'rm lib?', is probably not the right order. (The above shell
script assumes they already exist, with the modules in the right order, so the
above just replaces them with the newly compiled versions...)

    > So, what magic incantation is required to rebuild them.

Here's the ordering in lib1:

  main.o
  alloc.o
  iget.o
  prf.o
  rdwri.o
  slp.o
  subr.o
  text.o
  trap.o
  sig.o
  sysent.o
  clock.o
  fio.o
  malloc.o
  nami.o
  pipe.o
  sys1.o
  sys2.o
  sys3.o
  sys4.o   

Other orders would work too (e.g. you could move sys?.o up just after sysent.o
and it should work).

My lib2 is somewhat odd, so I hesitate to list it, but since most modules in
dmr are pulled in from entries in c.c, almost any order will work, I think.

    Noel

^ permalink raw reply	[flat|nested] 23+ messages in thread
* [TUHS] Deleted lib1 and lib2 in v6, recoverable?
@ 2018-12-29  0:25 Will Senn
  0 siblings, 0 replies; 23+ messages in thread
From: Will Senn @ 2018-12-29  0:25 UTC (permalink / raw)
  To: tuhs

So... I whacked /usr/sys/lib1 and lib2 ‘accidentally’ meaning I logged in as bin changed to /usr/sys and typed rm lib1 and rm lib2 :). Now, I was thinking at the time that I could regenerate them... this seems like a possibility, but I can’t seem to get them back. 

sh run as bin doesn’t do it.

So, what magic incantation is required to rebuild them.

What motivated the exploration was a desire to modify main.c and see those changes manifest.

Help.

Thanks,

Will

Sent from my iPhone

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2019-01-02 14:15 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-31  3:22 [TUHS] Deleted lib1 and lib2 in v6, recoverable? Rudi Blom
  -- strict thread matches above, loose matches on Subject: below --
2018-12-31  2:28 Doug McIlroy
2018-12-31  3:34 ` Will Senn
2018-12-31  6:52   ` ron
2018-12-30 19:07 Norman Wilson
2018-12-30 19:24 ` Paul Winalski
2018-12-31  6:57 ` arnold
2019-01-02 13:54   ` Tony Finch
2018-12-29 14:13 Noel Chiappa
2018-12-29  1:09 Noel Chiappa
2018-12-29  1:26 ` Will Senn
2018-12-29  1:35 ` Warren Toomey
     [not found]   ` <82e23dba-38a4-3ee4-e35a-6293b8eef749@gmail.com>
2018-12-29  4:59     ` Warren Toomey
2018-12-29 16:26       ` Clem Cole
2018-12-29 16:49         ` Warner Losh
2018-12-29 17:48           ` Clem cole
2018-12-30 18:34 ` Paul Winalski
2018-12-30 18:48   ` ron
2018-12-30 18:56     ` Warner Losh
2018-12-30 19:02     ` Paul Winalski
2018-12-31  0:00   ` Donald ODona
2018-12-31 17:51     ` Paul Winalski
2018-12-29  0:25 Will Senn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).