nvzqz / divan

Fast and simple benchmarking for Rust projects
https://nikolaivazquez.com/blog/divan/
Apache License 2.0
849 stars 24 forks source link

LLD does not seem amused by your linker tricks #11

Closed HadrienG2 closed 8 months ago

HadrienG2 commented 8 months ago

Attempting to compile any divan benchmark with rustc configured to use LLD as a linker results in this sort of errors wall:

error: linking with `cc` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/hadrien/.cargo/bin:/home/hadrien/bin:/usr/local/bin:/usr/bin:/bin" VSLANG="1033" "cc" "-m64" "/tmp/rustcEomvAT/symbols.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.00.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.01.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.02.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.03.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.04.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.05.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.06.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.07.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.08.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.09.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.10.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.11.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.12.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.13.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.14.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.string.4d8b2c88bc979b43-cgu.15.rcgu.o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894.1eid11ug1qgzifv7.rcgu.o" "-Wl,--as-needed" "-L" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps" "-L" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libfastrand-f6661ca0d6f249f5.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libcondtype-a66710f66668f394.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libcore_affinity-0f15c446ef84b12c.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libnum_cpus-8d64a2a3fd5f3ded.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/liblibc-9bb75f9a49b4aeff.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libregex_lite-cfbb67c0f114717e.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libclap-043aae451a83b000.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libclap_builder-1859ccd5719abfb6.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libterminal_size-c8ccc9ba9089180c.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/librustix-a69c472ce277be69.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libbitflags-68fc6e412662e218.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/liblinux_raw_sys-262a6c514fb0f9de.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libclap_lex-a0ccca36c9bddcbd.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/libanstyle-7f855882e18093b3.rlib" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/liblinkme-21c2371f4d24e80c.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-6498d8891e016dca.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-3debdee1a9058d84.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-8339c5bd5cbc92bf.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-160ebcebb54c11ba.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-95c75789f1b65e37.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-7e8094f2d6258832.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-bac9783ef1b45db0.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-a1cd87df2f2d8e76.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-7fd06d468d7dba16.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-5ac19487656e05bf.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-c7c35d32cf825c11.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-c523f1571362e70b.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-85f17c92b770a911.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-598d3ba148dadcea.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-a58ec2dab545caa4.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-f9dda8cca149f0fc.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-7ba4c315dd7a3503.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-5ac2993e19124966.rlib" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-df2fb7f50dec519a.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/home/hadrien/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/hadrien/Bureau/RustModernization/divan/target/release/deps/string-2da0f7c46c7d5894" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-Wl,-O1" "-nodefaultlibs" "-fuse-ld=lld"
  = note: ld.lld: error: undefined symbol: __start_linkme_GROUP_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::GROUP_ENTRIES::he3bc601364989c0c) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> the encapsulation symbol needs to be retained under --gc-sections properly; consider -z nostart-stop-gc (see https://lld.llvm.org/ELF/start-stop-gc)

          ld.lld: error: undefined symbol: __stop_linkme_GROUP_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::GROUP_ENTRIES::he3bc601364989c0c) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib

          ld.lld: error: undefined symbol: __start_linkm2_GROUP_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::GROUP_ENTRIES::he3bc601364989c0c) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> the encapsulation symbol needs to be retained under --gc-sections properly; consider -z nostart-stop-gc (see https://lld.llvm.org/ELF/start-stop-gc)

          ld.lld: error: undefined symbol: __stop_linkm2_GROUP_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::GROUP_ENTRIES::he3bc601364989c0c) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib

          ld.lld: error: undefined symbol: __start_linkme_BENCH_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::BENCH_ENTRIES::h58af2438b168de8a) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> the encapsulation symbol needs to be retained under --gc-sections properly; consider -z nostart-stop-gc (see https://lld.llvm.org/ELF/start-stop-gc)

          ld.lld: error: undefined symbol: __stop_linkme_BENCH_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::BENCH_ENTRIES::h58af2438b168de8a) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib

          ld.lld: error: undefined symbol: __start_linkm2_BENCH_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::BENCH_ENTRIES::h58af2438b168de8a) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> the encapsulation symbol needs to be retained under --gc-sections properly; consider -z nostart-stop-gc (see https://lld.llvm.org/ELF/start-stop-gc)

          ld.lld: error: undefined symbol: __stop_linkm2_BENCH_ENTRIES
          >>> referenced by divan.4931c5b03bfdaec2-cgu.11
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.11.rcgu.o:(divan::entry::BENCH_ENTRIES::h58af2438b168de8a) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          >>> referenced by divan.4931c5b03bfdaec2-cgu.12
          >>>               divan-988a33f007dc5e94.divan.4931c5b03bfdaec2-cgu.12.rcgu.o:(divan::divan::Divan::run_action::h868ac4b65a34c7a0) in archive /home/hadrien/Bureau/RustModernization/divan/target/release/deps/libdivan-988a33f007dc5e94.rlib
          collect2: error: ld returned 1 exit status

error: could not compile `examples` (bench "string") due to previous error

Given that many people who care about build performance use LLD as their linker, and IIRC it's destined to become rustc's default linker on Linux once remaining bugs are sorted out, you'll probably want to figure out what is going on here and make your linker tricks work with LLD if at all possible :)

nvzqz commented 8 months ago

@HadrienG2 can you please check if #12 fixes your issue?

thomcc commented 8 months ago

Feels like it might be an lld bug, TBH.

HadrienG2 commented 8 months ago

The examples do build and run with this branch ;)

@thomcc Have you checked out the LLD docs link in the error message ( https://lld.llvm.org/ELF/start-stop-gc ) ? They claim that the issue is that GNU LD retains binary sections when it shouldn't, and that the LLD behavior is the right one. I am not proficient enough with linker things to tell who's right.

nvzqz commented 8 months ago

@HadrienG2 this is now fixed in v0.1.1 😄