Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ld.gold: relocation R_386_GOTOFF against preemptible symbol cannot be used when making a shared object #19427

Open
dlangBugzillaToGithub opened this issue Apr 25, 2018 · 3 comments

Comments

@dlangBugzillaToGithub
Copy link

Marco Leise (@mleise) reported this on 2018-04-25T12:45:53Z

Transferred from https://issues.dlang.org/show_bug.cgi?id=18798

CC List

Description

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.

!!!There are attachements in the bugzilla issue that have not been copied over!!!

@dlangBugzillaToGithub
Copy link
Author

Marco.Leise commented on 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 ?

@dlangBugzillaToGithub
Copy link
Author

Marco.Leise commented on 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.

@dlangBugzillaToGithub
Copy link
Author

bugzilla (@WalterBright) commented on 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) ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant