Bug 18798 – ld.gold: relocation R_386_GOTOFF against preemptible symbol cannot be used when making a shared object

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2018-04-25T12:45:53Z
Last change time
2024-12-13T18:58:29Z
Keywords
dll, link-failure
Assigned to
No Owner
Creator
Marco Leise
Moved to GitHub: dmd#19427 →

Attachments

IDFilenameSummaryContent-TypeSize
1689reprocase.dsmall reproduction case for the linker errortext/x-dsrc102

Comments

Comment #0 by Marco.Leise — 2018-04-25T12:45:53Z
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.
Comment #1 by Marco.Leise — 2018-04-28T13:38:57Z
Created attachment 1689 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 ?
Comment #2 by Marco.Leise — 2018-04-28T13:43:14Z
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.
Comment #3 by bugzilla — 2020-05-16T05:49:25Z
Can you show a piece of DMD code that, when compiled, uses a different location than GDC does (or even gcc) ?
Comment #4 by robert.schadek — 2024-12-13T18:58:29Z
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