[Tarantool-patches] [PATCH 1/3] build: export libCURL symbols
Бабин Олег
olegrok at tarantool.org
Thu Mar 18 14:33:53 MSK 2021
Hi! Thanks for your patch. This patch was followed [1], so maybe it's better to include it in this patchset.
[1] https://github.com/tarantool/tarantool/commit/0bb2c945aaef2830b7951eaaa0c4b02a08b80443
On 18.03.2021 11:51, Roman Khabibov via Tarantool-patches wrote:
>Export the symbols to tarantool executable in the case of libCURL
>included as bundled library or static build.
>
>This patch is just 1.10 adaptation of the original commit 9fc57c4
>performed by Yaroslav Dynnikov <yaroslav.dynnikov at gmail.com>.
>---
> CMakeLists.txt | 10 +++
> extra/curl_symbols | 81 ++++++++++++++++++
> extra/mkexports | 20 ++++-
> src/CMakeLists.txt | 5 +-
> test/box-tap/curl-exports.test.lua | 131 +++++++++++++++++++++++++++++
> 5 files changed, 242 insertions(+), 5 deletions(-)
> create mode 100755 extra/curl_symbols
> create mode 100755 test/box-tap/curl-exports.test.lua
>
>diff --git a/CMakeLists.txt b/CMakeLists.txt
>index 84e019eb0..5990d026e 100644
>--- a/CMakeLists.txt
>+++ b/CMakeLists.txt
>@@ -347,6 +347,16 @@ else()
> find_package(CURL)
> endif()
>
>+#
>+# Export libcurl symbols if the library is bundled.
>+#
>+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/extra/curl_symbols b/extra/curl_symbols
>new file mode 100755
>index 000000000..89e247a00
>--- /dev/null
>+++ b/extra/curl_symbols
>@@ -0,0 +1,81 @@
>+curl_easy_cleanup
>+curl_easy_duphandle
>+curl_easy_escape
>+curl_easy_getinfo
>+curl_easy_init
>+curl_easy_pause
>+curl_easy_perform
>+curl_easy_recv
>+curl_easy_reset
>+curl_easy_send
>+curl_easy_setopt
>+curl_easy_strerror
>+curl_easy_unescape
>+curl_easy_upkeep
>+curl_escape
>+curl_formadd
>+curl_formfree
>+curl_formget
>+curl_free
>+curl_getdate
>+curl_getenv
>+curl_global_cleanup
>+curl_global_init
>+curl_global_init_mem
>+curl_global_sslset
>+curl_maprintf
>+curl_mfprintf
>+curl_mime_addpart
>+curl_mime_data
>+curl_mime_data_cb
>+curl_mime_encoder
>+curl_mime_filedata
>+curl_mime_filename
>+curl_mime_free
>+curl_mime_headers
>+curl_mime_init
>+curl_mime_name
>+curl_mime_subparts
>+curl_mime_type
>+curl_mprintf
>+curl_msnprintf
>+curl_msprintf
>+curl_multi_add_handle
>+curl_multi_assign
>+curl_multi_cleanup
>+curl_multi_fdset
>+curl_multi_info_read
>+curl_multi_init
>+curl_multi_perform
>+curl_multi_poll
>+curl_multi_remove_handle
>+curl_multi_setopt
>+curl_multi_socket
>+curl_multi_socket_action
>+curl_multi_socket_all
>+curl_multi_strerror
>+curl_multi_timeout
>+curl_multi_wait
>+curl_mvaprintf
>+curl_mvfprintf
>+curl_mvprintf
>+curl_mvsnprintf
>+curl_mvsprintf
>+curl_pushheader_byname
>+curl_pushheader_bynum
>+curl_share_cleanup
>+curl_share_init
>+curl_share_setopt
>+curl_share_strerror
>+curl_slist_append
>+curl_slist_free_all
>+curl_strequal
>+curl_strnequal
>+curl_unescape
>+curl_url
>+curl_url_cleanup
>+curl_url_dup
>+curl_url_get
>+curl_url_set
>+curl_version
>+curl_version_info
>diff --git a/extra/mkexports b/extra/mkexports
>index 145e5b8ce..2a3cd8401 100755
>--- a/extra/mkexports
>+++ b/extra/mkexports
>@@ -2,22 +2,36 @@
> # $1 - in file
> # $2 - out file
> # $3 - os
>-# $4 - export templates
>+# $4 - is bundled curl on/off flag
>+# $5 - curl symbols
>+# $6 - export templates
>+echo "$1"
>+echo "$2"
>+echo "$3"
>+echo "$4"
>+echo "$5"
>+echo "$6"
> if [ "x$3x" = xDarwinx ]; then
> # _func1
> # _func2
> sed -e 's/#.*//; /^[[:space:]]*$/d; s/^/_/;' $1 > $2
>+ if [ "x$4x" = xONx ]; then
>+ sed -e 's/#.*//; /^[[:space:]]*$/d; s/^/_/;' $5 >> $2
>+ fi
> else
> # {
> # func1;
> # func2;
> # };
>- echo "$4"
>+ echo "$6"
> ( echo "{" && {
> # combine static defined list of functions
> cat $1 ;
> # with list of exported functions of bundled libraries
>- for so in $4 ; do {
>+ if [ "x$4x" = xONx ]; then
>+ cat $5
>+ fi ;
>+ for so in $6 ; do {
> # exported names from shared object
> nm -D $so ||
> # or follow patch from shared object script
>diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
>index 04289af3d..ee968820b 100644
>--- a/src/CMakeLists.txt
>+++ b/src/CMakeLists.txt
>@@ -231,13 +231,12 @@ target_link_libraries(server core bit uri uuid ${ICU_LIBRARIES})
> # Rule of thumb: if exporting a symbol from a static library, list the
> # library here.
> set (reexport_libraries server core misc bitset csv
>- ${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES})
>+ ${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES} ${CURL_LIBRARIES})
>
> set (common_libraries
> ${reexport_libraries}
> ${LIBYAML_LIBRARIES}
> ${READLINE_LIBRARIES}
>- ${CURL_LIBRARIES}
> ${ICONV_LIBRARIES}
> ${OPENSSL_LIBRARIES}
> )
>@@ -310,6 +309,8 @@ add_custom_command(
> COMMAND ${CMAKE_SOURCE_DIR}/extra/mkexports
> ${CMAKE_SOURCE_DIR}/extra/exports
> ${exports_file} ${CMAKE_SYSTEM_NAME}
>+ ${EXPORT_LIBCURL_SYMBOLS}
>+ ${CMAKE_SOURCE_DIR}/extra/curl_symbols
> ${EXPORT_LIST}
> )
>
>diff --git a/test/box-tap/curl-exports.test.lua b/test/box-tap/curl-exports.test.lua
>new file mode 100755
>index 000000000..a8bb1a042
>--- /dev/null
>+++ b/test/box-tap/curl-exports.test.lua
>@@ -0,0 +1,131 @@
>+#!/usr/bin/env tarantool
>+
>+local tap = require('tap')
>+local ffi = require('ffi')
>+ffi.cdef([[
>+ void *dlsym(void *handle, const char *symbol);
>+ struct curl_version_info_data {
>+ int age; /* see description below */
>+ const char *version; /* human readable string */
>+ unsigned int version_num; /* numeric representation */
>+ const char *host; /* human readable string */
>+ int features; /* bitmask, see below */
>+ char *ssl_version; /* human readable string */
>+ long ssl_version_num; /* not used, always zero */
>+ const char *libz_version; /* human readable string */
>+ };
>+]])
>+
>+local test = tap.test('curl-symbols')
>+test:plan(1)
>+
>+local RTLD_DEFAULT
>+-- See `man 3 dlsym`:
>+-- RTLD_DEFAULT
>+-- Find the first occurrence of the desired symbol using the default
>+-- shared object search order. The search will include global symbols
>+-- in the executable and its dependencies, as well as symbols in shared
>+-- objects that were dynamically loaded with the RTLD_GLOBAL flag.
>+if jit.os == "OSX" then
>+ RTLD_DEFAULT = ffi.cast("void *", -2LL)
>+else
>+ RTLD_DEFAULT = ffi.cast("void *", 0LL)
>+end
>+
>+-- The following list was obtained by parsing libcurl.a static library:
>+-- nm libcurl.a | grep -oP 'T \K(curl_.+)$' | sort
>+local curl_symbols = {
>+ 'curl_easy_cleanup',
>+ 'curl_easy_duphandle',
>+ 'curl_easy_escape',
>+ 'curl_easy_getinfo',
>+ 'curl_easy_init',
>+ 'curl_easy_pause',
>+ 'curl_easy_perform',
>+ 'curl_easy_recv',
>+ 'curl_easy_reset',
>+ 'curl_easy_send',
>+ 'curl_easy_setopt',
>+ 'curl_easy_strerror',
>+ 'curl_easy_unescape',
>+ 'curl_easy_upkeep',
>+ 'curl_escape',
>+ 'curl_formadd',
>+ 'curl_formfree',
>+ 'curl_formget',
>+ 'curl_free',
>+ 'curl_getdate',
>+ 'curl_getenv',
>+ 'curl_global_cleanup',
>+ 'curl_global_init',
>+ 'curl_global_init_mem',
>+ 'curl_global_sslset',
>+ 'curl_maprintf',
>+ 'curl_mfprintf',
>+ 'curl_mime_addpart',
>+ 'curl_mime_data',
>+ 'curl_mime_data_cb',
>+ 'curl_mime_encoder',
>+ 'curl_mime_filedata',
>+ 'curl_mime_filename',
>+ 'curl_mime_free',
>+ 'curl_mime_headers',
>+ 'curl_mime_init',
>+ 'curl_mime_name',
>+ 'curl_mime_subparts',
>+ 'curl_mime_type',
>+ 'curl_mprintf',
>+ 'curl_msnprintf',
>+ 'curl_msprintf',
>+ 'curl_multi_add_handle',
>+ 'curl_multi_assign',
>+ 'curl_multi_cleanup',
>+ 'curl_multi_fdset',
>+ 'curl_multi_info_read',
>+ 'curl_multi_init',
>+ 'curl_multi_perform',
>+ 'curl_multi_poll',
>+ 'curl_multi_remove_handle',
>+ 'curl_multi_setopt',
>+ 'curl_multi_socket',
>+ 'curl_multi_socket_action',
>+ 'curl_multi_socket_all',
>+ 'curl_multi_strerror',
>+ 'curl_multi_timeout',
>+ 'curl_multi_wait',
>+ 'curl_mvaprintf',
>+ 'curl_mvfprintf',
>+ 'curl_mvprintf',
>+ 'curl_mvsnprintf',
>+ 'curl_mvsprintf',
>+ 'curl_pushheader_byname',
>+ 'curl_pushheader_bynum',
>+ 'curl_share_cleanup',
>+ 'curl_share_init',
>+ 'curl_share_setopt',
>+ 'curl_share_strerror',
>+ 'curl_slist_append',
>+ 'curl_slist_free_all',
>+ 'curl_strequal',
>+ 'curl_strnequal',
>+ 'curl_unescape',
>+ 'curl_url',
>+ 'curl_url_cleanup',
>+ 'curl_url_dup',
>+ 'curl_url_get',
>+ 'curl_url_set',
>+ 'curl_version',
>+ 'curl_version_info',
>+}
>+
>+test:test('curl_symbols', function(t)
>+ t:plan(#curl_symbols)
>+ for _, sym in ipairs(curl_symbols) do
>+ t:ok(
>+ ffi.C.dlsym(RTLD_DEFAULT, sym) ~= nil,
>+ ('Symbol %q found'):format(sym)
>+ )
>+ end
>+end)
>+
>+os.exit(test:check() and 0 or 1)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20210318/0ddecce6/attachment.htm>
More information about the Tarantool-patches
mailing list