Stripping Data Symbols (Win64)

Rainer Schuetze via Digitalmars-d digitalmars-d at puremagic.com
Wed Dec 30 01:43:32 PST 2015



On 28.12.2015 13:05, Benjamin Thaut wrote:
> My current work on the D compiler lead me to the following test case
> which I put through a unmodified version of dmd 2.069.2
>
> import core.stdc.stdio;
>
> struct UnusedStruct
> {
>      int i = 3;
>      float f = 4.0f;
> };
>
> class UnusedClass
> {
>      int i = 2;
>      float f = 5.0f;
> };
>
> void main(string[] args)
> {
>    printf("Hello World!");
> }
>
> When compiling this on windows with dmd -m64 main.d -L/MAP
> and then inspecting the map file I noticed that the following 4 data
> symbols end up in the final executable although they shouldn't be used.
>
>   0003:00000a90       _D4main12UnusedStruct6__initZ 0000000140046a90
> main.obj
>   0003:00000ad0       _D4main11UnusedClass6__initZ 0000000140046ad0
> main.obj
>   0003:00000af0       _D4main11UnusedClass7__ClassZ 0000000140046af0
> main.obj
>   0003:00000ba0       _D4main11UnusedClass6__vtblZ 0000000140046ba0
> main.obj
>
> For the struct this is the initializer, for the class its the
> initializer, class info and vtbl.
>
> Is this behavior correct? Shouldn't UnusedStruct and UnusedClass be
> stripped completely from the binary? Is this somehow connected to the
> module info / object.factory?
>

I noticed something similar recently when compiling a C file with /Gy, 
see 
https://github.com/D-Programming-Language/druntime/pull/1446#issuecomment-160880021

The compiler puts all functions into COMDATs, but they are all still 
linked in if only a single symbol is referenced, even if linked with 
/OPT:REF.

So I suspect this is not an issue with dmd, but the Microsoft linker. I 
still wonder whether the approach to use "function level linking" works 
at all for Win64.

 > I noticed by looking at some object file dumps that dmd puts each
 > function into its own section, but data symbols, like initializers, are
 > all merged into the same section. Could this be the root issue?

Having all data in a single section misses some possible optimizations, 
and it might be the reason for the behavior in your case (you can check 
this with "dumpbin /all objectfile"), but the issue above does not 
contain any data.


More information about the Digitalmars-d mailing list