Lib change leads to larger executables

Sean Kelly sean at f4.ca
Wed Mar 7 20:15:15 PST 2007


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.


Sean



More information about the Digitalmars-d mailing list