From patchwork Wed Nov 30 10:02:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 120350 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 98EBDA00C2; Wed, 30 Nov 2022 11:02:39 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6177B42BD9; Wed, 30 Nov 2022 11:02:36 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 2DD334014F for ; Wed, 30 Nov 2022 11:02:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669802554; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WglM4QuwOBjMByPjzcGGIOpq3TS4kzLLIBWrtI29iVg=; b=MkB+jwT4HEA8VCtwABms1BYFalx5VQTUfuNISRPWI8Omp4GwfXsbRdqiHbaKkfNd6RK+rD GV9a0+nsAByqMAwaZqAa+7hGQFnpRjbbD0f5dUCi3zaCcBuRgE9KwEw/PYC/yvMk+qsWaF zJrnIC1prtpwmKQTrKgQnkB6BHJMaR8= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-494-BELYKJUDNkaWkAbp5lOr3g-1; Wed, 30 Nov 2022 05:02:33 -0500 X-MC-Unique: BELYKJUDNkaWkAbp5lOr3g-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id ED26A3800C22; Wed, 30 Nov 2022 10:02:32 +0000 (UTC) Received: from localhost.localdomain (ovpn-192-86.brq.redhat.com [10.40.192.86]) by smtp.corp.redhat.com (Postfix) with ESMTP id 015AB492B04; Wed, 30 Nov 2022 10:02:30 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: ferruh.yigit@amd.com, stable@dpdk.org, Luca Boccassi , Thomas Monjalon , Bruce Richardson , =?utf-8?b?QWJkdWxsYWggw5Zt?= =?utf-8?b?ZXIgWWFtYcOn?= Subject: [PATCH v2] drivers: fix symbol exports when map is omitted Date: Wed, 30 Nov 2022 11:02:04 +0100 Message-Id: <20221130100204.214181-1-david.marchand@redhat.com> In-Reply-To: <20221129140032.35940-1-david.marchand@redhat.com> References: <20221129140032.35940-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org ld exports any global symbol by default if no version script is passed. As a consequence, the incriminated change let any public symbol leak out of the driver shared libraries. Hide again those symbols by providing a default map file which unexports any global symbol using a local: * catch-all statement. The checks are skipped for this default map file as it is intentionnally an empty map (see commit b67bdda86cd4 ("devtools: catch empty symbol maps")) and there is nothing else to check in this map. While at it, move Windows specific objects where needed for better readability. Fixes: 7dde9c844a37 ("drivers: omit symbol map when unneeded") Cc: stable@dpdk.org Reported-by: Luca Boccassi Signed-off-by: David Marchand Tested-by: Ferruh Yigit --- Changes since v1: - excluded drivers/version.map from maps checked by default in check-symbol-maps.sh, --- devtools/check-symbol-maps.sh | 2 +- drivers/meson.build | 70 +++++++++++++++++++---------------- drivers/version.map | 3 ++ 3 files changed, 42 insertions(+), 33 deletions(-) create mode 100644 drivers/version.map diff --git a/devtools/check-symbol-maps.sh b/devtools/check-symbol-maps.sh index 0a6062de26..8c116bfa9c 100755 --- a/devtools/check-symbol-maps.sh +++ b/devtools/check-symbol-maps.sh @@ -8,7 +8,7 @@ cd $(dirname $0)/.. export LC_ALL=C if [ $# = 0 ] ; then - set -- $(find lib drivers -name '*.map') + set -- $(find lib drivers -name '*.map' -a ! -path drivers/version.map) fi ret=0 diff --git a/drivers/meson.build b/drivers/meson.build index c4ff3ff1ba..77e92c3bce 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -206,44 +206,50 @@ foreach subpath:subdirs # now build the shared driver version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), drv_path) - implib = 'lib' + lib_name + '.dll.a' lk_deps = [] lk_args = [] - if fs.is_file(version_map) - def_file = custom_target(lib_name + '_def', - command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], - input: version_map, - output: '@0@_exports.def'.format(lib_name)) - - mingw_map = custom_target(lib_name + '_mingw', - command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], - input: version_map, - output: '@0@_mingw.map'.format(lib_name)) - - lk_deps = [version_map, def_file, mingw_map] - if is_windows - if is_ms_linker - lk_args = ['-Wl,/def:' + def_file.full_path()] - if meson.version().version_compare('<0.54.0') - lk_args += ['-Wl,/implib:drivers\\' + implib] - endif - else - lk_args = ['-Wl,--version-script=' + mingw_map.full_path()] + if not fs.is_file(version_map) + version_map = '@0@/version.map'.format(meson.current_source_dir()) + lk_deps += [version_map] + else + lk_deps += [version_map] + if not is_windows and developer_mode + # on unix systems check the output of the + # check-symbols.sh script, using it as a + # dependency of the .so build + lk_deps += custom_target(lib_name + '.sym_chk', + command: [check_symbols, version_map, '@INPUT@'], + capture: true, + input: static_lib, + output: lib_name + '.sym_chk') + endif + endif + + if is_windows + if is_ms_linker + def_file = custom_target(lib_name + '_def', + command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], + input: version_map, + output: '@0@_exports.def'.format(lib_name)) + lk_deps += def_file + + lk_args = ['-Wl,/def:' + def_file.full_path()] + if meson.version().version_compare('<0.54.0') + implib = 'lib' + lib_name + '.dll.a' + lk_args += ['-Wl,/implib:drivers\\' + implib] endif else - lk_args = ['-Wl,--version-script=' + version_map] - if developer_mode - # on unix systems check the output of the - # check-symbols.sh script, using it as a - # dependency of the .so build - lk_deps += custom_target(lib_name + '.sym_chk', - command: [check_symbols, version_map, '@INPUT@'], - capture: true, - input: static_lib, - output: lib_name + '.sym_chk') - endif + mingw_map = custom_target(lib_name + '_mingw', + command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], + input: version_map, + output: '@0@_mingw.map'.format(lib_name)) + lk_deps += [mingw_map] + + lk_args = ['-Wl,--version-script=' + mingw_map.full_path()] endif + else + lk_args = ['-Wl,--version-script=' + version_map] endif shared_lib = shared_library(lib_name, sources, diff --git a/drivers/version.map b/drivers/version.map new file mode 100644 index 0000000000..78c3585d7c --- /dev/null +++ b/drivers/version.map @@ -0,0 +1,3 @@ +DPDK_23 { + local: *; +};