On Wed, 3 Jun 2026 12:01:48 +0200 David Marchand <[email protected]> wrote:
> Hello, > > On Wed, 3 Jun 2026 at 00:57, Stephen Hemminger > <[email protected]> wrote: > > > > When using function versioning and building with Link Time Optimization, > > the compiler does not see the __asm__ annotation of symbols and > > therefore thinks there are two versions of the same symbol. > > > > The fix is to use compiler symver attribute on the function which > > was added in GCC 10. Keep the older method for backward compatibility > > with older compilers. > > > > Bugzilla ID: 1949 > > Fixes: e30e194c4d06 ("eal: rework function versioning macros") > > We never used the symver stuff, so it seems unlikely the issue was > introduced with this rework. > > The fact that clang does not support this attribute is a concern. > > > > Cc: [email protected] > > Why do we need to backport? > > LTO is kind of experimental, so it seems good enough to reply "not > expected to work in older LTS" if someone reported an issue. > > And in practice, no LTS release call the versioning macros, since a > LTS drops all compatibility. > > > Signed-off-by: Stephen Hemminger <[email protected]> > > I would like to reproduce, but I can't build main with LTO. > What patches did you apply locally to avoid warnings on the hash library? I get no warnings from current main with GCC 15 I was doing test build of net-next with this patch: https://patchwork.dpdk.org/project/dpdk/patch/[email protected]/ The LTO build is done by: $ meson setup build-lto -Db_lto=true The result was: cc -o lib/librte_ethdev.so.26.2 lib/librte_ethdev.so.26.2.p/ethdev_ethdev_driver.c.o lib/librte_ethdev.so.26.2.p/ethdev_ethdev_private.c.o lib/librte_ethdev.so.26.2.p/ethdev_ethdev_profile.c.o lib/librte_ethdev.so.26.2.p/ethdev_ethdev_trace_points.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_class_eth.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_ethdev.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_ethdev_cman.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_ethdev_telemetry.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_flow.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_mtr.c.o lib/librte_ethdev.so.26.2.p/ethdev_rte_tm.c.o lib/librte_ethdev.so.26.2.p/ethdev_sff_telemetry.c.o lib/librte_ethdev.so.26.2.p/ethdev_sff_common.c.o lib/librte_ethdev.so.26.2.p/ethdev_sff_8079.c.o lib/librte_ethdev.so.26.2.p/ethdev_sff_8472.c.o lib/librte_ethdev.so.26.2.p/ethdev_sff_8636.c.o lib/librte_ethdev.so.26.2.p/ethdev_ethdev_linux_ethtool.c.o -flto=auto -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -shared -fPIC -Wl,-soname,librte_ethdev.so.26 -Wl,--no-as-needed -Wl,--undefined-version -pthread -Wl,--start-group -lm -ldl -lnuma -lfdt '-Wl,-rpath,$ORIGIN/' lib/librte_eal.so.26.2 lib/librte_kvargs.so.26.2 lib/librte_log.so.26.2 lib/librte_telemetry.so.26.2 lib/librte_argparse.so.26.2 lib/librte_net.so.26.2 lib/librte_mbuf.so.26.2 lib/librte_mempool.so.26.2 lib/librte_ring.so.26.2 lib/librte_meter.so.26.2 -Wl,--version-script=/home/shemminger/DPDK/lto/build-lto/lib/ethdev_exports.map /usr/lib/x86_64-linux-gnu/libbsd.so /usr/lib/x86_64-linux-gnu/libarchive.so -Wl,--end-group /tmp/cc3RQyqL.s: Assembler messages: /tmp Fed the result into Claude, and it said "yeah, I see the same problem on other projects, the answer is ...". With a little searching found an example in Gentoo https://github.com/InBetweenNames/gentooLTO/pull/458 With this change symbol versioning with LTO works on both GCC >= 10 and Clang. Clang LTO doesn't have the attribute, but it also doesn't have the same LTO issue.

