Bug #77437 mysql fails to compile and link against libressl
Submitted: 22 Jun 2015 15:39 Modified: 23 Jun 2015 13:59
Reporter: Thomas Anderson Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Compiling Severity:S3 (Non-critical)
Version:5.6.25 OS:Linux (Exherbo distribution)
Assigned to: CPU Architecture:Any

[22 Jun 2015 15:39] Thomas Anderson
Description:
We are packaging mysql for a Linux distribution that gives users the choice between libressl and openssl, since they are for most everyone drop-in replacements. We have some unexpected difficulties with mysql. First, cmake does not by default even detect libressl, and you need a patch such as the one attached to get that far. Next, at link-time you encounter errors like:

Linking CXX shared library libmysqlclient.so
cd /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/libmysql && /usr/x86_64-pc-linux-gnu/bin/cmake -E cmake_link_script CMakeFiles/libmysql.dir/link.txt --verbose=1
make[2]: Leaving directory '/var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build'
/usr/x86_64-pc-linux-gnu/bin/cmake -E cmake_progress_report /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/CMakeFiles 
/usr/bin/x86_64-pc-linux-gnu-g++  -fPIC -march=native -pipe -O2 -fPIC -Wall -Wextra -Wformat-security -Wvla -Woverloaded-virtual -Wno-unused-parameter -O3 -DNDEBUG -DDBUG_OFF -DMY_PTHREAD_FASTMUTEX=1  -Wl,--no-undefined -Wl,--version-script=libmysql.ver -shared -Wl,-soname,libmysqlclient.so.18 -o libmysqlclient.so.18.1.0 CMakeFiles/libmysql.dir/libmysql_exports_file.cc.o -lpthread libclientlib.a ../dbug/libdbug.a ../strings/libstrings.a ../vio/libvio.a ../mysys/libmysys.a ../mysys_ssl/libmysys_ssl.a /usr/x86_64-pc-linux-gnu/lib64/libz.so /usr/x86_64-pc-linux-gnu/lib64/libssl.a /usr/x86_64-pc-linux-gnu/lib64/libcrypto.a -ldl -ldl ../dbug/libdbug.a ../mysys/libmysys.a ../dbug/libdbug.a ../mysys/libmysys.a -lm ../strings/libstrings.a -lpthread /usr/x86_64-pc-linux-gnu/lib64/libz.so -Wl,-rpath,/usr/x86_64-pc-linux-gnu/lib64: 
[ 66%] Built target pfs_user-oom-t
make -f libmysql/CMakeFiles/mysqlclient.dir/build.make libmysql/CMakeFiles/mysqlclient.dir/depend
make[2]: Entering directory '/var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build'
/usr/x86_64-pc-linux-gnu/bin/cmake -E cmake_progress_report /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/CMakeFiles 
libmysql/CMakeFiles/libmysql.dir/build.make:103: recipe for target 'libmysql/libmysqlclient.so.18.1.0' failed
make[2]: Leaving directory '/var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build'
CMakeFiles/Makefile2:2683: recipe for target 'libmysql/CMakeFiles/libmysql.dir/all' failed
/usr/x86_64-pc-linux-gnu/bin/cmake -E cmake_progress_report /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/CMakeFiles 64
/usr/x86_64-pc-linux-gnu/bin/cmake -E cmake_progress_report /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/CMakeFiles 
[ 67%] [ 67%] Generating mysqlclient_depends.c
cd /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/libmysql && /usr/x86_64-pc-linux-gnu/bin/cmake -E touch /var/tmp/paludis/build/dev-db-mysql-5.6.25-r2/work/build/libmysql/mysqlclient_depends.c
/usr/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-ld: /usr/x86_64-pc-linux-gnu/lib64/libssl.a(ssl_algs.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/x86_64-pc-linux-gnu/lib64/libssl.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [libmysql/libmysqlclient.so.18.1.0] Error 1
make[1]: *** [libmysql/CMakeFiles/libmysql.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
 

How to repeat:
* Install libressl as your libssl provider
* Try to install mysql

Suggested fix:
--- mysql-orig/cmake/ssl.cmake                                                                      
+++ mysql/cmake/ssl.cmake                                                                           
@@ -175,8 +175,7 @@                                                                                 
                                                                                                    
     IF(OPENSSL_INCLUDE_DIR AND                                                                     
        OPENSSL_LIBRARY   AND                                                                       
-       CRYPTO_LIBRARY      AND                                                                     
-       OPENSSL_MAJOR_VERSION STREQUAL "1"                                                          
+       CRYPTO_LIBRARY                                                                              
       )                                                                                            
       SET(OPENSSL_FOUND TRUE)                                                                      
     ELSE()
[23 Jun 2015 13:59] MySQL Verification Team
Hello Thomas Anderson,

Thank you for the report.

Thanks,
Umesh
[23 Jun 2015 14:00] MySQL Verification Team
test results

Attachment: 77437_5.6.25.build.results (application/octet-stream, text), 156.26 KiB.

[25 Jul 2015 11:27] Wulf Krüger
We're facing the same issue, the suggested patch is simple and this bug hasn't seen any action for a month. Any chance to get this fixed?
[17 Oct 2017 16:53] Rasmus Thomsen
Hello,

maybe a patch which is something along the lines of this is more suitable for upstreaming, since it doesn't completely cancel out checking for openssl 1.x and just looks for libressl too ( whose version numbers are along the lines of 2.x ).

diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake
index 19ac9a6..b5bf04d 100644
--- a/cmake/ssl.cmake
+++ b/cmake/ssl.cmake
@@ -176,7 +176,8 @@ MACRO (MYSQL_CHECK_SSL)
     IF(OPENSSL_INCLUDE_DIR AND
        OPENSSL_LIBRARY   AND
        CRYPTO_LIBRARY      AND
-       OPENSSL_MAJOR_VERSION STREQUAL "1"
+       OPENSSL_MAJOR_VERSION STREQUAL "1" OR
+       OPENSSL_MAJOR_VERSION STREQUAL "2"
       )
       SET(OPENSSL_FOUND TRUE)
     ELSE()