[Tarantool-patches] [PATCH] build: don't re-export libcurl.so/dylib symbols
Alexander V. Tikhonov
avtikhon at tarantool.org
Wed Dec 30 08:23:57 MSK 2020
Hi Alexander, thanks for the patch, as I see no new degradation found in
gitlab-ci testing commit criteria pipeline [1], patch LGTM.
[1] - https://gitlab.com/tarantool/tarantool/-/pipelines/235694227
On Wed, Dec 30, 2020 at 07:53:42AM +0300, Alexander Turenko wrote:
> Export libcurl's symbols only when they are provided by tarantool
> itself: when the library is linked statically into the tarantool's
> executable. There is no much sense to export the symbols when we link
> against the library dynamically.
>
> Regarding motivation of the change. Since 2.6.0-36-g29ec62891 ('Ensure
> all curl symbols are exported') the curl_multi_poll() function is
> exported from the tarantool executable. It leads to a failure in
> Homebrew's build, because there we link (dynamically) with a system
> libcurl. On Mac OS 10.15 it is libcurl 7.64.1, while the function
> appears since libcurl 7.66.0. So a linker reports the undefined symbol:
> `curl_multi_poll`.
>
> Now the symbols are not exported at dynamic linking with libcurl, so the
> linker is happy.
>
> This commit relaxes bounds for dynamic linking, but an attempt to link
> with libcurl older than 7.66.0 statically still leads to a linking
> failure. The box-tap/gh-5223-curl-exports.test.lua test still fails when
> tarantool is linked (dynamically) against an old libcurl.
>
> It looks as the good compromise. When libcurl functionality is provided
> by tarantool itself, *all* functions listed in the test are present
> (otherwise a linker will complain). But tarantool does not enforce a
> newer libcurl version, when it just *uses* this functionality and don't
> provide it for modules and stored procedured. It is not tarantool's
> responsibility in the case.
>
> We possibly should skip the box-tap/gh-5223-curl-exports.test.lua test
> when tarantool is built against libcurl dynamically or revisit the
> described approach. I'll leave it as possible follow up activity.
>
> Fixes #5542
> ---
>
> https://github.com/tarantool/tarantool/issues/5542
> https://github.com/tarantool/tarantool/tree/Totktonada/gh-5542-dont-export-libcurl-so-symbols
> Totktonada/gh-5542-dont-export-libcurl-so-symbols
>
> CMakeLists.txt | 10 ++++++++++
> src/exports.c | 2 ++
> src/exports.h | 2 ++
> src/trivia/config.h.cmake | 2 ++
> 4 files changed, 16 insertions(+)
>
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index f0e1f5090..4fbd19558 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -397,6 +397,16 @@ else()
> find_package(CURL)
> endif()
>
> +#
> +# Export libcurl symbols if the library is linked statically.
> +#
> +if (ENABLE_BUNDLED_LIBCURL OR BUILD_STATIC)
> + set(EXPORT_LIBCURL_SYMBOLS ON)
> +else()
> + set(EXPORT_LIBCURL_SYMBOLS OFF)
> +endif()
> +message(STATUS "EXPORT_LIBCURL_SYMBOLS: ${EXPORT_LIBCURL_SYMBOLS}")
> +
> #
> # ReadLine
> #
> diff --git a/src/exports.c b/src/exports.c
> index a3c27143e..2a9c296a8 100644
> --- a/src/exports.c
> +++ b/src/exports.c
> @@ -88,6 +88,8 @@
> * below. But automatically.
> */
>
> +#include "trivia/config.h"
> +
> /**
> * Symbol is just an address. No need to know its definition or
> * even type to get that address. Even an integer global variable
> diff --git a/src/exports.h b/src/exports.h
> index 2116036fa..1b95e75f6 100644
> --- a/src/exports.h
> +++ b/src/exports.h
> @@ -130,6 +130,7 @@ EXPORT(csv_feed)
> EXPORT(csv_iterator_create)
> EXPORT(csv_next)
> EXPORT(csv_setopt)
> +#ifdef EXPORT_LIBCURL_SYMBOLS
> EXPORT(curl_easy_cleanup)
> EXPORT(curl_easy_duphandle)
> EXPORT(curl_easy_escape)
> @@ -211,6 +212,7 @@ EXPORT(curl_url_get)
> EXPORT(curl_url_set)
> EXPORT(curl_version)
> EXPORT(curl_version_info)
> +#endif /* EXPORT_LIBCURL_SYMBOLS */
> EXPORT(decimal_unpack)
> EXPORT(error_ref)
> EXPORT(error_set_prev)
> diff --git a/src/trivia/config.h.cmake b/src/trivia/config.h.cmake
> index 21efb978e..38f8eb4dc 100644
> --- a/src/trivia/config.h.cmake
> +++ b/src/trivia/config.h.cmake
> @@ -258,6 +258,8 @@
>
> #cmakedefine ENABLE_FEEDBACK_DAEMON 1
>
> +#cmakedefine EXPORT_LIBCURL_SYMBOLS 1
> +
> /*
> * vim: syntax=c
> */
> --
> 2.25.0
>
More information about the Tarantool-patches
mailing list