Big problem with Small programs

Sean Kelly sean at f4.ca
Thu Jan 25 09:27:11 PST 2007


Sean Kelly wrote:
> Walter Bright wrote:
>> Sean Kelly wrote:
>>> The first block goes from line 410 to line 6719 in the map file, and 
>>> the second block goes from line 8047 to line 14559 in the map file.  
>>> All told, that's 12821 separate constants or initializers in the 
>>> manually linked version that seem absent from the library-based version.
>>
>> That means that, in the library based version, nothing in the 
>> explicitly linked .obj files referenced them.
> 
> If that's true then nothing in either version referenced them.  The 
> application is identical in both cases but for some of the objects 
> living in a library in the small case.

Just some further discussion.  After exhaustive experimentation 
yesterday with Tango the following seems to be true:

Using the Bud/Build approach of compiling all modules to object files 
and then linking them always works, however on Win32 it may result in a 
surplus of data in the executable.  This may actually be legitimate 
behavior based on how the linker works and how the OMF blocks are 
segmented in the object files at link time, but it seems odd.

Using the library approach of compiling all library code into a static 
library and then linking it does not always work, but it results in much 
leaner executables on Win32.  Little or no surplus data is added to the 
executable, including data that is added using the Bud/Build method, 
even for the exact same application.  This may again be legitimate 
behavior based on how the lib tool splits/joins/moves OMF blocks when 
assembling the library (assuming it does so), or it may have something 
to do with the linker having "all the information at its fingertips" 
when assembling the application.

Where the library approach fails is if the library contains template 
code.  Results are inconsistent, but yesterday we were seeing link 
errors in some cases and GPFs in others just for different library 
modules using the same template code, all of which work perfectly using 
the Bud/Build method.  For the link errors, as near as we could tell the 
object files contained all the relevant functions (many of the link 
errors referred to class TypeInfo instances) but for some reason they 
didn't appear to be available at link time.  It is possible that the lib 
tool is throwing them out for some reason, but I could not speculate on why.

This leaves us in an awkward situation for releasing Tango.  Suggesting 
everyone use Bud/Build seems the most reliable but some may not be happy 
with large executables or with having to use Bud/Build at all. 
Assembling everything into a single static library seems unreliable at 
best, but it will undoubtedly be preferred by many people.  At the 
moment, I suspect we will adopt a hybrid approach out of necessity, 
placing some of the larger packages (like the Win32 package) in static 
libraries and linking them either explicitly or implicitly via 
pragma(lib) (which is problematic in itself since it doesn't work if 
placed in include files, at least with DMD--Bud may be different, I have 
yet to test this and plan to do so today).

I am hoping that we can produce a small test case for the template 
issues so we can move to a full library approach once the problems have 
been addressed.  Alternately, perhaps we can find a way to address 
linking so that less unnecessary data is included while linking objects 
directly.  I'll admit that at this point I'm of half a mind to simply 
write an OMF linker that takes as long as necessary to produce a working 
application and be done with it.

Out of curiosity, I suppose it would be a substantial amount of work for 
DMD (and I suppose DMC) to produce COFF object files instead of OMF? 
And I don't suppose that some work in this area may be necessary for 
generating 64-bit executables?  If there's a chance we could move to a 
newer object file format for Win32, we would at least gain access to a 
broader array of tools, even if COFF itself is a bit problematic.


Sean



More information about the Digitalmars-d mailing list