Walter Bright wrote:
Tom S wrote:
Walter Bright wrote:
The problem appears to be that optlink cannot deal correctly with weak references. I've modified the compiler to not emit weak references, and the problem goes away. It's not a perfect fix, but it works.

With the modified compiler, does the following link?

Yes.

If so, is the output correct?
[...]
I'm getting:
&aC.x == 419c30
&bC.x == 419c30

Yes, that is correct (there should be only one instance in the executable).

I'm afraid that it might refuse to link and then even if OPTLINK allowed multiple strong symbols of the same name, I'd expect the assertion to fail. Aren't weak symbols essential to properly handling templates?

No. Weak references are: "if this symbol does not get resolved, then default initialize it to this other symbol". In other words, weak references do not cause things to be pulled in from the library.

Multiple symbols with the same name and same contents, across different object files, are called COMDATs and the linker picks one and discards the duplicates.

Where the compiler was emitting weak references was in the list of which modules are imported by the object file, so that if nobody actually referred to the import's contents beyond the import statement, the import would not get linked in.


Of course compiling the modules together causes only one symbol to be emitted for the template instantiations. Yet this is not an option for a larger project, since compilation times and memory usage can get rather high.


I know. This is why COMDATs were invented (for C++ templates). C++ drove a number of improvements in obj files.

I'm glad to be proven wrong :) Thanks for the info! I'm sure it will come in handy for the dynamic linking I'm doing with DDL. I got the silly idea that you'd disable COMDATs... Another case of "Too much blood in my caffeine".


--
Tomasz Stachowiak
http://h3.team0xf.com/
h3/h3r3tic on #D freenode

Reply via email to