Skip to content

[regression] parallel LTO breaks linking because it internalizes weak symbols #46543

Closed
@japaric

Description

@japaric

STR

With LTO

$ git clone https://github.com/japaric/embedded-demo

$ cd embedded-demo

$ xargo rustc --release -v -- -C lto -Z print-link-args
error: linking with `arm-none-eabi-ld` failed: exit code: 1
  |
  = note: "arm-none-eabi-ld" (..)
  = note: /home/japaric/tmp/cortex-m-quickstart/target/thumbv7m-none-eabi/release/deps/demo-cbfeda05d006136a.stm32f103xx0-3aeab9466184a3fc8b7128118183614f.rs.rcgu.o: In function `WWDG':
          stm32f103xx0-3aeab9466184a3fc8b7128118183614f.rs:(.text+0x0): undefined reference to `DEFAULT_HANDLER'

Linker arguments:

"arm-none-eabi-ld"
"-L"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.aligned0-82013031e0adce00680863804baa6d8a.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.bare_metal0-808e09050a3d8f805631ff0277b6d5f4.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.core0-5fd795c6d6efb3b3ac7a93ecfc07e7e8.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.cortex_m0-eef2b118572823d6b94a55e824ed5889.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.cortex_m_rt0-a8ed1a542842e08c4e593519be42c026.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.demo0-bda6ff7720758957fa6c47e3e0108053.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.r00-d69ab77365edbeda5c83b8029590a7b6.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.stm32f103xx0-b5844958e960b076c42287432ab6341a.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.vcell0-17ed04a11350e05da18a7742432984b.rs.rcgu.o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87.volatile_register0-fb687636cdd4964c5e2d4a17ac1819ef.rs.rcgu.o"
"-o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-cc40ab28f2256f87"
"--gc-sections"
"-L"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps"
"-L"
"/home/japaric/tmp/embedded-demo/target/release/deps"
"-L"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/build/cortex-m-rt-8aa404db3cc9f96b/out"
"-L"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib"
"-Bstatic"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib/libcompiler_builtins-e9756467978f74f8.rlib"
"-Tlink.x"
"-Bdynamic"

Without LTO

$ xargo rustc --release -- -Z print-link-args && echo OK
OK

Linker arguments:

"arm-none-eabi-ld"
"-L"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-7be3323439223b43.demo0.rcgu.o"
"-o"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/demo-7be3323439223b43"
"--gc-sections"
"-L"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps"
"-L"
"/home/japaric/tmp/embedded-demo/target/release/deps"
"-L"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/build/cortex-m-rt-8aa404db3cc9f96b/out"
"-L"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib"
"-Bstatic"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libstm32f103xx-0620e682f6df62cd.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libcortex_m_rt-637507d2b1db7555.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libr0-a7dcce0e9369941f.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libcortex_m-690455d6e615b2d4.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libvolatile_register-45547ab3b9a80964.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libvcell-89a145f57bb869ee.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libbare_metal-ddaad95c84c49e08.rlib"
"/home/japaric/tmp/embedded-demo/target/thumbv7m-none-eabi/release/deps/libaligned-61d763743c0a5839.rlib"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib/libcore-2fea0bb2226aafe6.rlib"
"/home/japaric/.xargo/lib/rustlib/thumbv7m-none-eabi/lib/libcompiler_builtins-e9756467978f74f8.rlib"
"-Tlink.x"
"-Bdynamic"

Note the order in which objects (crates) are passed to the linker between an LTO and a non-LTO build. The LTO build more or less reverses the order.

stm32f103xx has an undefined symbol, DEFAULT_HANDLER, which is provided by its dependency cortex-m-rt. The LTO build fails to link because cortex-m-rt appears before stm32f103xx in the list of linker arguments.


With the old, non-parallel LTO there was only a single object so there was no linking problem.

cc @alexcrichton Is there an option to get the old, non-parallel LTO on a recent nightly? I tried codegen-units = 1 and I still got parallel LTO.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions