betsy@dartvax.UUCP (Betsy Hanes Perry) (04/10/84)
(please, br'er Fox, don't throw me into that bramble bush!)
I need help interpreting the documentation on Ar(1); we're trying
to use it, and it doesn't seem to perform as expected.
The problem is as follows: here at Dartmouth, we're building
a large(600K) C program. It now takes approximately fifteen minutes
to reMake this program, even if only one routine has been changed.
At the moment, our Make includes the line:
cc $(OBJECTS) to reload the object files.
It occurred to us that it was wasteful to rebuild the entire object
file if we were modifying only one or two routines. It seemed from
the documentation that ar might be able to modify ONLY the changed
objects, leaving the others intact.
So we changed our Make file to read:
ar ruv tempint $(OBJECTS)
ranlib tempint
ld -o int tempint
Unfortunately, this doesn't seem to produce a usable binary.
Does anybody out there have any clues as to why? (Please reply
by mail if possible..)
Thank you.
Betsy Hanes Perry
Lorien Pratt
(decvax,linus,cornell)!dartvax!dartlib!(rbetsy,rlorien)
--
Betsy Perry
UUCP: {decvax|linus|cornell}!dartvax!betsy
CSNET: betsy@dartmouth
ARPA: betsy%dartmouth@csnet-relaygwyn@brl-vgr.ARPA (Doug Gwyn ) (04/11/84)
Your problem is almost certainly that
ld -o int $(LIBRARY)
does not include the run-time startoff nor the -X flag.
Why not let "cc" do this for you:
cc -o int $(LDFLAGS) ${LIBRARY}ebk@iedl02.UUCP (04/14/84)
Creating an archive with your object files and ranlib'ing it is not really
much faster than doing a cc ${OBJECTS}, since ld still needs to go through
each module. If you really want to do this, though, you will need
to do a bit more than just ld <archive_file>.
ld only loads archive members necessary to satisfy any undefined externals.
either leave your main module out of the archive and
cc -o int main.o tempint
or use the -u flag of ld: ld -u main -o int tempint
You should almost always use cc instead of ld, since there are several
switches that need to be used in the ld invocation that cc provides,
which are dependent on the implementation, whether you are using a floating
point simulator and/or profiling, overlays, etc.
John Owens
~egwyn@brl-vgr.ARPA (Doug Gwyn ) (04/20/84)
If main() is in the first module in the archive, then just cc arch.a suffices to link everything, since the run-time startoff already has a reference to the extern main (_main or whatever). If the archive has a table of contents (4.?BSD or latest AT&T UNIX), then the module containing main() need not even be first in the archive.
adm@cbneb.UUCP (05/01/84)
#R:brl-vgr:-41300:cbnap:27400001:000:199 cbnap!whp Apr 26 09:27:00 1984 In addition, you don't even need to use ar! You want to recompile only those routines which were modified, then use the "$?" macro of make. Using an archive library is probably a good idea anyway.