From patchwork Fri Jul 3 16:46:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Matthias_M=C3=A4nnich?= X-Patchwork-Id: 39901 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 84578384402F; Fri, 3 Jul 2020 16:48:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 84578384402F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1593794900; bh=DRIp3LWrjInvhX1c5Kmup81ElgrSUFnBpWtliwwxUmk=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=KQsiZJQES/RJ2eyXm2IR58RE2kLi+XZEUiveqqOezvRY+r39pJnwP7zaeBjupOZpe wJv19tUzkq+4thhNQrq4KPEp/9PQntou4EwWoZCJPEFIgNwi7iuwR7cMR6HmCTYfmj kK3nrQ+wPYVa0yiEb5QLAMeK7irjknFfzLBkBX10= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by sourceware.org (Postfix) with ESMTPS id 8F45A3844079 for ; Fri, 3 Jul 2020 16:48:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8F45A3844079 Received: by mail-wm1-x34a.google.com with SMTP id t145so35789550wmt.2 for ; Fri, 03 Jul 2020 09:48:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=DRIp3LWrjInvhX1c5Kmup81ElgrSUFnBpWtliwwxUmk=; b=nTtxjLBPmvbqztZjouL2lpSpDonAoex9xo1pxGMFQR7SzhgsDvCL4wNrkzDWuPQY3S pC/2UH24deDcdhHsGB8gAB4x0hFfG5osH0zKfRH4veNlKU5hk7AUvgnLYsGGMHFo3WDe gD/rX0c5jE/EvW8EE1iWloi6O9p6yTiS8aEJxNQi8NRyzgvehFoW6g42rUJN38YO1ZdR LxJk2MQqyM/mRcmKBre7VxolifS1XB7NbhlHjNnmHIPWvU8GIV5S492dt6776KUAF3Ib NukGHib/Dp11suhzZdT2JSYsMSKmHICyCQVEoPlX/JJG9v+ZF5YX0b0w3k575zTEpGN2 geFQ== X-Gm-Message-State: AOAM531B3zAPmMWS4OWlX5JuHZpg2vI1fihQdwHDfzcRa0Tkkyb0TvdQ VWztOxzDmqRTrApzMW+WXLPRV7dtRt/2WDp/iYswrwsWqf3RAcbdxKnlkiIRir0vLH1lW7FSz+q Edp0q+ZdY42rLbXBIBfg2msyQ+xxZo4pAOlU/UdULp+TqTkOtpCnrtv4yIp6OsdSrZ/TZNwY= X-Google-Smtp-Source: ABdhPJyn6ABl9tN1xEjEv58bKM6LF7JLmwRg975qCgtpDZp7rbTtUgJpm303CnAyhBvnvKbZdY8E0THKia9p7A== X-Received: by 2002:a05:600c:294a:: with SMTP id n10mr35929088wmd.38.1593794896656; Fri, 03 Jul 2020 09:48:16 -0700 (PDT) Date: Fri, 3 Jul 2020 18:46:49 +0200 In-Reply-To: <20200703164651.1510825-1-maennich@google.com> Message-Id: <20200703164651.1510825-20-maennich@google.com> Mime-Version: 1.0 References: <20200619214305.562-1-maennich@google.com> <20200703164651.1510825-1-maennich@google.com> X-Mailer: git-send-email 2.27.0.212.ge8ba1cc988-goog Subject: [PATCH v2 19/21] dwarf-reader/writer: consider aliases when dealing with suppressions To: libabigail@sourceware.org X-Spam-Status: No, score=-23.4 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Matthias Maennich via Libabigail From: =?utf-8?q?Matthias_M=C3=A4nnich?= Reply-To: Matthias Maennich Cc: maennich@google.com, kernel-team@android.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" When a symbol is suppressed and it happens to be the main symbol of a group of aliased symbols where another symbol is not suppressed, the dwarf reader discards the DWARF information upon reading and the writer will not be able to connect dwarf information to the aliased elf symbol. In order to address this, ensure we are not suppressing symbols (actually functions and variables) for which an alias is not suppressed. We therefore keep the DWARF information even if only a non-main symbol is asked for. Likewise, when the abg-writer is having to attach an elf-symbol-id to the DWARF collected information (for functions and variables), instead of omitting the symbol altogether, rather make use of the property of aliases and connect the dwarf information to an alias instead. This way the function dwarf information stays connected to the elf symbol that we want to track. * src/abg-dwarf-reader.cc(function_is_suppressed): Do not suppress a function for which there is an alias that is not suppressed. (variable_is_suppressed): Likewise for variables. * src/abg-writer.cc(write_elf_symbol_reference): Fall back to any aliased symbol if the main symbol is suppressed. * tests/data/Makefile.am: Add new test files. * tests/data/test-read-dwarf/test3-alias-1.so.hash.abi: New test file. * tests/data/test-read-dwarf/test3-alias-1.suppr: Likewise. * tests/data/test-read-dwarf/test3-alias-2.so.hash.abi: Likewise. * tests/data/test-read-dwarf/test3-alias-2.suppr: Likewise. * tests/data/test-read-dwarf/test3-alias-3.so.hash.abi: Likewise. * tests/data/test-read-dwarf/test3-alias-3.suppr: Likewise. * tests/data/test-read-dwarf/test3-alias-4.so.hash.abi: Likewise. * tests/data/test-read-dwarf/test3-alias-4.suppr: Likewise. * tests/test-read-dwarf.cc: Add new test cases. Reviewed-by: Giuliano Procida Signed-off-by: Matthias Maennich --- src/abg-dwarf-reader.cc | 20 ++++++++++-- src/abg-writer.cc | 5 ++- tests/data/Makefile.am | 8 +++++ .../test-read-dwarf/test3-alias-1.so.hash.abi | 14 ++++++++ .../data/test-read-dwarf/test3-alias-1.suppr | 3 ++ .../test-read-dwarf/test3-alias-2.so.hash.abi | 18 +++++++++++ .../data/test-read-dwarf/test3-alias-2.suppr | 3 ++ .../test-read-dwarf/test3-alias-3.so.hash.abi | 14 ++++++++ .../data/test-read-dwarf/test3-alias-3.suppr | 3 ++ .../test-read-dwarf/test3-alias-4.so.hash.abi | 8 +++++ .../data/test-read-dwarf/test3-alias-4.suppr | 3 ++ tests/test-read-dwarf.cc | 32 +++++++++++++++++++ 12 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 tests/data/test-read-dwarf/test3-alias-1.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test3-alias-1.suppr create mode 100644 tests/data/test-read-dwarf/test3-alias-2.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test3-alias-2.suppr create mode 100644 tests/data/test-read-dwarf/test3-alias-3.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test3-alias-3.suppr create mode 100644 tests/data/test-read-dwarf/test3-alias-4.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test3-alias-4.suppr diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index 4120b03b8ac5..d125cc980166 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -13002,8 +13002,16 @@ function_is_suppressed(const read_context& ctxt, if (!ctxt.get_function_address(function_die, fn_addr)) return true; - if (!ctxt.function_symbol_is_exported(fn_addr)) + elf_symbol_sptr symbol = ctxt.function_symbol_is_exported(fn_addr); + if (!symbol) return true; + if (!symbol->is_suppressed()) + return false; + if (symbol->has_aliases() && symbol->is_main_symbol()) + for (elf_symbol_sptr a = symbol->get_next_alias(); + !a->is_main_symbol(); a = a->get_next_alias()) + if (!a->is_suppressed()) + return false; } return suppr::function_is_suppressed(ctxt, qualified_name, @@ -13107,8 +13115,16 @@ variable_is_suppressed(const read_context& ctxt, if (!ctxt.get_variable_address(variable_die, var_addr)) return true; - if (!ctxt.variable_symbol_is_exported(var_addr)) + elf_symbol_sptr symbol = ctxt.variable_symbol_is_exported(var_addr); + if (!symbol) return true; + if (!symbol->is_suppressed()) + return false; + if (symbol->has_aliases() && symbol->is_main_symbol()) + for (elf_symbol_sptr a = symbol->get_next_alias(); + !a->is_main_symbol(); a = a->get_next_alias()) + if (!a->is_suppressed()) + return false; } return suppr::variable_is_suppressed(ctxt, qualified_name, diff --git a/src/abg-writer.cc b/src/abg-writer.cc index c5be11b26072..723db1a51256 100644 --- a/src/abg-writer.cc +++ b/src/abg-writer.cc @@ -1742,7 +1742,10 @@ write_elf_symbol_aliases(const elf_symbol& sym, ostream& out) static bool write_elf_symbol_reference(const elf_symbol& sym, ostream& o) { - o << " elf-symbol-id='" << sym.get_id_string() << "'"; + auto actual_sym = &sym; + while (actual_sym->is_suppressed() && actual_sym->has_aliases()) + actual_sym = actual_sym->get_next_alias().get(); + o << " elf-symbol-id='" << actual_sym->get_id_string() << "'"; return true; } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 054acb8c5376..54ccb103c8ab 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -411,6 +411,14 @@ test-read-dwarf/test3.c \ test-read-dwarf/test3.so \ test-read-dwarf/test3.so.abi \ test-read-dwarf/test3.so.hash.abi \ +test-read-dwarf/test3-alias-1.so.hash.abi \ +test-read-dwarf/test3-alias-1.suppr \ +test-read-dwarf/test3-alias-2.so.hash.abi \ +test-read-dwarf/test3-alias-2.suppr \ +test-read-dwarf/test3-alias-3.so.hash.abi \ +test-read-dwarf/test3-alias-3.suppr \ +test-read-dwarf/test3-alias-4.so.hash.abi \ +test-read-dwarf/test3-alias-4.suppr \ test-read-dwarf/test4.c \ test-read-dwarf/test4.so \ test-read-dwarf/test4.so.abi \ diff --git a/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi new file mode 100644 index 000000000000..1ed4b0612886 --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test3-alias-1.suppr b/tests/data/test-read-dwarf/test3-alias-1.suppr new file mode 100644 index 000000000000..b347500d4c4e --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-1.suppr @@ -0,0 +1,3 @@ +[suppress_function] + symbol_name_not_regexp = ^__foo$ + drop = true diff --git a/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi new file mode 100644 index 000000000000..50a53f97bf84 --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test3-alias-2.suppr b/tests/data/test-read-dwarf/test3-alias-2.suppr new file mode 100644 index 000000000000..b6d203d53c2b --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-2.suppr @@ -0,0 +1,3 @@ +[suppress_function] + symbol_name_regexp = ^__foo$ + drop = true diff --git a/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi new file mode 100644 index 000000000000..6de4d59b13d5 --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test3-alias-3.suppr b/tests/data/test-read-dwarf/test3-alias-3.suppr new file mode 100644 index 000000000000..66cd33a8d353 --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-3.suppr @@ -0,0 +1,3 @@ +[suppress_function] + symbol_name_not_regexp = ^foo$ + drop = true diff --git a/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi new file mode 100644 index 000000000000..b26d12f80e61 --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/data/test-read-dwarf/test3-alias-4.suppr b/tests/data/test-read-dwarf/test3-alias-4.suppr new file mode 100644 index 000000000000..25a2c437f51e --- /dev/null +++ b/tests/data/test-read-dwarf/test3-alias-4.suppr @@ -0,0 +1,3 @@ +[suppress_function] + symbol_name_not_regexp = ^_init$ + drop = true diff --git a/tests/test-read-dwarf.cc b/tests/test-read-dwarf.cc index 8502f8279241..dc11fbca2738 100644 --- a/tests/test-read-dwarf.cc +++ b/tests/test-read-dwarf.cc @@ -124,6 +124,38 @@ InOutSpec in_out_specs[] = "data/test-read-dwarf/test3.so.hash.abi", "output/test-read-dwarf/test3.so.hash.abi" }, + // suppress all except the main symbol of a group of aliases + { + "data/test-read-dwarf/test3.so", + "data/test-read-dwarf/test3-alias-1.suppr", + HASH_TYPE_ID_STYLE, + "data/test-read-dwarf/test3-alias-1.so.hash.abi", + "output/test-read-dwarf/test3-alias-1.so.hash.abi" + }, + // suppress the main symbol of a group of aliases + { + "data/test-read-dwarf/test3.so", + "data/test-read-dwarf/test3-alias-2.suppr", + HASH_TYPE_ID_STYLE, + "data/test-read-dwarf/test3-alias-2.so.hash.abi", + "output/test-read-dwarf/test3-alias-2.so.hash.abi" + }, + // suppress all except one non main symbol of a group of aliases + { + "data/test-read-dwarf/test3.so", + "data/test-read-dwarf/test3-alias-3.suppr", + HASH_TYPE_ID_STYLE, + "data/test-read-dwarf/test3-alias-3.so.hash.abi", + "output/test-read-dwarf/test3-alias-3.so.hash.abi" + }, + // suppress all symbols of a group of aliases + { + "data/test-read-dwarf/test3.so", + "data/test-read-dwarf/test3-alias-4.suppr", + HASH_TYPE_ID_STYLE, + "data/test-read-dwarf/test3-alias-4.so.hash.abi", + "output/test-read-dwarf/test3-alias-4.so.hash.abi" + }, { "data/test-read-dwarf/test4.so", "",