From 557f95e9ddcf6a33268108fae98c271334ace630 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Wed, 25 May 2016 14:05:24 +0200 Subject: [PATCH] Bug#23344916 ADAPT TO GCC 5.3 ON SOLARIS Our cmake scripts tries to hide (visibility=hidden) certain symbols. The current approach is wrong, and gives link problems with gcc 5.3 on Solaris. Fix: Do not compile entire source files with visibility hidden, that makes *all* symbols in the compilation unit hidden. Rather: tag the desired symbols with __attribute__((visibility("hidden"))) --- CMakeLists.txt | 4 ++++ cmake/libutils.cmake | 12 ------------ config.h.cmake | 3 +++ configure.cmake | 3 +++ include/sha1.h | 14 +++++++++++--- libevent/CMakeLists.txt | 2 ++ mysys_ssl/CMakeLists.txt | 2 -- rapid/plugin/x/CMakeLists.txt | 2 -- rapid/plugin/x/mysqlxtest_src/mysql41_hash.h | 12 ++++++++++-- 9 files changed, 33 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c21eeaf70d62..ef03673f95ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -248,6 +248,8 @@ MACRO (MY_CHECK_C_COMPILER_FLAG FLAG RESULT) FAIL_REGEX "unrecognized .*option" FAIL_REGEX "ignoring unknown option" FAIL_REGEX "[Ww]arning: [Oo]ption" + FAIL_REGEX "error: visibility" + FAIL_REGEX "warning: visibility" ) SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}") ENDMACRO() @@ -262,6 +264,8 @@ MACRO (MY_CHECK_CXX_COMPILER_FLAG FLAG RESULT) FAIL_REGEX "unrecognized .*option" FAIL_REGEX "ignoring unknown option" FAIL_REGEX "[Ww]arning: [Oo]ption" + FAIL_REGEX "error: visibility" + FAIL_REGEX "warning: visibility" ) SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}") ENDMACRO() diff --git a/cmake/libutils.cmake b/cmake/libutils.cmake index 821c9288e6e8..fa41585126c9 100644 --- a/cmake/libutils.cmake +++ b/cmake/libutils.cmake @@ -291,15 +291,3 @@ FUNCTION(GET_DEPENDEND_OS_LIBS target result) ENDIF() SET(${result} ${ret} PARENT_SCOPE) ENDFUNCTION() - -INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake) - -FUNCTION(RESTRICT_SYMBOL_SOURCE target) - IF(CMAKE_COMPILER_IS_GNUCXX AND UNIX) - SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror") - CHECK_C_COMPILER_FLAG("-fvisibility=hidden" HAVE_VISIBILITY_HIDDEN) - IF(HAVE_VISIBILITY_HIDDEN) - ADD_COMPILE_FLAGS(${target} COMPILE_FLAGS "-fvisibility=hidden") - ENDIF() - ENDIF() -ENDFUNCTION() \ No newline at end of file diff --git a/config.h.cmake b/config.h.cmake index 5b188384770b..3768534ee704 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -182,6 +182,9 @@ #cmakedefine HAVE_U_INT32_T 1 #cmakedefine HAVE_STRUCT_TIMESPEC +/* Support for tagging symbols with __attribute__((visibility("hidden"))) */ +#cmakedefine HAVE_VISIBILITY_HIDDEN 1 + /* Code tests*/ #cmakedefine STACK_DIRECTION @STACK_DIRECTION@ #cmakedefine TIME_WITH_SYS_TIME 1 diff --git a/configure.cmake b/configure.cmake index b190245bcfbe..1c717376792a 100644 --- a/configure.cmake +++ b/configure.cmake @@ -620,6 +620,9 @@ ENDIF() SET(CMAKE_EXTRA_INCLUDE_FILES) +# Support for tagging symbols with __attribute__((visibility("hidden"))) +MY_CHECK_CXX_COMPILER_FLAG("-fvisibility=hidden" HAVE_VISIBILITY_HIDDEN) + # # Code tests # diff --git a/include/sha1.h b/include/sha1.h index 12a86bfba4ae..353fe990db68 100644 --- a/include/sha1.h +++ b/include/sha1.h @@ -1,7 +1,7 @@ #ifndef SHA1_INCLUDED #define SHA1_INCLUDED -/* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,9 +21,17 @@ C_MODE_START -void compute_sha1_hash(uint8 *digest, const char *buf, size_t len); +void compute_sha1_hash(uint8 *digest, const char *buf, size_t len) +#if defined(HAVE_VISIBILITY_HIDDEN) + MY_ATTRIBUTE((visibility("hidden"))) +#endif +; void compute_sha1_hash_multi(uint8 *digest, const char *buf1, int len1, - const char *buf2, int len2); + const char *buf2, int len2) +#if defined(HAVE_VISIBILITY_HIDDEN) + MY_ATTRIBUTE((visibility("hidden"))) +#endif +; C_MODE_END diff --git a/libevent/CMakeLists.txt b/libevent/CMakeLists.txt index 00bbec0c5825..03f69f238371 100644 --- a/libevent/CMakeLists.txt +++ b/libevent/CMakeLists.txt @@ -19,6 +19,8 @@ ADD_DEFINITIONS(-DHAVE_CONFIG_H) INCLUDE_DIRECTORIES(${LIBEVENT_INCLUDE_DIR}/compat/sys ${LIBEVENT_INCLUDE_DIR}) +INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake) + IF ( WIN32 ) INCLUDE_DIRECTORIES(${LIBEVENT_INCLUDE_DIR}/WIN32-Code ${LIBEVENT_INCLUDE_DIR}/compat) diff --git a/mysys_ssl/CMakeLists.txt b/mysys_ssl/CMakeLists.txt index 5d053a51911e..eec1be7127ad 100644 --- a/mysys_ssl/CMakeLists.txt +++ b/mysys_ssl/CMakeLists.txt @@ -50,8 +50,6 @@ IF(WIN32 AND NOT WITH_SSL STREQUAL "bundled") ENDIF() DTRACE_INSTRUMENT(mysys_ssl) -RESTRICT_SYMBOL_SOURCE("my_sha1.cc") - IF(MSVC) INSTALL_DEBUG_TARGET(mysys_ssl DESTINATION ${INSTALL_LIBDIR}/debug) ENDIF() diff --git a/rapid/plugin/x/CMakeLists.txt b/rapid/plugin/x/CMakeLists.txt index c3ef00623792..ca1e7d7e3e60 100644 --- a/rapid/plugin/x/CMakeLists.txt +++ b/rapid/plugin/x/CMakeLists.txt @@ -143,8 +143,6 @@ ELSE() LINK_LIBRARIES xplugin ${xplugin_PROTOBUF_LIB} MODULE_ONLY MODULE_OUTPUT_NAME "mysqlx") - RESTRICT_SYMBOL_SOURCE("${MYSQLX_PROJECT_DIR}/ngs/src/mysql41_hash.cc") - ADD_DEPENDENCIES(xplugin GenError) IF (WITH_LIBEVENT STREQUAL "bundled") ADD_DEPENDENCIES(xplugin ${LIBEVENT_LIBRARY}) diff --git a/rapid/plugin/x/mysqlxtest_src/mysql41_hash.h b/rapid/plugin/x/mysqlxtest_src/mysql41_hash.h index 0aece7d459f0..cad1e3e4cc8d 100644 --- a/rapid/plugin/x/mysqlxtest_src/mysql41_hash.h +++ b/rapid/plugin/x/mysqlxtest_src/mysql41_hash.h @@ -24,9 +24,17 @@ #define MYSQL41_HASH_SIZE 20 /* Hash size in bytes */ -void compute_mysql41_hash(uint8 *digest, const char *buf, size_t len); +void compute_mysql41_hash(uint8 *digest, const char *buf, size_t len) +#if defined(HAVE_VISIBILITY_HIDDEN) + MY_ATTRIBUTE((visibility("hidden"))) +#endif +; void compute_mysql41_hash_multi(uint8 *digest, const char *buf1, int len1, - const char *buf2, int len2); + const char *buf2, int len2) +#if defined(HAVE_VISIBILITY_HIDDEN) + MY_ATTRIBUTE((visibility("hidden"))) +#endif +; #endif /* MYSQL41_HASH_INCLUDED */