From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id 6B13D6EC56; Fri, 19 Mar 2021 17:13:44 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 6B13D6EC56 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1616163224; bh=iybVxgjvgkq+5I/sY1hwPlldiCWqm0c5X7Fqd9IgV3s=; h=To:Cc:Date:In-Reply-To:References:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=dFBI/tVAveD5nfsYjTdfJXXPu3QboKK46ErkCQyMIlFvgLgFUlEobqMk3l20tt+vx Dp3cx7hGfIEzNYipNFJyumO7GaO23OUsAZoU8ZdhOs1nq0dXr1jmMykvD2X74QJXqa JSva05bmrcELXrpVwFnItLVv4Z2cmlR3+iNtGjZ0= Received: from smtpng1.m.smailru.net (smtpng1.m.smailru.net [94.100.181.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 961A76EC56 for ; Fri, 19 Mar 2021 17:13:12 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 961A76EC56 Received: by smtpng1.m.smailru.net with esmtpa (envelope-from ) id 1lNFsF-0002rZ-QQ; Fri, 19 Mar 2021 17:13:12 +0300 To: tarantool-patches@dev.tarantool.org Cc: alexander.turenko@tarantool.org Date: Fri, 19 Mar 2021 17:13:06 +0300 Message-Id: <20210319141308.98726-2-roman.habibov@tarantool.org> X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: <20210319141308.98726-1-roman.habibov@tarantool.org> References: <20210319141308.98726-1-roman.habibov@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-7564579A: 78E4E2B564C1792B X-77F55803: 4F1203BC0FB41BD95D6E7CC48CB1F5F10D3016C09B407F8B88411E9FEB481E8E182A05F5380850409EF727FC77A3779DF164CFC5E9275FF3817EAD2C218D43ABE3744CA9267979CB X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7CE54A8686262D0D1EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006375FE8AD9F0D2764EB8638F802B75D45FF914D58D5BE9E6BC131B5C99E7648C95C81A23F326053F827171CD586738DB84F6F67B1FCDFEE2D1DA471835C12D1D9774AD6D5ED66289B5278DA827A17800CE74A95F4E53E8DCE969FA2833FD35BB23D2EF20D2F80756B5F868A13BD56FB6657A471835C12D1D977725E5C173C3A84C362968DCAA3E4B45B117882F4460429728AD0CFFFB425014E868A13BD56FB6657A7F4EDE966BC389F9E8FC8737B5C224927FB1C3B46BEE1FF089D37D7C0E48F6CCF19DD082D7633A0E7DDDDC251EA7DABAAAE862A0553A39223F8577A6DFFEA7CCC610B09C563F4C143847C11F186F3C5E7DDDDC251EA7DABCC89B49CDF41148FA8EF81845B15A4842623479134186CDE6BA297DBC24807EABDAD6C7F3747799A X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C4C7A0BC55FA0FE5FCC47072537531BC371E6C6E3E284A0DA69C4BC7AAD4AAB672B1881A6453793CE9C32612AADDFBE061C61BE10805914D3804EBA3D8E7E5B87ABF8C51168CD8EBDB63AF70AF8205D7DCDC48ACC2A39D04F89CDFB48F4795C241BDAD6C7F3747799A X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34F1ADD4D8CD3C81CEF017E7D59BFB4718B10DB853A560A464EA8EE649B3B380822B099FDDB32878B51D7E09C32AA3244CE8E32C9E2A5A602D6587DEFCB95183FB3FD9C8CA1B0515E0729B2BEF169E0186 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojyKyJYJ15DtIeJAOX8QbL8A== X-Mailru-Sender: 689FA8AB762F73936BC43F508A063822D071CC593D2763433ED0CC8F990287B40F96A0E8EF440D4CA021B31A5B48C7CFFB559BB5D741EB9609AE011F3211FEEF240331F90058701C67EA787935ED9F1B X-Mras: Ok Subject: [Tarantool-patches] [PATCH 1/3] build: export libCURL symbols X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Roman Khabibov via Tarantool-patches Reply-To: Roman Khabibov Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" 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 . --- 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)