[comp.sys.ibm.pc] Question about linking files

Devin_E_Ben-Hur@cup.portal.com (03/29/89)

> I think that this discussion of external linkages has missed the point of
> the original poster, although I could be missing the point too.
> 
> If I read the original correctly, he is saying that given:
> 
>    MY.LIB  <==  A.OBJ  entry points A1  A2  A3  externals C1
>                 B.OBJ  entry points B1  B2  B3  
>                 C.OBJ  entry points C1  C2  C3
> 
Nope, the original poster made no mention of libraries.  He wished the linker
to treat: LINK A+B+C,P.EXE;  as if all the functions in A,B,&C were
independantly compiled then made into a library and linked only if referenced.

> and given
> 
>    main () { a1();  a3(); }
> 
> then the Turbo C linker will include ALL 3 modules in the resulting
> executable, whereas it is plain that B.OBJ is not required.  If this
> is, in fact, the case, then the Turbo C linker is _broken_.  The Microsoft
> Linker will include only A.OBJ and C.OBJ in the executable.
> 
The turbo linker will perform just link the uSoft linker for this.  Even if
it did include B.OBJ, it would not be _broken_  merely an inferior
implementation.  A broken linker produces an incorect program, including
b.obj does not make the output incorrect, merely larger than neccessary.

> Now, if A, B, and C are all modules on a single OBJ, and that OBJ is fed
> to the linker, then one would expect all three to appear on the executable.
> I don't think that was the question, however.
> 
> Tim_CDC_Roberts@cup.portal.com                | Control Data...
> ...!sun!portal!cup.portal.com!tim_cdc_roberts |   ...or it will control you.

Devin_Ben-Hur@Cup.Portal.Com
...ucbvax!sun!portal!cup.portal.com!devin_ben-hur

dg@lakart.UUCP (David Goodenough) (04/14/89)

Guts of argument:

file1:		proc1() { proc3(); }

file2:		proc2() { }

file3:		proc3() { }

N.B. file2 is not necessary to resolve inclusion of file1.

The question: Should inclusion of file2 on the command line cause
inclusion of the code for proc2, even though it is not needed to
resolve any undefined labels?

The answer: (IMHO) Yes.

There is a difference between object files (UNIX .o) and Libraries (UNIX .a)
ALL stuff in a .o should be included because it may be needed to resolve
a forward reference. When I write programs, I can produce just 14K of
object from 20 source files (OK I'm using Z80 assembler, but the principle
still holds true in any environment), and I have external references all
over hell's half acre. Now I don't want any damn linker trying to second
guess what I mean. As far as I know, the L80 linker ( father of the MS-DOS
mess????? ) had a /S option to search:

So if I said:

L80 FILE1,FILE2,FILE3/S .....

FILE1.REL and FILE2.REL would be linked in their entirity, needed or not,
but FILE3 would be searched, and only used to resolve current undefined
labels. The linker I use now (ZLINK) does it, but automatically, based on
the filename extension: .O for mandatory linkage, and .L for libraries.
Also the internal format of a .L file is a little different, but that's
another story.
-- 
	dg@lakart.UUCP - David Goodenough		+---+
						IHS	| +-+-+
	....... !harvard!xait!lakart!dg			+-+-+ |
AKA:	dg%lakart.uucp@xait.xerox.com		  	  +---+