roc-lang / basic-webserver

A basic webserver in Roc
https://roc-lang.github.io/basic-webserver/
Universal Permissive License v1.0
72 stars 15 forks source link

`Undefined Symbol in relocation` when building example on linux x86_64 #9

Open Anton-4 opened 10 months ago

Anton-4 commented 10 months ago
❯ ./roc build ~/gitrepos/basic-webserver/examples/todos.roc 
🔨 Rebuilding platform...
An internal compiler expectation was broken.
This is definitely a compiler bug.
Please file an issue here: https://github.com/roc-lang/roc/issues/new/choose
thread 'main' panicked at 'Undefined Symbol in relocation, (+1b97, Relocation { kind: PltRelative, encoding: Generic, size: +20, target: Symbol(SymbolIndex(+13d)), addend: +fffffffffffffffc, implicit_addend: false }): Ok(Symbol { name: "memset", address: +0, size: +0, kind: Label, section: Undefined, scope: Unknown, weak: false, flags: Elf { st_info: +10, st_other: +0 } })', crates/linker/src/elf.rs:1486:25
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

This is not specific to this example, and appears to happen for all of them.

The cause of this issue is: https://github.com/roc-lang/roc/issues/3609

I think this only happens with export CARGO_BUILD_TARGET=x86_64-unknown-linux-musl. This is required for releases with good compatibility. I was also on the more-features branch, not on main.

Anton-4 commented 10 months ago

Temporary workaround:

roc build ~/gitrepos/basic-webserver/examples/todos.roc --linker=legacy
RMailaender commented 8 months ago

this bug seems to block the git build pipeline. Should we, as a temporary workaround change the ci/all_tests.sh script, so it uses --linker=legacy until the bug is fiexed?

bhansconnect commented 8 months ago

This is not caused by https://github.com/roc-lang/roc/issues/3609

It is probably caused by the compiler-rt related changes that got pulled into this PR: https://github.com/roc-lang/roc/pull/6216

Zig should be automatically bundling the compiler-rt and libc related functions that we use in the builtins. That should include memcpy and memset. My guess is that it is still getting removed by DCE for some reason.

Need to circle back to this when I have more time, but first steps would be to double check the zig generated llvm ir actually has these functions and if it does, double check our llvm DCE related passes and such.

EDIT: If I don't circle back to this in like a week and no one else fixes it, can someone ping me?

RMailaender commented 7 months ago

@bhansconnect Ping! :)

bhansconnect commented 7 months ago

This should fix for at least regular linux: https://github.com/roc-lang/roc/pull/6515

I'm not sure what is going on with musl yet.