Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Revert "Update Generic Unix linker selection"" #1608

Merged
merged 1 commit into from
May 20, 2024

Conversation

etcwilde
Copy link
Member

Reverts #1596

Alright ready to re-land this. The issue was that, during the build, the just-built Swift driver would choose the clang from the system instead of the just-built clang that was configured to use gold or lld. The system clang was configured to use the gnu bfd linker instead of gold or lld. BFD has a known issue with our use of protected symbols and would fail during the Dispatch build with the following error:

error: link command failed with exit code 1 (use -v to see invocation)
/usr/bin/ld: /home/build-user/build/buildbot_linux/libdispatch-linux-x86_64/src/swift/CMakeFiles/swiftDispatch.dir/Block.swift.o: relocation R_X86_64_PC32 against protected symbol `$s8Dispatch0A13WorkItemFlagsVSYAAMc' can not be used when making a shared object
/usr/bin/ld: final link failed: bad value

Telling the just-built driver to use the just-built clang is more consistent with other parts of the build. Technically, for cross-compiling purposes, neither should be in use here, but at least this is more internally consistent.

Not all generic-"unix" environments have the Gold linker available to them, and in some cases, the vendor of the toolchain may provide their own linker. In these cases, the driver should be internally consistent with the toolchain that it is shipped with.

Now that we have the clang-linker, we can lean on the linker selection in the clang-linker to determine a default linker. If the clang-linker, and thus, the swift compiler driver, are part of a specific toolchain, that clang-linker should be built for that platform with the appropriate linker defaults set. If someone overrides the linker with -use-ld, we should still honour that, but should otherwise be consistent with the appropriate toolchain linker.

This will enable building and linking on AmazonLinux 2023 without requiring folks to always pass additional flags. It also means we can produce a self-contained toolchain that is internally consistent using lld as the linker.

LLD removes the start/stop symbols as of https://reviews.llvm.org/D96914, which the Swift runtime used to register the runtime type metadata and other runtime metadata tables. I'm waiting to merge this until apple/swift#72061 merges as we won't know when to pass nostart-stop-gc with this change.

Fixes: rdar://123061492

@etcwilde
Copy link
Member Author

@swift-ci please test

@etcwilde etcwilde merged commit fcf5c3a into main May 20, 2024
3 checks passed
drodriguez added a commit to drodriguez/swift-driver that referenced this pull request May 30, 2024
The spelling of the linker is `-fuse-ld=`, not `--fuse-ld=`, as it can
be seen in [1] and as used in the C++ driver in [2].

The code was correct before apple#1545 using `-fuse-ld=`, but was changed to
`--fuse-ld=`. The test was testing for the command line containing the
same spelling, so it would had never failed, but running the actual
command line would had failed. That code was eventually reverted and
reverted back in apple#1608.

[1]: https://github.com/apple/llvm-project/blob/e33819dff1cbf7a90b0216a4993126cb11440d45/clang/include/clang/Driver/Options.td#L5267
[2]: https://github.com/apple/swift/blob/319f36b01baa082fd2d2640d6e320594752702d0/lib/Driver/UnixToolChains.cpp#L234
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants