Bug 23209 – Linker error for valid code.

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P3
Component
druntime
Product
D
Version
D2
Platform
x86_64
OS
All
Creation time
2022-06-23T14:05:51Z
Last change time
2024-02-20T13:23:59Z
Assigned to
No Owner
Creator
Andrea Fontana

Comments

Comment #0 by trikkuz — 2022-06-23T14:05:51Z
Dmd compiles this code, but linker fails. --- #!/usr/bin/rdmd import std; void main() { auto httpClient = HTTP(); httpClient.setAuthentication("", ""); string src = `{}`; auto json = parseJSON(src); writeln(json); } --- It returns a (strange) linking error: /usr/bin/ld: /tmp/.rdmd-1000/rdmd-test2.d-C954334114259D06EF20F7503F19D193/objs/test2.o: in function `_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv': /usr/include/dmd/phobos/std/package.d:(.text._D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv[_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv]+0x19): undefined reference to `_D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv' collect2: error: ld returned 1 exit status Error: linker exited with status 1 If you replace writeln(json) with writeln(json.toString) it works. If you comment writeln, it works. If you comment httpClient.setAuthentication, it works.
Comment #1 by maxhaton — 2022-06-23T19:28:25Z
What happens with dmd -run rather than dmd?
Comment #2 by kdevel — 2022-06-24T13:52:04Z
$ dmd k.d k.o: In function `_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv': k.d:(.text._D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv[_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv]+0x19): undefined reference to `_D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv' collect2: error: ld returned 1 exit status Error: linker exited with status 1 $ dmd -allinst -run k.d {} [for the record: binutils < 2.26 raises unrecognized relocation (0x2a) in section `.text', https://stackoverflow.com/questions/52737698]
Comment #3 by luis — 2022-09-21T08:47:31Z
I also ran into this issue. The scenario is a bit different, I'm using LDC2 on macOS and I'm linking D code with C code. The linker driver is clang++. The same D code compiled with dub/ldc2 didn't seem to cause issues, but various D libraries are involved so it's hard to tell for sure without reducing it, which I haven't done yet. I also have two linker errors, instead of one. For now, I'm working around it with: C code: void _D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv(void) { assert(0); } void _D3std4math10operations__T17extractBitpatternTfZQwFNaNbNiNexfZSQCjQCiQCg__T23FloatingPointBitpatternTfZQBc(void) { assert(0); } I.e. trapping implementations for the missing: pure nothrow @nogc @trusted void core.exception.__switch_errorT!().__switch_errorT(immutable(char)[], long); pure nothrow @nogc @trusted std.math.operations.FloatingPointBitpattern!(float).FloatingPointBitpattern std.math.operations.extractBitpattern!(float).extractBitpattern(const(float))
Comment #4 by Bastiaan — 2024-01-08T10:22:29Z
Further reduced: ```d void main() { import std.net.curl, std.stdio; auto http = HTTP(); http.setAuthentication("", ""); writeln(1.0); } ``` The missing symbol is `pure nothrow @nogc @trusted void core.exception.__switch_errorT!().__switch_errorT(immutable(char)[], ulong)`.
Comment #5 by Bastiaan — 2024-01-08T10:50:24Z
Workaround: use the `-allinst` option.
Comment #6 by ibuclaw — 2024-02-20T13:23:59Z
Marking this as a duplicate. *** This issue has been marked as a duplicate of issue 20802 ***