From 4920c6a87d60b8796f66fd74f2f99f76fee8ce76 Mon Sep 17 00:00:00 2001 From: Julian Frimmel Date: Tue, 15 Oct 2024 23:07:00 +0200 Subject: [PATCH] Use `lld` instead of `avr-gcc` as the linker This fixes the [build error] caused by the `avr-gcc` (used as linker) not being available in the Rust CI. This is a viable solution, which shows the wrong/right behavior and, since no functions from `libgcc` are called, does not produce errors. This was discussed [here]. Another small problem is, that `lld` doesn't link the correct startup-code by default. This is not a problem for this test (since it does not actually use anything the startup code is needed for (no variables, no stack, no interrupts)), but this causes the `main`-function to be removed by the default flag `--gc-sections`. Therefore the `rmake`-driver also adds the linker flag `--entry=main` to mark the `main`-function as the entry point and thus preventing it from getting removed. The code would work on a real AVR device. [build error]: https://github.com/rust-lang/rust/pull/131755#issuecomment-2415127952 [here]: https://github.com/rust-lang/rust/pull/131755#issuecomment-2416469675 --- tests/run-make/avr-rjmp-offset/rmake.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/run-make/avr-rjmp-offset/rmake.rs b/tests/run-make/avr-rjmp-offset/rmake.rs index 28018f59c5bb..f379d868a907 100644 --- a/tests/run-make/avr-rjmp-offset/rmake.rs +++ b/tests/run-make/avr-rjmp-offset/rmake.rs @@ -17,6 +17,13 @@ fn main() { .opt_level("s") .panic("abort") .target("avr-unknown-gnu-atmega328") + // normally one links with `avr-gcc`, but this is not available in CI, + // hence this test diverges from the default behavior to enable linking + // at all, which is necessary for the test (to resolve the labels). To + // not depend on a special linker script, the main-function is marked as + // the entry function, causing the linker to not remove it. + .linker("lld") + .link_arg("--entry=main") .output("compiled") .run(); @@ -35,6 +42,7 @@ fn main() { // fore the relative jump has an impact on the label offset. Old versions // of the Rust compiler did produce a label `rjmp .-4` (misses the first // instruction in the loop). + assert!(disassembly.contains("
"), "no main function in output"); disassembly .trim() .lines()