From 01b0bce2d572878ca15bf21f6279b770ab31c743 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Tue, 28 Jun 2016 16:38:46 +0200 Subject: [PATCH 1/3] Use gold linker by default if available --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c8adfa25..055adca18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,7 @@ option(COVERAGE OFF) option(SANITIZER OFF) option(ENABLE_LTO "Use LTO if available" ON) option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF) +option(ENABLE_GOLD_LINKER "Use ld.gold if available" ON) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include/) @@ -116,6 +117,12 @@ if(CMAKE_BUILD_TYPE MATCHES Debug) endif() endif() + +check_cxx_compiler_flag("-Wl,-fuse-ld=gold" GOLD_AVAILABLE) +if (ENABLE_GOLD_LINKER AND GOLD_AVAILABLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-fuse-ld=gold") +endif() + if(CMAKE_BUILD_TYPE MATCHES Release) message(STATUS "Configuring OSRM in release mode") # Check if LTO is available From 5ee15ee339805abd4f95d8b97b8f769b9a78a9cf Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Fri, 1 Jul 2016 16:05:26 +0200 Subject: [PATCH 2/3] Use webkit code snippet to detect GNU gold --- CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 055adca18..1c28c2577 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ option(COVERAGE OFF) option(SANITIZER OFF) option(ENABLE_LTO "Use LTO if available" ON) option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF) -option(ENABLE_GOLD_LINKER "Use ld.gold if available" ON) +option(ENABLE_GOLD_LINKER "Use GNU gold linker if available" ON) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include/) @@ -118,9 +118,16 @@ if(CMAKE_BUILD_TYPE MATCHES Debug) endif() endif() -check_cxx_compiler_flag("-Wl,-fuse-ld=gold" GOLD_AVAILABLE) -if (ENABLE_GOLD_LINKER AND GOLD_AVAILABLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-fuse-ld=gold") +if(ENABLE_GOLD_LINKER) + execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) + if("${LD_VERSION}" MATCHES "GNU gold") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") + message(STATUS "Using GNU gold as linker.") + else() + message(WARNING "GNU gold linker isn't available.") + set(ENABLE_GOLD_LINKER OFF) + endif() endif() if(CMAKE_BUILD_TYPE MATCHES Release) From 41b54cf25dc316ce83ad9c2a001964e2a3f3860d Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Tue, 23 Aug 2016 00:03:14 +0200 Subject: [PATCH 3/3] Don't use gold gc-sections for binutils < 2.25 Issue 2785: check gold binutils version and don't use gc-sections for versions prior 2.25 due to https://sourceware.org/bugzilla/show_bug.cgi?id=17639 readelf --debug-dump=frames build/libosrm_extract.so Contents of the .eh_frame section: ... readelf: Warning: Invalid length 0xfff01dd8 in FDE at 0x000020 --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c28c2577..43f704246 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,13 @@ if(ENABLE_GOLD_LINKER) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags") message(STATUS "Using GNU gold as linker.") + + # Issue 2785: check gold binutils version and don't use gc-sections for versions prior 2.25 + string(REGEX REPLACE ".*\\(GNU Binutils[^\\)0-9]+([0-9]+\\.[0-9]+)[^\\)]*\\).*" "\\1" GOLD_BINUTILS_VERSION "${LD_VERSION}") + if ("${GOLD_BINUTILS_VERSION}" VERSION_LESS "2.25") + message(STATUS "Disabling gc-sections on gold binutils < 2.25, see: https://sourceware.org/bugzilla/show_bug.cgi?id=17639") + set(LD_AVOID_GC_SECTIONS TRUE) + endif() else() message(WARNING "GNU gold linker isn't available.") set(ENABLE_GOLD_LINKER OFF) @@ -220,7 +227,7 @@ execute_process(COMMAND ${CMAKE_CXX_COMPILER} "-Wl,--version" ERROR_QUIET OUTPUT # For ld.gold and ld.bfs (the GNU linkers) we optimize hard if("${LINKER_VERSION}" MATCHES "GNU gold" OR "${LINKER_VERSION}" MATCHES "GNU ld") message(STATUS "Setting linker optimizations") - if(NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC") + if(NOT (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC" OR "${LD_AVOID_GC_SECTIONS}")) # Tell compiler to put every function in separate section, linker can then match sections and functions set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections") # Tell linker to do dead code and data eminination during link time discarding sections