gollvm: add GOLLVM_DEFAULT_LINKER cmake option Currently gold is the default linker if -fuse-ld option isn't specified. But gold on linux arm64 has a problem, which makes gollvm can not be used for static compilation. This CL works around this issue by adding the option --eh-frame-hdr to the linker when linking statically. This CL also added a cmake option GOLLVM_DEFAULT_LINKER, which can be used to configure the default linker. Change-Id: I79609efb015d94ab34e7b3f4b6fbd03bdf7ed757 Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/232957 Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/cmake/modules/AddGollvm.cmake b/cmake/modules/AddGollvm.cmake index 6b4bb96..f5dd868 100644 --- a/cmake/modules/AddGollvm.cmake +++ b/cmake/modules/AddGollvm.cmake
@@ -20,6 +20,7 @@ set(GOLLVM_LIBVERSION "${libversion}") set(GOLLVM_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}") set(GOLLVM_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/${libsubdir}") +set(GOLLVM_DEFAULT_LINKER "${LLVM_USE_LINKER}") # Check to see whether the build compiler supports -fcf-protection=branch set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
diff --git a/driver/GnuTools.cpp b/driver/GnuTools.cpp index 8719a4a..2fb63a1 100644 --- a/driver/GnuTools.cpp +++ b/driver/GnuTools.cpp
@@ -229,8 +229,14 @@ { llvm::opt::ArgList &args = toolchain().driver().args(); + // Currently ld.gold will not automatically add this option when linking + // staticly on arm64, resulting in the binary crash. The issue + // (https://sourceware.org/bugzilla/show_bug.cgi?id=25903) has not been + // fixed yet, for older versions of gold, add this option no matter static + // or dynamic link mode. + cmdArgs.push_back("--eh-frame-hdr"); + if (!args.hasArg(gollvm::options::OPT_static)) { - cmdArgs.push_back("--eh-frame-hdr"); if (!args.hasArg(gollvm::options::OPT_shared)) { // NB: no support for --dyld-prefix= option const std::string Loader = toolchain().getDynamicLinker(args); @@ -333,7 +339,11 @@ // will always look for "ld.ABC" on the path. With clang, however, // you can supply a full path (e.g. "-fuse-ld=/my/path/to/ld"). This // code is intended to be consistent with clang. +#ifdef GOLLVM_DEFAULT_LINKER + const char *variant = GOLLVM_DEFAULT_LINKER; +#else const char *variant = "gold"; +#endif const char *linker = nullptr; llvm::opt::Arg *ldarg = args.getLastArg(gollvm::options::OPT_fuse_ld_EQ); const char *executable = nullptr;
diff --git a/driver/GollvmConfig.h.cmake b/driver/GollvmConfig.h.cmake index debf707..b22caca 100644 --- a/driver/GollvmConfig.h.cmake +++ b/driver/GollvmConfig.h.cmake
@@ -21,4 +21,7 @@ // Compiler version. Same as library version currently. #define GOLLVM_COMPILERVERSION GOLLVM_LIBVERSION +// Gollvm default linker +#cmakedefine GOLLVM_DEFAULT_LINKER "@GOLLVM_DEFAULT_LINKER@" + #endif // GOLLVM_CONFIG_H