From 3978bfd2356af0d714d93832e79b0076009269d1 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 19 Aug 2026 16:43:00 +1000 Subject: [PATCH] MDEV-40832 Export mariadb services as ELF versioned ABI Move service versioning from include/service_versions.h to cmake/mariadb_services.cmake. For ELF capable environments produce a version script, so that the MariaDB exported services are versioned. Co-authored-by: ChatGPT GPT-5.6 Luna --- .gitignore | 1 + CMakeLists.txt | 1 + cmake/mariadb_services.cmake | 241 ++++++++++++++++++++++ include/mysql/service_base64.h | 3 + include/mysql/service_debug_sync.h | 2 + include/mysql/service_encryption.h | 3 + include/mysql/service_encryption_scheme.h | 2 + include/mysql/service_json.h | 2 + include/mysql/service_kill_statement.h | 2 + include/mysql/service_log_warnings.h | 3 + include/mysql/service_logger.h | 3 + include/mysql/service_md5.h | 3 + include/mysql/service_my_crypt.h | 2 + include/mysql/service_my_print_error.h | 5 +- include/mysql/service_my_snprintf.h | 3 + include/mysql/service_print_check_msg.h | 5 +- include/mysql/service_progress_report.h | 2 + include/mysql/service_sha1.h | 3 + include/mysql/service_sha2.h | 3 + include/mysql/service_sql.h | 3 + include/mysql/service_thd_alloc.h | 3 + include/mysql/service_thd_autoinc.h | 3 + include/mysql/service_thd_error_context.h | 3 + include/mysql/service_thd_mdl.h | 5 +- include/mysql/service_thd_rnd.h | 4 + include/mysql/service_thd_specifics.h | 2 + include/mysql/service_thd_timezone.h | 3 + include/mysql/service_thd_wait.h | 4 +- include/mysql/service_wsrep.h | 2 + include/providers/bzlib.h | 5 + include/providers/lz4.h | 5 + include/providers/lzma.h | 4 + include/providers/lzo/lzo1x.h | 5 + include/providers/snappy-c.h | 5 + include/service_versions.h | 54 ----- sql/CMakeLists.txt | 3 + sql/sql_plugin.cc | 17 +- sql/sql_plugin_services.inl | 80 +++++++ 38 files changed, 440 insertions(+), 59 deletions(-) create mode 100644 cmake/mariadb_services.cmake delete mode 100644 include/service_versions.h diff --git a/.gitignore b/.gitignore index 11a6c4600d711..06f6abc73976e 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,7 @@ include/probes_mysql.d include/probes_mysql_dtrace.h include/probes_mysql_nodtrace.h include/source_revision.h +include/service_versions.h info_macros.cmake libmysql*/libmysql*_exports_file.cc libmysql*/merge_archives_mysql*.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f68ec93a13ae..57a605ed62e09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -493,6 +493,7 @@ SET(PYTHON_SHEBANG "/usr/bin/env python3" CACHE STRING "python shebang") MARK_AS_ADVANCED(PYTHON_SHEBANG) # Add storage engines and plugins. +INCLUDE(cmake/mariadb_services.cmake) CONFIGURE_PLUGINS() ADD_SUBDIRECTORY(include) diff --git a/cmake/mariadb_services.cmake b/cmake/mariadb_services.cmake new file mode 100644 index 0000000000000..f98959c420e30 --- /dev/null +++ b/cmake/mariadb_services.cmake @@ -0,0 +1,241 @@ +# MariaDB service ABI definitions and generated ABI files. +# +# This file is included from the top-level CMakeLists.txt: +# +# include(cmake/mariadb_services.cmake) +# +# It is the single source of truth for the service ABI versions. +# +# Each service is: +# +# +# +# Version format: +# +# 0xMMmm +# +# which becomes: +# +# MARIADB__MM.mm +# +# For example: +# +# my_sha1 0x0101 my_sha1_service +# +# becomes: +# +# VERSION_my_sha1 = 0x0101 +# MARIADB_SYMVER_my_sha1_service = "MARIADB_my_sha1_1.1" +# +# and the linker script exports: +# +# MARIADB_my_sha1_1.1 { +# global: +# my_sha1_service; +# }; + + +# --------------------------------------------------------------------------- +# Service definitions +# --------------------------------------------------------------------------- + +set(MARIADB_SERVICES + # name version ELF symbol + + debug_sync 0x1000 debug_sync_service + kill_statement 0x1000 thd_kill_statement_service + + base64 0x0100 base64_service + encryption 0x0300 encryption_service + encryption_scheme 0x0100 encryption_scheme_service + logger 0x0100 logger_service + thd_log_warnings 0x0100 thd_log_warnings_service + my_crypt 0x0100 my_crypt_service + my_md5 0x0100 my_md5_service + my_print_error 0x0100 my_print_error_service + my_sha1 0x0101 my_sha1_service + my_sha2 0x0100 my_sha2_service + my_snprintf 0x0100 my_snprintf_service + progress_report 0x0100 progress_report_service + + thd_alloc 0x0200 thd_alloc_service + thd_autoinc 0x0100 thd_autoinc_service + thd_error_context 0x0200 thd_error_context_service + thd_rnd 0x0100 thd_rnd_service + thd_specifics 0x0100 thd_specifics_service + thd_timezone 0x0100 thd_timezone_service + thd_wait 0x0100 thd_wait_service + + wsrep 0x0500 wsrep_service + json 0x0100 json_service + sql_service 0x0102 sql_service_handler + thd_mdl 0x0100 thd_mdl_service + print_check_msg 0x0100 print_check_msg_service + + provider_bzip2 0x0100 provider_service_bzip2 + provider_lz4 0x0100 provider_service_lz4 + provider_lzma 0x0100 provider_service_lzma + provider_lzo 0x0100 provider_service_lzo + provider_snappy 0x0100 provider_service_snappy +) + + +# --------------------------------------------------------------------------- +# Generated files +# --------------------------------------------------------------------------- + +set(MARIADB_GENERATED_DIR + "${CMAKE_CURRENT_BINARY_DIR}/generated" +) + +set(MARIADB_VERSION_HEADER + "${CMAKE_CURRENT_BINARY_DIR}/include/service_versions.h" +) + +set(MARIADB_VERSION_SCRIPT + "${CMAKE_CURRENT_BINARY_DIR}/sql/mariadb_services.lds" +) + +# --------------------------------------------------------------------------- +# Generate service_versions.h and the linker version script +# --------------------------------------------------------------------------- + +set(_MARIADB_HEADER [=[ +/* Generated file -- DO NOT EDIT. */ +#pragma once + +#ifdef _WIN32 +#define SERVICE_VERSION __declspec(dllexport) void * +#else +#define SERVICE_VERSION void * +#endif + + +#if defined(__ELF__) && defined(__GNUC__) + +#define MARIADB_SERVICE_VERSION(name, symbol, version) \ + MARIADB_SERVICE_VERSION_IMPL(name, symbol, version) + +#define MARIADB_SERVICE_VERSION_IMPL(name, symbol, version) \ + _Static_assert( \ + (version) == VERSION_##name, \ + "MariaDB service ABI version mismatch: " #name); \ + __asm__(".symver " #symbol "," #symbol "@" \ + MARIADB_SYMVER_##symbol) + +#else + +#define MARIADB_SERVICE_VERSION(name, symbol, version) \ + _Static_assert( \ + (version) == VERSION_##name, \ + "MariaDB service ABI version mismatch: " #name) + +#endif +]=]) + +set(_MARIADB_LDS [=[ +/* Generated file -- DO NOT EDIT. */ +]=]) + +list(LENGTH MARIADB_SERVICES _service_count) + +math(EXPR _service_last + "${_service_count} - 1" +) + +if(_service_count GREATER 0) + foreach(_i RANGE 0 ${_service_last} 3) + + math(EXPR _version_index "${_i} + 1") + math(EXPR _symbol_index "${_i} + 2") + + list(GET MARIADB_SERVICES ${_i} _name) + list(GET MARIADB_SERVICES ${_version_index} _version) + list(GET MARIADB_SERVICES ${_symbol_index} _symbol) + + # Validate the version. + if(NOT _version MATCHES "^0x[0-9A-Fa-f]+$") + message(FATAL_ERROR + "Invalid version '${_version}' for MariaDB service '${_name}'" + ) + endif() + + # Convert 0xMMmm into major/minor. + math(EXPR _major "${_version} >> 8") + math(EXPR _minor "${_version} & 0xff") + + set(_elf_version + "MARIADB_${_name}_${_major}.${_minor}" + ) + + # ------------------------------------------------------------------- + # service_versions.h + # ------------------------------------------------------------------- + + string(APPEND _MARIADB_HEADER + "#define VERSION_${_name} ${_version}\n" + ) + + string(APPEND _MARIADB_HEADER + "#define MARIADB_SYMVER_${_symbol} \"${_elf_version}\"\n" + ) + + string(APPEND _MARIADB_HEADER + "\n" + ) + + # ------------------------------------------------------------------- + # linker script + # ------------------------------------------------------------------- + + string(APPEND _MARIADB_LDS + "${_elf_version} {\n" + " global:\n" + " ${_symbol};\n" + "};\n" + "\n" + ) + + endforeach() +endif() + + +# --------------------------------------------------------------------------- +# Write generated files +# --------------------------------------------------------------------------- + +file(GENERATE + OUTPUT "${MARIADB_VERSION_HEADER}" + CONTENT "${_MARIADB_HEADER}" +) + +file(GENERATE + OUTPUT "${MARIADB_VERSION_SCRIPT}" + CONTENT "${_MARIADB_LDS}" +) + + +# --------------------------------------------------------------------------- +# Convenience target +# --------------------------------------------------------------------------- + +add_custom_target(mariadb_service_versions + DEPENDS + "${MARIADB_VERSION_HEADER}" + "${MARIADB_VERSION_SCRIPT}" +) + + +# --------------------------------------------------------------------------- +# Include generated headers from the build tree. +# +# This makes: +# +# #include "service_versions.h" +# +# work for targets that use the normal MariaDB include paths. +# --------------------------------------------------------------------------- + +include_directories( + "${MARIADB_GENERATED_DIR}" +) diff --git a/include/mysql/service_base64.h b/include/mysql/service_base64.h index fa54b4923d4fb..1612c96a7dcb1 100644 --- a/include/mysql/service_base64.h +++ b/include/mysql/service_base64.h @@ -25,6 +25,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -44,6 +45,8 @@ extern struct base64_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(base64, base64_service, 0x0100); + #define my_base64_needed_encoded_length(A) base64_service->base64_needed_encoded_length_ptr(A) #define my_base64_encode_max_arg_length() base64_service->base64_encode_max_arg_length_ptr() #define my_base64_needed_decoded_length(A) base64_service->base64_needed_decoded_length_ptr(A) diff --git a/include/mysql/service_debug_sync.h b/include/mysql/service_debug_sync.h index f7fdbf048324f..9589903607b36 100644 --- a/include/mysql/service_debug_sync.h +++ b/include/mysql/service_debug_sync.h @@ -318,6 +318,7 @@ See also http://forge.mysql.com/worklog/task.php?id=4259 */ +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -328,6 +329,7 @@ extern "C" { #ifdef MYSQL_DYNAMIC_PLUGIN extern void (*debug_sync_service)(MYSQL_THD, const char *, size_t); +MARIADB_SERVICE_VERSION(debug_sync, debug_sync_service, 0x1000); #else #define debug_sync_service debug_sync_C_callback_ptr extern void (*debug_sync_C_callback_ptr)(MYSQL_THD, const char *, size_t); diff --git a/include/mysql/service_encryption.h b/include/mysql/service_encryption.h index 8b1d963b4c601..54e5491212dc2 100644 --- a/include/mysql/service_encryption.h +++ b/include/mysql/service_encryption.h @@ -24,6 +24,7 @@ *provider* (encryption plugin). */ +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #ifdef _WIN32 @@ -36,6 +37,7 @@ #ifdef __cplusplus extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -72,6 +74,7 @@ struct encryption_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN extern struct encryption_service_st *encryption_service; +MARIADB_SERVICE_VERSION(encryption, encryption_service, 0x0300); #define encryption_key_get_latest_version(KI) encryption_service->encryption_key_get_latest_version_func(KI) #define encryption_key_get(KI,KV,K,S) encryption_service->encryption_key_get_func((KI),(KV),(K),(S)) diff --git a/include/mysql/service_encryption_scheme.h b/include/mysql/service_encryption_scheme.h index bcd4d646d9e92..e1514c97cf29f 100644 --- a/include/mysql/service_encryption_scheme.h +++ b/include/mysql/service_encryption_scheme.h @@ -106,6 +106,8 @@ extern struct encryption_scheme_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(encryption_scheme, encryption_scheme_service, 0x0100); + #define encryption_scheme_encrypt(S,SL,D,DL,SCH,KV,I32,J32,I64) encryption_scheme_service->encryption_scheme_encrypt_func(S,SL,D,DL,SCH,KV,I32,J32,I64) #define encryption_scheme_decrypt(S,SL,D,DL,SCH,KV,I32,J32,I64) encryption_scheme_service->encryption_scheme_decrypt_func(S,SL,D,DL,SCH,KV,I32,J32,I64) diff --git a/include/mysql/service_json.h b/include/mysql/service_json.h index cb748c0c83f29..fcd2975a1bcb3 100644 --- a/include/mysql/service_json.h +++ b/include/mysql/service_json.h @@ -82,6 +82,8 @@ extern struct json_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(json, json_service, 0x0100); + #define json_type json_service->json_type #define json_get_array_item json_service->json_get_array_item #define json_get_object_key json_service->json_get_object_key diff --git a/include/mysql/service_kill_statement.h b/include/mysql/service_kill_statement.h index 9f3415a7de5cc..6087a2d8751bf 100644 --- a/include/mysql/service_kill_statement.h +++ b/include/mysql/service_kill_statement.h @@ -54,6 +54,8 @@ extern struct kill_statement_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(kill_statement, thd_kill_statement_service, 0x1000); + #define thd_kill_level(THD) \ thd_kill_statement_service->thd_kill_level_func(THD) diff --git a/include/mysql/service_log_warnings.h b/include/mysql/service_log_warnings.h index f55df70ef8e01..7c0f8a6c455dc 100644 --- a/include/mysql/service_log_warnings.h +++ b/include/mysql/service_log_warnings.h @@ -34,6 +34,9 @@ extern struct thd_log_warnings_service_st { } *thd_log_warnings_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(thd_log_warnings, thd_log_warnings_service, 0x0100); + # define thd_log_warnings(THD) thd_log_warnings_service->thd_log_warnings(THD) #else /** diff --git a/include/mysql/service_logger.h b/include/mysql/service_logger.h index 5979901bdd0c3..b7c16964d650f 100644 --- a/include/mysql/service_logger.h +++ b/include/mysql/service_logger.h @@ -16,6 +16,7 @@ #ifndef MYSQL_SERVICE_LOGGER_INCLUDED #define MYSQL_SERVICE_LOGGER_INCLUDED +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -73,6 +74,8 @@ extern struct logger_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(logger, logger_service, 0x0100); + #define logger_init_mutexes logger_service->logger_init_mutexes #define logger_open(path, size_limit, rotations) \ (logger_service->open(path, size_limit, rotations)) diff --git a/include/mysql/service_md5.h b/include/mysql/service_md5.h index 336cf70f85ec4..cbf858ff9e19f 100644 --- a/include/mysql/service_md5.h +++ b/include/mysql/service_md5.h @@ -25,6 +25,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -42,6 +43,8 @@ extern struct my_md5_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_md5, my_md5_service, 0x0100); + #define my_md5(A,B,C) my_md5_service->my_md5_type(A,B,C) #define my_md5_multi my_md5_service->my_md5_multi_type #define my_md5_context_size() my_md5_service->my_md5_context_size_type() diff --git a/include/mysql/service_my_crypt.h b/include/mysql/service_my_crypt.h index 1a4ebcfd0675c..082c7cba88383 100644 --- a/include/mysql/service_my_crypt.h +++ b/include/mysql/service_my_crypt.h @@ -74,6 +74,8 @@ extern struct my_crypt_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_crypt, my_crypt_service, 0x0100); + #define my_aes_crypt_init(A,B,C,D,E,F,G) \ my_crypt_service->my_aes_crypt_init(A,B,C,D,E,F,G) diff --git a/include/mysql/service_my_print_error.h b/include/mysql/service_my_print_error.h index 74ba6a2adb813..27db7c578c077 100644 --- a/include/mysql/service_my_print_error.h +++ b/include/mysql/service_my_print_error.h @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ #define MYSQL_SERVICE_MY_PRINT_ERROR_INCLUDED /** - @file include/mysql/service_my_print_error.h + @file include/mysservice_my_print_error.h This service provides functions for plugins to report errors to client (without client, the errors are written to the error log). @@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #include @@ -46,6 +47,8 @@ extern struct my_print_error_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_print_error, my_print_error_service, 0x0100); + #define my_error my_print_error_service->my_error_func #define my_printf_error my_print_error_service->my_printf_error_func #define my_printv_error(A,B,C,D) my_print_error_service->my_printv_error_func(A,B,C,D) diff --git a/include/mysql/service_my_snprintf.h b/include/mysql/service_my_snprintf.h index fcc832fc1f1d5..34b7b27cf4bd2 100644 --- a/include/mysql/service_my_snprintf.h +++ b/include/mysql/service_my_snprintf.h @@ -79,6 +79,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #include @@ -91,6 +92,8 @@ extern struct my_snprintf_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_snprintf, my_snprintf_service, 0x0100); + #define my_vsnprintf my_snprintf_service->my_vsnprintf_type #define my_snprintf my_snprintf_service->my_snprintf_type diff --git a/include/mysql/service_print_check_msg.h b/include/mysql/service_print_check_msg.h index c2c7cf0a3814e..9a2f719a903ba 100644 --- a/include/mysql/service_print_check_msg.h +++ b/include/mysql/service_print_check_msg.h @@ -16,7 +16,7 @@ #pragma once /** - @file include/mysql/service_print_check_msg.h + @file include/mysservice_print_check_msg.h This service provides functions to write messages for check or repair */ @@ -32,6 +32,9 @@ extern struct print_check_msg_service_st { } *print_check_msg_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(print_check_msg, print_check_msg_service, 0x0100); + # define print_check_msg_context(_THD) print_check_msg_service->print_check_msg #else extern void print_check_msg(MYSQL_THD, const char *db_name, const char *table_name, diff --git a/include/mysql/service_progress_report.h b/include/mysql/service_progress_report.h index 3f99f78e7dc2b..5cce6d285dfb9 100644 --- a/include/mysql/service_progress_report.h +++ b/include/mysql/service_progress_report.h @@ -47,6 +47,8 @@ extern struct progress_report_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(progress_report, progress_report_service, 0x0100); + #define thd_progress_init(thd,max_stage) (progress_report_service->thd_progress_init_func((thd),(max_stage))) #define thd_progress_report(thd, progress, max_progress) (progress_report_service->thd_progress_report_func((thd), (progress), (max_progress))) #define thd_progress_next_stage(thd) (progress_report_service->thd_progress_next_stage_func(thd)) diff --git a/include/mysql/service_sha1.h b/include/mysql/service_sha1.h index d864e23fa849d..ab9e0e2e497b5 100644 --- a/include/mysql/service_sha1.h +++ b/include/mysql/service_sha1.h @@ -25,6 +25,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -42,6 +43,8 @@ extern struct my_sha1_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_sha1, my_sha1_service, 0x0101); + #define my_sha1(A,B,C) my_sha1_service->my_sha1_type(A,B,C) #define my_sha1_multi my_sha1_service->my_sha1_multi_type #define my_sha1_context_size() my_sha1_service->my_sha1_context_size_type() diff --git a/include/mysql/service_sha2.h b/include/mysql/service_sha2.h index 00834a9b8f432..4827132c16f7f 100644 --- a/include/mysql/service_sha2.h +++ b/include/mysql/service_sha2.h @@ -25,6 +25,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -61,6 +62,8 @@ extern struct my_sha2_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(my_sha2, my_sha2_service, 0x0100); + #define my_sha224(A,B,C) my_sha2_service->my_sha224_type(A,B,C) #define my_sha224_multi my_sha2_service->my_sha224_multi_type #define my_sha224_context_size() my_sha2_service->my_sha224_context_size_type() diff --git a/include/mysql/service_sql.h b/include/mysql/service_sql.h index a4a61cc0f47df..1627963affeb1 100644 --- a/include/mysql/service_sql.h +++ b/include/mysql/service_sql.h @@ -16,6 +16,7 @@ #ifndef MYSQL_SERVICE_SQL #define MYSQL_SERVICE_SQL +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -78,6 +79,8 @@ extern struct sql_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(sql_service, sql_service, 0x0102); + #define mysql_init(M) sql_service->mysql_init_func(M) #define mysql_real_connect_local(M) sql_service->mysql_real_connect_local_func(M) #define mysql_real_connect(M,H,U,PW,D,P,S,F) sql_service->mysql_real_connect_func(M,H,U,PW,D,P,S,F) diff --git a/include/mysql/service_thd_alloc.h b/include/mysql/service_thd_alloc.h index 014277b5d0012..813b1bf9e1f08 100644 --- a/include/mysql/service_thd_alloc.h +++ b/include/mysql/service_thd_alloc.h @@ -27,6 +27,7 @@ allocations - they are better served with my_malloc. */ +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -69,6 +70,8 @@ extern struct thd_alloc_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(thd_alloc, thd_alloc_service, 0x0200); + #define thd_alloc(thd,size) (thd_alloc_service->thd_alloc_func((thd), (size))) #define thd_calloc(thd,size) (thd_alloc_service->thd_calloc_func((thd), (size))) diff --git a/include/mysql/service_thd_autoinc.h b/include/mysql/service_thd_autoinc.h index 28bd2bb1a5eaf..10515a5c250c6 100644 --- a/include/mysql/service_thd_autoinc.h +++ b/include/mysql/service_thd_autoinc.h @@ -32,6 +32,9 @@ extern struct thd_autoinc_service_st { } *thd_autoinc_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(thd_autoinc, thd_autoinc_service, 0x0100); + #define thd_get_autoinc(thd, off, inc) \ (thd_autoinc_service->thd_get_autoinc_func((thd), (off), (inc))) #else diff --git a/include/mysql/service_thd_error_context.h b/include/mysql/service_thd_error_context.h index 0b9082dd314cb..5e8780e4801b9 100644 --- a/include/mysql/service_thd_error_context.h +++ b/include/mysql/service_thd_error_context.h @@ -39,6 +39,9 @@ extern struct thd_error_context_service_st { } *thd_error_context_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(thd_error_context, thd_error_context_service, 0x0200); + #define thd_get_error_message(thd) \ (thd_error_context_service->thd_get_error_message_func((thd))) #define thd_get_error_number(thd) \ diff --git a/include/mysql/service_thd_mdl.h b/include/mysql/service_thd_mdl.h index 19b0476914ed7..ddcf30c7a9f66 100644 --- a/include/mysql/service_thd_mdl.h +++ b/include/mysql/service_thd_mdl.h @@ -16,7 +16,7 @@ #pragma once /** - @file include/mysql/service_thd_mdl.h + @file include/mysservice_thd_mdl.h This service provides functions for plugins and storage engines to access metadata locks. */ @@ -31,6 +31,9 @@ extern struct thd_mdl_service_st { } *thd_mdl_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(thd_mdl, thd_mdl_service, 0x0100); + # define thd_mdl_context(_THD) thd_mdl_service->thd_mdl_context(_THD) #else /** diff --git a/include/mysql/service_thd_rnd.h b/include/mysql/service_thd_rnd.h index 8761077ea7373..b73348835724c 100644 --- a/include/mysql/service_thd_rnd.h +++ b/include/mysql/service_thd_rnd.h @@ -27,6 +27,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -37,6 +38,9 @@ extern struct thd_rnd_service_st { } *thd_rnd_service; #ifdef MYSQL_DYNAMIC_PLUGIN + +MARIADB_SERVICE_VERSION(thd_rnd, thd_rnd_service, 0x0100); + #define thd_rnd(A) thd_rnd_service->thd_rnd_ptr(A) #define thd_create_random_password(A,B,C) thd_rnd_service->thd_c_r_p_ptr(A,B,C) #else diff --git a/include/mysql/service_thd_specifics.h b/include/mysql/service_thd_specifics.h index a4078bd5cc038..c4b09e77688f9 100644 --- a/include/mysql/service_thd_specifics.h +++ b/include/mysql/service_thd_specifics.h @@ -70,6 +70,8 @@ extern struct thd_specifics_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(thd_specifics, thd_specifics_service, 0x0100); + #define thd_key_create(K) (thd_specifics_service->thd_key_create_func(K)) #define thd_key_delete(K) (thd_specifics_service->thd_key_delete_func(K)) #define thd_getspecific(T, K) (thd_specifics_service->thd_getspecific_func(T, K)) diff --git a/include/mysql/service_thd_timezone.h b/include/mysql/service_thd_timezone.h index 667137745f4c9..0e77c7d59f88a 100644 --- a/include/mysql/service_thd_timezone.h +++ b/include/mysql/service_thd_timezone.h @@ -30,6 +30,7 @@ is used for conversion. */ +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK /* This service currently does not depend on any system headers. @@ -52,6 +53,8 @@ extern struct thd_timezone_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(thd_timezone, thd_timezone_service, 0x0100); + #define thd_TIME_to_gmt_sec(thd, ltime, errcode) \ (thd_timezone_service->thd_TIME_to_gmt_sec((thd), (ltime), (errcode))) diff --git a/include/mysql/service_thd_wait.h b/include/mysql/service_thd_wait.h index c20878fd85b24..fec731d2dbf7f 100644 --- a/include/mysql/service_thd_wait.h +++ b/include/mysql/service_thd_wait.h @@ -17,7 +17,7 @@ #define MYSQL_SERVICE_THD_WAIT_INCLUDED /** - @file include/mysql/service_thd_wait.h + @file include/mysservice_thd_wait.h This service provides functions for plugins and storage engines to report when they are going to sleep/stall. @@ -85,6 +85,8 @@ extern struct thd_wait_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(thd_wait, thd_wait_service, 0x0100); + #define thd_wait_begin(_THD, _WAIT_TYPE) \ thd_wait_service->thd_wait_begin_func(_THD, _WAIT_TYPE) #define thd_wait_end(_THD) thd_wait_service->thd_wait_end_func(_THD) diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index cf94364c1cf82..5b248defee367 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -103,6 +103,8 @@ extern struct wsrep_service_st { #ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(wsrep, wsrep_service, 0x0500); + #define MYSQL_SERVICE_WSREP_DYNAMIC_INCLUDED #define get_wsrep_recovery() wsrep_service->get_wsrep_recovery_func() #define wsrep_consistency_check(T) wsrep_service->wsrep_consistency_check_func(T) diff --git a/include/providers/bzlib.h b/include/providers/bzlib.h index b48c940bdbcfc..917777bfbabd8 100644 --- a/include/providers/bzlib.h +++ b/include/providers/bzlib.h @@ -8,6 +8,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -118,6 +119,10 @@ struct provider_service_bzip2_st{ extern struct provider_service_bzip2_st *provider_service_bzip2; +#ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(provider_bzip2, provider_service_bzip2, 0x0100); +#endif + #ifdef __cplusplus } #endif diff --git a/include/providers/lz4.h b/include/providers/lz4.h index 4ac6b2c8f0ddf..b2db5f90c1190 100644 --- a/include/providers/lz4.h +++ b/include/providers/lz4.h @@ -8,6 +8,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #include @@ -55,6 +56,10 @@ struct provider_service_lz4_st extern struct provider_service_lz4_st *provider_service_lz4; +#ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(provider_lz4, provider_service_lz4, 0x0100); +#endif + #ifdef __cplusplus } #endif diff --git a/include/providers/lzma.h b/include/providers/lzma.h index 8125bb8cb04ea..59c2c0fa37cbd 100644 --- a/include/providers/lzma.h +++ b/include/providers/lzma.h @@ -8,6 +8,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #include @@ -93,6 +94,9 @@ struct provider_service_lzma_st extern struct provider_service_lzma_st *provider_service_lzma; +#ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(provider_lzma, provider_service_lzma, 0x0100); +#endif #ifdef __cplusplus } diff --git a/include/providers/lzo/lzo1x.h b/include/providers/lzo/lzo1x.h index 93d1461f9cb15..f84fa5a096fba 100644 --- a/include/providers/lzo/lzo1x.h +++ b/include/providers/lzo/lzo1x.h @@ -8,6 +8,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #endif @@ -54,6 +55,10 @@ struct provider_service_lzo_st extern struct provider_service_lzo_st *provider_service_lzo; +#ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(provider_lzo, provider_service_lzo, 0x0100); +#endif + #ifdef __cplusplus } #endif diff --git a/include/providers/snappy-c.h b/include/providers/snappy-c.h index afc6aef274c5b..004e82010028d 100644 --- a/include/providers/snappy-c.h +++ b/include/providers/snappy-c.h @@ -8,6 +8,7 @@ extern "C" { #endif +#include "service_versions.h" #ifndef MYSQL_ABI_CHECK #include #include @@ -67,6 +68,10 @@ struct provider_service_snappy_st extern struct provider_service_snappy_st *provider_service_snappy; +#ifdef MYSQL_DYNAMIC_PLUGIN +MARIADB_SERVICE_VERSION(provider_snappy, provider_service_snappy, 0x0100); +#endif + #ifdef __cplusplus } #endif diff --git a/include/service_versions.h b/include/service_versions.h deleted file mode 100644 index cd66315ffd261..0000000000000 --- a/include/service_versions.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2009, 2010, Oracle and/or its affiliates. - Copyright (c) 2012, 2021, MariaDB - - 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 - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ - -#ifdef _WIN32 -#define SERVICE_VERSION __declspec(dllexport) void * -#else -#define SERVICE_VERSION void * -#endif - -#define VERSION_debug_sync 0x1000 -#define VERSION_kill_statement 0x1000 - -#define VERSION_base64 0x0100 -#define VERSION_encryption 0x0300 -#define VERSION_encryption_scheme 0x0100 -#define VERSION_logger 0x0100 -#define VERSION_my_crypt 0x0100 -#define VERSION_my_md5 0x0100 -#define VERSION_my_print_error 0x0100 -#define VERSION_my_sha1 0x0101 -#define VERSION_my_sha2 0x0100 -#define VERSION_my_snprintf 0x0100 -#define VERSION_progress_report 0x0100 -#define VERSION_thd_alloc 0x0200 -#define VERSION_thd_autoinc 0x0100 -#define VERSION_thd_error_context 0x0200 -#define VERSION_thd_rnd 0x0100 -#define VERSION_thd_specifics 0x0100 -#define VERSION_thd_timezone 0x0100 -#define VERSION_thd_wait 0x0100 -#define VERSION_wsrep 0x0500 -#define VERSION_json 0x0100 -#define VERSION_sql_service 0x0102 -#define VERSION_thd_mdl 0x0100 -#define VERSION_print_check_msg 0x0100 - -#define VERSION_provider_bzip2 0x0100 -#define VERSION_provider_lz4 0x0100 -#define VERSION_provider_lzma 0x0100 -#define VERSION_provider_lzo 0x0100 -#define VERSION_provider_snappy 0x0100 diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 1fc81dbe0aef3..b0924534559b4 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -325,6 +325,9 @@ ENDIF() IF(NOT WITHOUT_DYNAMIC_PLUGINS) IF(NOT MSVC) SET_TARGET_PROPERTIES(mariadbd PROPERTIES ENABLE_EXPORTS TRUE) + TARGET_LINK_OPTIONS(mariadbd PRIVATE + "-Wl,--version-script=${MARIADB_VERSION_SCRIPT}" + ) ENDIF() GET_TARGET_PROPERTY(mysqld_link_flags mariadbd LINK_FLAGS) IF(NOT mysqld_link_flags) diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index edf3d8a939896..246c49813d3be 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -741,11 +741,15 @@ static st_plugin_dl *plugin_dl_add(const LEX_CSTRING *dl, myf MyFlags) { #ifdef HAVE_DLOPEN char dlpath[FN_REFLEN]; - size_t plugin_dir_len,i; + size_t plugin_dir_len; uint dummy_errors; struct st_plugin_dl *tmp= 0, plugin_dl; void *sym; +#if defined(__ELF__) && defined(__GNUC__) +#else + size_t i; st_ptr_backup tmp_backup[array_elements(list_of_services)]; +#endif DBUG_ENTER("plugin_dl_add"); DBUG_PRINT("enter", ("dl->str: '%s', dl->length: %d", dl->str, (int) dl->length)); @@ -807,6 +811,8 @@ static st_plugin_dl *plugin_dl_add(const LEX_CSTRING *dl, myf MyFlags) goto ret; } +#if defined(__ELF__) && defined(__GNUC__) +#else /* link the services in */ for (i= 0; i < array_elements(list_of_services); i++) { @@ -828,6 +834,7 @@ static st_plugin_dl *plugin_dl_add(const LEX_CSTRING *dl, myf MyFlags) *ptr= list_of_services[i].service; } } +#endif if (plugin_dl.nbackups) { @@ -836,11 +843,17 @@ static st_plugin_dl *plugin_dl_add(const LEX_CSTRING *dl, myf MyFlags) bytes, MYF(0)); if (!plugin_dl.ptr_backup) { +#if defined(__ELF__) && defined(__GNUC__) +#else restore_ptr_backup(plugin_dl.nbackups, tmp_backup); +#endif my_error(ER_OUTOFMEMORY, MyFlags, bytes); goto ret; } +#if defined(__ELF__) && defined(__GNUC__) +#else memcpy(plugin_dl.ptr_backup, tmp_backup, bytes); +#endif } /* Duplicate and convert dll name */ @@ -1641,9 +1654,11 @@ int plugin_init(int *argc, char **argv, int flags) goto err; } +#if 0 /* prepare debug_sync service */ DBUG_ASSERT(strcmp(list_of_services[1].name, "debug_sync_service") == 0); list_of_services[1].service= *(void**)&debug_sync_C_callback_ptr; +#endif /* prepare encryption_keys service */ finalize_encryption_plugin(0); diff --git a/sql/sql_plugin_services.inl b/sql/sql_plugin_services.inl index 2114f3560a7ec..86f99c1873e60 100644 --- a/sql/sql_plugin_services.inl +++ b/sql/sql_plugin_services.inl @@ -334,7 +334,86 @@ static struct provider_service_lz4_st provider_handler_lz4= false // .is_loaded }; struct provider_service_lz4_st *provider_service_lz4= &provider_handler_lz4; + +#if defined(__ELF__) && defined(__GNUC__) +#if 0 +struct debug_sync_service_st *debug_sync_service = + &debug_sync_handler; +#endif +struct kill_statement_service_st *thd_kill_statement_service = + &thd_kill_statement_handler; + +struct base64_service_st *base64_service = + &base64_handler; + +struct encryption_service_st *encryption_service = + &encryption_handler; + +struct encryption_scheme_service_st *encryption_scheme_service = + &encryption_scheme_handler; + +struct logger_service_st *logger_service = + &logger_service_handler; + +struct my_crypt_service_st *my_crypt_service = + &crypt_handler; + +struct my_md5_service_st *my_md5_service = + &my_md5_handler; + +struct my_print_error_service_st *my_print_error_service = + &my_print_error_handler; + +struct my_sha1_service_st *my_sha1_service = + &my_sha1_handler; + +struct my_sha2_service_st *my_sha2_service = + &my_sha2_handler; + +struct my_snprintf_service_st *my_snprintf_service = + &my_snprintf_handler; + +struct progress_report_service_st *progress_report_service = + &progress_report_handler; + +struct thd_alloc_service_st *thd_alloc_service = + &thd_alloc_handler; + +struct thd_autoinc_service_st *thd_autoinc_service = + &thd_autoinc_handler; + +struct thd_error_context_service_st *thd_error_context_service = + &thd_error_context_handler; + +struct thd_rnd_service_st *thd_rnd_service = + &thd_rnd_handler; + +struct thd_specifics_service_st *thd_specifics_service = + &thd_specifics_handler; + +struct thd_timezone_service_st *thd_timezone_service = + &thd_timezone_handler; + +struct thd_wait_service_st *thd_wait_service = + &thd_wait_handler; + +struct wsrep_service_st *wsrep_service = + &wsrep_handler; + +struct json_service_st *json_service = + &json_handler; + +struct sql_service_st *sql_service = + &sql_service_handler; + +struct thd_mdl_service_st *thd_mdl_service = + &thd_mdl_handler; + +struct print_check_msg_service_st *print_check_msg_service = + &print_check_msg_handler; + +#else static struct st_service_ref list_of_services[]= { { "base64_service", VERSION_base64, &base64_handler }, @@ -368,3 +447,4 @@ static struct st_service_ref list_of_services[]= { "provider_service_lzo", VERSION_provider_lzo, &provider_handler_lzo }, { "provider_service_snappy", VERSION_provider_snappy, &provider_handler_snappy } }; +#endif