Lib change leads to larger executables

Don Clugston dac at nospam.com.au
Thu Mar 8 08:15:45 PST 2007


Pragma wrote:
> Sean Kelly wrote:
>> kris wrote:
>>> Walter Bright wrote:
>>>> kris wrote:
>>>>
>>>>> Walter Bright wrote:
>>>>>
>>>>>> Sure, but in this particular case, it seems that "core" is being 
>>>>>> imported without referencing code in it. The only reason the 
>>>>>> compiler doesn't generate the char[][] TypeInfo is because an 
>>>>>> import defines it. The compiler does work on the assumption that 
>>>>>> if a module is imported, then it will also be linked in.
>>>>>
>>>>> This core module, and the entire locale package it resides in, is 
>>>>> /not/ imported by anything. I spelled that out clearly before. 
>>>>> You're making an assumption it is, somehow ... well, it is not. You 
>>>>> can deduce that from the fact that the link succeeds perfectly well 
>>>>> without that package existing in the library.
>>>
>>> After taking a much needed break from this, I'm having another bash 
>>> at it. The locale package highlighted in the last bout has been 
>>> through a number of changes, and thus the behaviour will now be 
>>> somewhat different than before.
>>>
>>> For a refresher on this issue, here's an overview: 
>>> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=49257 
>>>
>>>
>>> The upshot is that reordering the content as presented to the 
>>> librarian now has an effect on the resultant binary size. This tells 
>>> me two things:
>>>
>>> 1) there were more than just the one compiler-generated unresolved 
>>> symbol in the first case, though I did not spot it after many 
>>> painstaking hours of frustrating effort. In fact, there may well have 
>>> been a number of vaguely intertwined dependencies spread throughout 
>>> the library, due entirely to these compiler-generated symbols.
>>>
>>> 2) there is no feasible manner in which a developer can control how 
>>> lib contents are linked while the compiler continues to generate 
>>> duplicate symbols under the covers. The fact that it does this on a 
>>> regular basis simply serves to highlight a critical problem.
>>>
>>>
>>>  > Then the typeinfo for char[][] is being generated by another 
>>> module. I
>>>  > suggest it would be helpful to find that module. Grep is a handy tool
>>>  > for finding it.
>>>
>>> What would be the point? These symbols are compiler generated, and 
>>> exist in a variety of places because of that fact alone. Lest we 
>>> forget, we're not even talking about just one symbolic name ~ the 
>>> compiler generates duplicate symbols for any typeinfo that does not 
>>> match the pre-packaged list (such as char[][]). The end result is a 
>>> potential rats-nest of duplicate symbols, creating a maze of 
>>> intricate and fragile dependencies across the lib itself.
>>>
>>> To put things into perspective, I have absolutely no way of knowing 
>>> what the real dependencies within this library actually are. As such, 
>>> I'd have to describe the situation as being "out of control". This is 
>>> wholly due to the duplicate compiler-generated symbols.
>>
>> It's a long-term proposition, but what about delaying the generation 
>> of TypeInfo until link-time?  The MS linker already optionally 
>> performs code generation to allow for more optimized executables, so I 
>> assume such a thing is definitely possible.  It would obviously 
>> require a new linker, but I don't see any other way to address these 
>> "silent dependency" issues, etc.  If I had the time I'd try it out, 
>> but as things stand there's no way that could happen before September.
> 
> I was going to say: new linker == our problem.  I'm in the same boat on 
> the no time thing, but maybe we can get a group effort going later on.  
> If for no other reason, we could investigate what a native 64-bit 
> toolchain for D on Windows might look like.

I've been wondering how far your work with DDL goes towards writing a 
linker? Certainly the work you've done with making sense of the OMF and 
ELF specs, and parsing the obj files, seems to be a huge chunk of the 
task. A lot of code would be common to both tasks, surely?



More information about the Digitalmars-d mailing list