When linking a 32-bit shared library with dmd and ld.gold on Linux the linker bails out with: /usr/x86_64-pc-linux-gnu/bin/ld: error: libgtkd-3.o: relocation R_386_GOTOFF against preemptible symbol _D3gtk9UIManagerQk9getWidgetMFAyaZCQBh6WidgetQh cannot be used when making a shared object /usr/x86_64-pc-linux-gnu/bin/ld: error: libgtkd-3.o: relocation R_386_GOTOFF against preemptible symbol _D3std3uni__T21genericDecodeGraphemeVbi0Z__TQBfTAxaZQBnFNaNfKQnZv cannot be used when making a shared object /usr/x86_64-pc-linux-gnu/bin/ld: error: libgtkd-3.o: relocation R_386_GOTOFF against preemptible symbol _D3std3uni__T21genericDecodeGraphemeVbi0Z__TQBfTAxaZQBnFNaNfKQnZv cannot be used when making a shared object Using ldc2 or gdc as compilers it seems to work, so I assume it is a dmd backend issue. Just the other day a bug in ld.gold got fixed that prevented --ifc=safe to work (e.g. when self-hosting ldc2), --gc-sections got fixed in dmd earlier and this is now the only remaining linker compatibility issue I see on Linux.
Created attachment 1689 [details] small reproduction case for the linker error I attached a test case that can be compiled with dmd 2.079.1 like this: dmd -m32 -shared -fPIC -defaultlib=phobos2 reprocase.d ld.gold has to be your default linker, otherwise you need to split compilation and linking: dmd -m32 -fPIC -c reprocase.d ld.gold -shared reprocase.o What I found interesting about the test case is that it happens when you create a sufficiently complex switch-case. Remove one case and the error is gone. Could it be a bug in jump table generation on x86/PIC ?
My guess was hitting close: https://github.com/dlang/dmd/blob/1a05f4413ac6daaa8ae000dbe7399a302e3fc16b/src/dmd/backend/cod3.c#L1360 Above three cases a different code path is chosen in the back-end.
Can you show a piece of DMD code that, when compiled, uses a different location than GDC does (or even gcc) ?
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19427 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB