[OpenMP] Add -Bsymbolic to arguments for GNU linker
authorJoseph Huber <jhuber6@vols.utk.edu>
Fri, 4 Feb 2022 17:51:10 +0000 (12:51 -0500)
committerJoseph Huber <jhuber6@vols.utk.edu>
Fri, 4 Feb 2022 20:13:32 +0000 (15:13 -0500)
This patch adds the '-Bsymbolic' flag when we perform linking for the
offloading device. We already pass '-fvisibility=protected' but this is
not properly handled when using the bfd linker as is described in
https://maskray.me/blog/2021-05-16-elf-interposition-and-bsymbolic.
Previously this caused linker errors when creating the shared library.

Reviewed By: JonChesterfield

Differential Revision: https://reviews.llvm.org/D119018

clang/lib/Driver/ToolChains/Gnu.cpp

index 12eaf1f..d0808d0 100644 (file)
@@ -572,6 +572,14 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     }
     CmdArgs.push_back("-lm");
   }
+
+  // If we are linking for the device all symbols should be bound locally. The
+  // symbols are already protected which makes this redundant. This is only
+  // necessary to work around a problem in bfd.
+  // TODO: Remove this once 'lld' becomes the only linker for offloading.
+  if (JA.isDeviceOffloading(Action::OFK_OpenMP))
+    CmdArgs.push_back("-Bsymbolic");
+
   // Silence warnings when linking C code with a C++ '-stdlib' argument.
   Args.ClaimAllArgs(options::OPT_stdlib_EQ);