From patchwork Fri Jun 11 15:33:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 43835 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 668B8398B854 for ; Fri, 11 Jun 2021 15:34:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 668B8398B854 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623425670; bh=nHM642hA4+vHF1FqEEH0921UM67phOhZB8+ouDte0xs=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=ECVi54TtKAcfyK3HBWw8C5JjF8xhpbEHeHSgkda3XXiZAuEjV8mUmkQ9ybDrDXC5n bkT0f8fypwU2Sg1kbSpb9MIMElnFvgkEXJbW/bcfMrMVU/Mo8CJubiuXWjJvHyTwHQ t2dwL0NBDif6ODC7BAQ7b5fC3GP/09BcI3HuiyPE= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by sourceware.org (Postfix) with ESMTPS id 34204399BC07 for ; Fri, 11 Jun 2021 15:34:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 34204399BC07 Received: by mail-qv1-xf49.google.com with SMTP id if5-20020a0562141c45b029021fee105740so18671787qvb.9 for ; Fri, 11 Jun 2021 08:34:24 -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=nHM642hA4+vHF1FqEEH0921UM67phOhZB8+ouDte0xs=; b=l7tSMgoovCudEWEHhnVxmoNQGkjGq0PCVa/CCOyqUklMToQiAIfp6uUi/aVtFdi9T6 zvFAZeoP4Ia0c39DveTrJldF0fKX7FJkjhOIOxJcBt3alxoWn8s08zd8PS3QnCit5+Mg 9accND3sAq3fm8ffwNpk+9xNu6nv/CVbSr/k98P/D5mhc3nSRmwshmcmvcJ2u4+WnsMe t9OxKM1TMe9BEMKmUTtDLXNangVK0Oe8LIEmvpfgQSvCF0fLIXGVyVQD2FAEJACLRqwC L9N49na8+NYA+k3DtroCXMG8r1zUWj6XMTq5kvDUzH0r0glHubuPDiA8d/RdXeigPKaZ Db6A== X-Gm-Message-State: AOAM530xvAuzjdNwSeQ4xEL72knxUl2YC0XxbCr+FqwibAkbSq1La0t8 QKDAuhXueqWOcIYAdTEckP65rHQjh6TMn+xCykaWyL6M3LrtW+tDPfG8h9oIxx6hR12PS4g7ixP CMN3FnPPljWmqDAZzi2dBGd0VAm+rtRiBFZWvQ+Hwzwoz3FNWUgGyas5RK+YDFMGMuag6w0M= X-Google-Smtp-Source: ABdhPJxG2j2DvMVDr6bmymMGfNpA7Pb2SBsgpqfpxGxwR5Slq05DymGRIvZEfnih8fd9WXcf+xrBGdw9F9SMwQ== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:210:c264:c1f9:cf3c:2c0b]) (user=gprocida job=sendgmr) by 2002:a0c:c3d1:: with SMTP id p17mr5359887qvi.44.1623425663679; Fri, 11 Jun 2021 08:34:23 -0700 (PDT) Date: Fri, 11 Jun 2021 16:33:18 +0100 In-Reply-To: <20210611153319.778996-1-gprocida@google.com> Message-Id: <20210611153319.778996-6-gprocida@google.com> Mime-Version: 1.0 References: <20210611153319.778996-1-gprocida@google.com> X-Mailer: git-send-email 2.32.0.272.g935e593368-goog Subject: [PATCH 5/6] BTF: add btfinfo and btfdiff tools To: libabigail@sourceware.org X-Spam-Status: No, score=-22.3 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: Giuliano Procida via Libabigail From: Giuliano Procida Reply-To: Giuliano Procida Cc: teguiani@android.com, maennich@google.com, Maria Teguiani , kernel-team@android.com Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" This commit adds BTF command line tools. They are fairly thin wrappers around the core BTF functionality. The files are almost a straight copy of the originals. Changes: - Files renamed and #includes updated. * tools/Makefile.am: Compile BTF tools, conditional on C++17 and . * tools/btfdiff.cc: New utility that compares BTF information. * tools/btfinfo.cc: New utility that dumps BTF information. Co-authored-by: Maria Teguiani Signed-off-by: Giuliano Procida --- tools/Makefile.am | 14 ++++++++++ tools/btfdiff.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++ tools/btfinfo.cc | 19 ++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 tools/btfdiff.cc create mode 100644 tools/btfinfo.cc diff --git a/tools/Makefile.am b/tools/Makefile.am index 648a71b5..bd310c18 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -9,6 +9,12 @@ else noinst_SCRIPTS = fedabipkgdiff endif +if ENABLE_CXX17 +if HAVE_BTF + bin_PROGRAMS += btfinfo btfdiff +endif +endif + noinst_PROGRAMS = abisym abinilint abidiff_SOURCES = abidiff.cc @@ -45,6 +51,14 @@ kmidiffdir = $(bindir) kmidiff_LDADD = $(abs_top_builddir)/src/libabigail.la kmidiff_LDFLAGS = -pthread +btfinfo_SOURCES = btfinfo.cc +btfinfodir = $(bindir) +btfinfo_LDADD = ../src/libabigail.la + +btfdiff_SOURCES = btfdiff.cc +btfdiffdir = $(bindir) +btfdiff_LDADD = ../src/libabigail.la + AM_CXXFLAGS = \ $(VISIBILITY_FLAGS) -I$(abs_top_srcdir)/include \ -I$(abs_top_srcdir)/tools -fPIC diff --git a/tools/btfdiff.cc b/tools/btfdiff.cc new file mode 100644 index 00000000..58c40e42 --- /dev/null +++ b/tools/btfdiff.cc @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// -*- mode: C++ -*- +// +// Copyright (C) 2020-2021 Google, Inc. +// +// Author: Maria Teguiani +// Author: Giuliano Procida + +#include +#include + +#include +#include + +#include "abg-btf.h" + +const int kAbiChange = 4; + +int main(int argc, char* argv[]) { + bool use_elf_symbols = true; + static option opts[]{ + {"symbols", required_argument, nullptr, 's'}, + {nullptr, 0, nullptr, 0}, + }; + auto usage = [&]() { + std::cerr << "usage: " << argv[0] << " [-s|--symbols type] file1 file2\n" + << " where type is elf (the default) or btf\n"; + return 1; + }; + auto bad_arg = [&](int ix) { + std::cerr << argv[0] << ": option '--" << opts[ix].name + << "' unrecognized argument '" << optarg << "'\n"; + return usage(); + }; + while (true) { + int ix; + int c = getopt_long(argc, argv, "s:", opts, &ix); + if (c == -1) + break; + switch (c) { + case 's': + if (!strcmp(optarg, "btf")) + use_elf_symbols = false; + else if (!strcmp(optarg, "elf")) + use_elf_symbols = true; + else + return bad_arg(ix); + break; + default: + return usage(); + } + } + if (optind + 2 != argc) + return usage(); + + const auto structs1 = abigail::btf::ReadFile(argv[optind++]); + const auto structs2 = abigail::btf::ReadFile(argv[optind++]); + const auto& map1 = structs1.GetSymbols(use_elf_symbols); + const auto& map2 = structs2.GetSymbols(use_elf_symbols); + abigail::btf::Outcomes outcomes; + auto result = abigail::btf::Type::CompareSymbols(map1, map2, outcomes); + abigail::btf::NameCache names; + abigail::btf::Seen seen; + abigail::btf::Print(result.details_, outcomes, seen, names, std::cout); + + return result.equals_ ? 0 : kAbiChange; +} diff --git a/tools/btfinfo.cc b/tools/btfinfo.cc new file mode 100644 index 00000000..dbda7945 --- /dev/null +++ b/tools/btfinfo.cc @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// -*- mode: C++ -*- +// +// Copyright (C) 2020 Google, Inc. +// +// Author: Maria Teguiani + +#include "abg-btf.h" + +int main(int argc, const char *argv[]) { + if (argc != 2) { + std::cerr << "Please specify the path to a BTF file."; + return 1; + } + + (void) abigail::btf::ReadFile(argv[1], /* verbose = */ true); + + return 0; +}