On Friday, 13 April 2018 at 10:47:18 UTC, Rene Zwanenburg wrote:
On Friday, 13 April 2018 at 05:31:25 UTC, Jesse Phillips wrote:
Well if DIP1000 isn't on by default I don't think Phobos should be compiled with it.

I think that the version issue is not unique to D and would be good to address, but I don't see the compiler reading the object file to determine how it should built the import files.

More importantly, it can be perfectly valid to link object files compiled with different options. Things like parts of the program that shouldn't be optimized, or have their logging calls added/removed.

One thought I has was that we could define a special symbol that basically encodes the configuration that was used to compile a module. So when you import a precompiled module, you can insert a dependency on that special symbol based on the configuration you interpreted the imported module with with. So if a module is compiled and imported with a different configuration, you'll get a linker error.

If we take the previous example with main and foo.

compile foo with -version=FatFoo

foo.o contains special symbol (maybe "__module_config_foo_version_FatFoo")

compile main without -version=FatFoo

main.o contains dependency on symbol "__module_config_foo" (note: no "version_FatFoo")

link foo.o main.o

Error: symbol "__module_config_foo" needed by main.o is not defined

The linker error isn't great, but it prevents potential runtime errors. Also, if you use the compiler instead of the linker you'll get a nice error message.

dmd foo.o main.o

Error: main.o expected module foo to be compiled without -version=FatFoo but foo.o was compiled with it




Reply via email to