This is a subset of WL#3859 which provides the automatic versioning protection for plugins that use server functionality. It allows server to create services and plugins to use them. Automatic version checks and dynamic linking on load is implemented. Manual load (using get_service) with version negotiation is not. Reference counting is not implemented either - it's only needed when plugins will *provide* services, not *use* them. Now all services are statically compiled into the server. Thus no service needs to be "released", and releasing is not implemented either.
Services will be declared in include/mysql/service_XXX.h files. To avoid a long list of #include's in plugin.h (to keep plugin.h readable), plugin.h will include services.h, which, in turn, will include all service_XXX.h files. All service declarations will be controlled by abi_check rule (indirectly, via plugin.h.pp). Service versions will be in include/service_versions.h (this file shouldn't be installed on a target system), as a list of defines - one per service. Symbols with the versions that will be replaced by pointers to the real services (see WL#3859) will be in a libservices.a, which will be in libservices/. It's crucial to have one file per service there. Services will be defined in sql/sql_plugin_services.h, which will be included into sql/sql_plugin.cc An example service will be implemented - "my_snprintf" service, which provides my_snprintf and my_vsnprintf. daemon plugin will make use of it.