[Tarantool-patches] [PATCH 1/3] build: export libCURL symbols
Roman Khabibov
roman.habibov at tarantool.org
Fri Mar 19 17:13:06 MSK 2021
Export the symbols to tarantool executable in the case of libCURL
included as bundled library.
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 | 14 +++-
src/CMakeLists.txt | 5 +-
test/box-tap/curl-build.test.lua | 124 +++++++++++++++++++++++++++++++
5 files changed, 229 insertions(+), 5 deletions(-)
create mode 100755 extra/curl_symbols
create mode 100755 test/box-tap/curl-build.test.lua
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 84e019eb0..7e2ddb503 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)
+ 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..c10f20ae4 100755
--- a/extra/mkexports
+++ b/extra/mkexports
@@ -2,22 +2,30 @@
# $1 - in file
# $2 - out file
# $3 - os
-# $4 - export templates
+# $4 - is bundled curl on/off flag
+# $5 - curl symbols
+# $6 - export templates
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-build.test.lua b/test/box-tap/curl-build.test.lua
new file mode 100755
index 000000000..ab58efffa
--- /dev/null
+++ b/test/box-tap/curl-build.test.lua
@@ -0,0 +1,124 @@
+#!/usr/bin/env tarantool
+
+local tap = require('tap')
+local ffi = require('ffi')
+ffi.cdef([[
+ void *dlsym(void *handle, const char *symbol);
+]])
+
+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',
+}
+
+--
+-- Check if all curl symbols are exported.
+--
+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)
--
2.24.3 (Apple Git-128)
More information about the Tarantool-patches
mailing list