https://sourceware.org/bugzilla/show_bug.cgi?id=32846
Bug ID: 32846 Summary: LTO link failures in various packages since 2707d55e539ef323dd14a1293e762bf3d9739ee7 Product: binutils Version: 2.45 (HEAD) Status: NEW Severity: normal Priority: P2 Component: ld Assignee: unassigned at sourceware dot org Reporter: sam at gentoo dot org CC: hjl.tools at gmail dot com, matz at suse dot de Target Milestone: --- Hi! Since ... commit 2707d55e539ef323dd14a1293e762bf3d9739ee7 Author: Michael Matz <m...@suse.de> Date: Mon Mar 31 15:57:08 2025 +0200 [lto] Fix symlookup in archives vs shared when a shared library defines 'foo@@FOO' (default version), a static archive defines 'foo', the shared lib comes in front of the archive and under effect of --as-needed, and the requesting object file uses LTO, then the link editor was wrongly including the definition from the static archive. It must use the one from the shared lib, like in the non-LTO or the --no-as-needed case. See the added testcase that would wrongly print "FAIL" before this patch. The problem stems from several connected problems: (1) only the decorated symbol was entered into first_hash (the hash table designed to handle definition order in the pre-LTO-plugin phase of the symbol table walks) (2) in the archive symbol walk only the undecorated name would be looked up in first_hash (and hence not found due to (1)) (3) in the archive symbol walk first_hash would only be consulted when the linker hash table had a defined symbol. In pre-LTO phase shared lib symbols aren't entered into the linker symbol table. So: add also the undecorated name into first_hash when it stems from a default version and consult first_hash in the archive walker also for currently undefined symbols. If it has an entry which doesn't point to the archive, then it comes from an earlier library (shared or static), and so _this_ archive won't provide the definition. ... I see a bunch of link failures when using LTO in various packages. Attached a reduction based on kmod. -- You are receiving this mail because: You are on the CC list for the bug.