From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 9404F3858C2F for ; Mon, 15 Aug 2022 19:32:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9404F3858C2F Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 27FJQpdc020975 for ; Mon, 15 Aug 2022 19:32:30 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3hx2cckw9y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 15 Aug 2022 19:32:29 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 27FIYILl003032 for ; Mon, 15 Aug 2022 19:32:29 GMT Received: from nam02-dm3-obe.outbound.protection.outlook.com (mail-dm3nam02lp2045.outbound.protection.outlook.com [104.47.56.45]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3hx2d86md7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 15 Aug 2022 19:32:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=duO6scnoYS69PmCoJ5wQyLraawO4E9NSnjjfGdDoxcXo3lh9GvcFb+O+sZPqL79rHaoiaieIx3hWq0Hz3PsvGrqZYE/KfiG+MsQFWYxIDFM0yLsLrKfRSB7FB8G3XzhH90bbOweQjcYwZHWdw1PvOR2zlf2uu8Y08GFZnsI4/QaZiA7I4jIogbrLz7TNmkMp70YEIpfXutT6RVNKSL1FUhlS9TmgrX09ppIpRBBNWz2miw/GH/XdXgHlaOuVWfK6JT/7hDli87YWeur1NQzsJ2+XQA17Ub3z+Z/PinvvI9r1Zr8kSg46feHc88ilCcytMYbpn7lFxBvGtlw9zS3OUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=suIbhEhlaGrQ+vmmXcyZVMLw4JXjoufWaC74Owehm/g=; b=T4n5mhp3Wl5UZR4g/Bh/RGbCg/inSbpwVw+lHH/HzXOVOdGZ8sriSygu2ityLM9uYMg0bUNC1PlDoLOwjunURfOu1rSWbqN0G1R9nC2eZFm0pXMmV4HuJjV72rDfftFzbXdbL9ZR8RwfDkiEeCmnwHa1NXym3ZebiXq4mkwYSQoGcbVzi49KA1CorOlU4cPvBIOqgaqdk+d03JupUwjQzrGYD4PULueXPVrk3MGRc+kfomL0m2T6ltEZ2gelRX5qHwxpc59ugMKGydQsp/cWhNevYppNWnhbc04x25t7geoPdUTsSeAOESgpqjf5bEzK+MprY+jHAHp8cWNZgA5uOw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by DS7PR10MB5118.namprd10.prod.outlook.com (2603:10b6:5:3b0::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.14; Mon, 15 Aug 2022 19:32:26 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::40f0:f59d:aca7:92ea]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::40f0:f59d:aca7:92ea%3]) with mapi id 15.20.5525.011; Mon, 15 Aug 2022 19:32:26 +0000 From: "Guillermo E. Martinez" To: libabigail@sourceware.org Subject: [PATCH] ctf-reader: looks for debug information in out-of-tree modules Date: Mon, 15 Aug 2022 14:32:09 -0500 Message-Id: <20220815193209.3631681-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BYAPR07CA0004.namprd07.prod.outlook.com (2603:10b6:a02:bc::17) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 34a6a245-ba42-411f-5f21-08da7ef4e26a X-MS-TrafficTypeDiagnostic: DS7PR10MB5118:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: B5MxOYTjounn8RS6PWzr8MtUxIBhoNZhVhzeZy7Ok7CDXUBfXkFKHipuG8R1E5qMPQn65rRYIJR4g7Jez9eIrFxZbComUHGfTcXBe0gWaXO9T794yBxae6ntyi1XnRx/YPH0WapgLkSAdVrPQY2uF0BImQ32KuDXISMFws1U3OXPE6ABHPaeFW6lYldllQfMJ1nKIqbXz1L1L3lJNlOMdVqVh4NHu7o3++IFGWm3PIyk9vnRWJBGrkwUEcAAsjCvAiRFCZKs+2qeJB/FG4Lj3R/dv89ljZrBELPRqqT6imiJ3TIEHY3422QkS5Yr2TdlZMJgjtCgxkEOeK7/wH/VWTwPKQ30JOl5EESz7Z65Po7Qige7ifOsW2Iwe2IItXrNqjsytwgw9vd4jS7rDIHBsIkUVgWl2hMBKNwJNxXJvilDuls1MgiE6lVBGgRMAmplJ15ROVYvZZhBq9LkpoLq24yBskTtaLeweGkRDlZ9yI5oN5P9M5Zs51Zo8uZOQwa59wO86i/0RD9Jxhkhw5rbytPAXMWfRwtcxmAsNd/aKmBZd6hv581TL42GsPY6ZdInAcu0kyAZz7+5weGsXtIdzKM51lBSP3KpxjNjeUk/IuNhMKZc5EtofYkwGcIHXT8b+wA2Jb2g2b93d7cWTbIiGfxd1VJKnveQzBL1BjSiQ3ugQo3e8QJKD8bgq5lNou2EKtsYglA+n0sMWpIweVsr1OhTolYgJfY9KUhlupdQPjI= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR10MB1407.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(396003)(346002)(136003)(366004)(376002)(39860400002)(30864003)(1076003)(38100700002)(6666004)(41300700001)(5660300002)(6512007)(52116002)(83380400001)(316002)(2616005)(2906002)(6506007)(103116003)(107886003)(6916009)(86362001)(478600001)(6486002)(186003)(66556008)(8936002)(66946007)(36756003)(4326008)(66476007)(8676002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6Rr2tRweLmpz1eRi7A514Kh9k4eXtpUb3Xpl/c+hTh6XFQMMzJ8JTr4hqPIU?= =?us-ascii?Q?WXTcR9PPbo+RrV8Z3wlCYOiiSqYIZ+mtLe5KHr0tG1bs4XyrcTk5PvmbUA6i?= =?us-ascii?Q?SS3LK/prgjbWsPY1lZwq115sYbQDiJhO4WaQ1UUbXusn4OyK6K4OwXbOSQl0?= =?us-ascii?Q?tfrgtgawul1PL20y/BOfhhIaBScCYnFWy+VA71u1bqtP4jVx97JZcKzDyBfq?= =?us-ascii?Q?n+jqLrtjqgDrbr+qkxgx5GE/tl/Al0tr5vW7BOldCL7ET1QZ4cft5EoDkyre?= =?us-ascii?Q?VeSwxIMxewKMjgv5GjT8o8i+nhbOCZF4QNXzhxzL2VQXcPgZ5cWPbEu/kQhB?= =?us-ascii?Q?lNRuIW3KcJK1XP8T3c2usHVjgCTjgq3O/AUduoqCq1Rtv+6qrgxTBVlccybI?= =?us-ascii?Q?s8kkFhUJ0fDUQQrfK98V/pt190Wsusb4zCPYDSuqgEWg1TZHMDlZsVPL3zgD?= =?us-ascii?Q?azrvCS6m0sKTHDzoA41itJ9ZgUqjWoFqytV77tvrj4C7J88JfA21NYCb01AG?= =?us-ascii?Q?5nfHxff2isC7wlIOHj8yTKEB1qWZZvom3H6uSUJWklRFXVayGzJwDBeplnJJ?= =?us-ascii?Q?iscyqOHTMY+y/zXS7EeHQ/N2tySUeojoAkLqC7oJU3Dm+MLpQccJNzCl5cpQ?= =?us-ascii?Q?g18mVFQfsjsh/3Re5W1WE7Wr76KlrSQy2QeCKTx3FqlhtxY0mxgeDyoGIsRk?= =?us-ascii?Q?M5o/GWE4y+HbmjCA3pRZiJ3JBYlH0vrFHDxfbIeeSNxc9lGr0lFjuXBpeg6B?= =?us-ascii?Q?lIWr6yFKGF55VZF7OC0kIccB05W4zs9Kg+hmetl6E5lbYSJhxB5QroXzUWB5?= =?us-ascii?Q?cxp573bDPQ1rVkgEvrtSEJ+eEsLvuxZMq5WUqSXqNrMOCLJzPaUjyjG2R7wF?= =?us-ascii?Q?UVFVi9+uBxb26LUu+TznH7ItNP9R/Y1wzffjveoIgKjkGy4k+lDuk5bVRdCC?= =?us-ascii?Q?/m7zHapPa0uIds5BHH1h5OPvgMvZml1wCXDKiSS4vAOn9YE5jj2yZfeAnnMp?= =?us-ascii?Q?X2N4FdjqFny3MGSymD0NVbpA6rj7P3BBMjPNBuyX7exByER/qyASquRI5SVg?= =?us-ascii?Q?PppDzbU2esXvcNiD1lYjCy8rCN6fGjUDp+s7cDsmJwqX6xbObCvyH03MYK9b?= =?us-ascii?Q?OkvNWLB4LW653dQF/X4YrjFVIZJr2nUNpGptEqnPQC2mVDsZQeAXAiJfvxfO?= =?us-ascii?Q?pnvRkvtRknrgr1zyErP7F5I8XJI/86uSlbH3m8EXs6dwqwFsGZv5ST0Aji8K?= =?us-ascii?Q?ysA1InvrHP7Kda9vKsWTP/0waFpdLtAhcmwKvbcedj0uw0YxuzktrOd7Nl6V?= =?us-ascii?Q?fcXI2WOuwPQWA+bIOpuIto7D14gQ2WCLigUaLwJYpHWRxUeYQXGaEzD4CK2v?= =?us-ascii?Q?ty2Cn3LgeT3aaS9H6vecxuk+VDY5B0Qv+FIoA5fL+zYVj9SaCLqJelKXkUeJ?= =?us-ascii?Q?kjvyJTptOTUktrKITR9CE3etVz6WeUxKsnWZnIs5/iltrIi2ka/Z7nrl9DFi?= =?us-ascii?Q?SXinGnaicXWUbUCV840nX87nCpda8o1TmXKQ9wcCJCPokkEqt2TxqxqUjErW?= =?us-ascii?Q?OeFj2FpncBR3Ep5tF6QOVIw1XtpdspPs8b1Hfw4bqXWPuCH9yPjTdFoN/0pk?= =?us-ascii?Q?leNYjVNhEpD41RFhqoLCVFZbf3GP7TrehYjeqkVRoGlf?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: gvfW8cs0QgVLmHFaCuUwBjBtShCFHqE9OZcv0Ek01SKOWhm4IumL4sGcgc6/h0IE+IamSWrph+egDr0mZmmiN95orFyG2rE2KKYSoJarEPysM+YovobDol2mZWltuRTMdZd5YSV59yaawDtsopD5LLPwLNaGM/ve6rBI6cOt8AUijvH0hI6/TBqCcGDoTzH4UumCn1mpGRx80OnpxVb6S2D2Qazikmo+ZM8pB19iIigBSpLigFiStCOzZ3iSp4jqCZCvMg0BAlHfQsc8CogQ2R2/KSF4seUp8i7sTzHnCT5OPNV1xSBySYNhA/AkTUKS/zcZ4CGkc5qAEbucAidzn6wXqavnmlbdMJBgfJmj2fnFIzaFhed6wocafva/f5YV6LVW0NhFfJla6TPHZwTEWbiaLSNMl/8AetkATAsGsP9zV035+h9Wasn+LyRttz4Sb4RhPKvRV0fI7IlQGluW/cUEy8vGrvpDvK/km6LywDTLAZYvyLgVo4V05vmvTdyTTXhx9h+gfSoA/aLN5Jk5fkvhSwmpP+epwAjnVX9Ia3sydiDhVhJ+6SeeYEqVMuU0kM5jQ58SVL0y1/wQk+IZxwU0iK1BK+XMhhOfIxzVlcaO9htpDTCMrwdh87lYSHqcnmPYEwaRQSnV+jDHGzWmCy29I3vRD9QTYTZjgsZVF5DmMBuXWsPGELM5GOMMG494/79uUDeH403+JSst1XY7ZrqgbYVjOegXb66Q847NZao= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 34a6a245-ba42-411f-5f21-08da7ef4e26a X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Aug 2022 19:32:26.4432 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 8PrMry+NZ+WynRzU4kjyMrwtFpqi4n2q7RqjgYiK/oJjomg5u0Q3/OHatYctUaBcsY9S6Yj38Zj+Ja1aKgFx/oGEksUrnKC62049QZAwB9c= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR10MB5118 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-08-15_08,2022-08-15_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 spamscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2208150074 X-Proofpoint-GUID: 7RgOarhd4TkGLOzCQbwIX4-irNmI0gv- X-Proofpoint-ORIG-GUID: 7RgOarhd4TkGLOzCQbwIX4-irNmI0gv- X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_40, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, LIKELY_SPAM_BODY, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-List-Received-Date: Mon, 15 Aug 2022 19:32:37 -0000 Hello libabigail team, This patch add support to extract the kABI from out-of-tree Linux Kernel modules. Please let know your thoughts. Thanks!, guillermo -- The archive `vmlinux.ctfa' contain CTF debug information for all the types used by more than one module, CTF for the core kernel and CTF for each module compiled in Linux tree directory. CTF information for out-of-tree module is not present in `vmlinux.ctfa' file, even so, the compiler can emit the `.ctf' section into the out-of-tree modules and it can be extracted by the libabigail tools. * src/abg-ctf-reader.cc (process_ctf_archive, read_corpus slurp_elf_info): Avoid looks for `vmlinux.ctfa' when we aren't processing a `cur_corpus_group_'. So CTF info is embedded in the `.ko' file. * tests/data/Makefile.am: Add test inputs and expected files. * tests/data/test-read-ctf/test-linux-module.{ko,c,abi}: Add new test input and reference kABI. * tests/test-read-ctf.cc: Add new testcase. Signed-off-by: Guillermo E. Martinez --- src/abg-ctf-reader.cc | 9 ++- tests/data/Makefile.am | 3 + .../data/test-read-ctf/test-linux-module.abi | 65 ++++++++++++++++++ tests/data/test-read-ctf/test-linux-module.c | 37 ++++++++++ tests/data/test-read-ctf/test-linux-module.ko | Bin 0 -> 26248 bytes tests/test-read-ctf.cc | 9 +++ 6 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 tests/data/test-read-ctf/test-linux-module.abi create mode 100644 tests/data/test-read-ctf/test-linux-module.c create mode 100644 tests/data/test-read-ctf/test-linux-module.ko diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc index c1ea15aa..71808f9a 100644 --- a/src/abg-ctf-reader.cc +++ b/src/abg-ctf-reader.cc @@ -1228,7 +1228,8 @@ process_ctf_archive(read_context *ctxt, corpus_sptr corp) filter.set_public_symbols(); std::string dict_name; - if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + if ((corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + && ctxt->cur_corpus_group_) { tools_utils::base_name(ctxt->filename, dict_name); @@ -1472,7 +1473,8 @@ slurp_elf_info(read_context *ctxt, ABG_ASSERT(ctxt->symtab); corp->set_symtab(ctxt->symtab); - if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + if ((corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + && ctxt->cur_corpus_group_) { status |= elf_reader::STATUS_OK; return; @@ -1613,7 +1615,8 @@ read_corpus(read_context *ctxt, elf_reader::status &status) (ctxt->cur_corpus_->get_exported_decls_builder().get()); int errp; - if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + if ((corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN) + && ctxt->cur_corpus_group_) { if (ctxt->ctfa == NULL) { diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index c7875b01..ebfce623 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -683,6 +683,9 @@ test-read-ctf/test-callback2.abi \ test-read-ctf/test-anonymous-fields.c \ test-read-ctf/test-anonymous-fields.o \ test-read-ctf/test-anonymous-fields.o.abi \ +test-read-ctf/test-linux-module.abi \ +test-read-ctf/test-linux-module.c \ +test-read-ctf/test-linux-module.ko \ \ test-annotate/test0.abi \ test-annotate/test1.abi \ diff --git a/tests/data/test-read-ctf/test-linux-module.abi b/tests/data/test-read-ctf/test-linux-module.abi new file mode 100644 index 00000000..d6bff4e1 --- /dev/null +++ b/tests/data/test-read-ctf/test-linux-module.abi @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-ctf/test-linux-module.c b/tests/data/test-read-ctf/test-linux-module.c new file mode 100644 index 00000000..4a647aa7 --- /dev/null +++ b/tests/data/test-read-ctf/test-linux-module.c @@ -0,0 +1,37 @@ +#include +#include + +int global_sym = 0; +EXPORT_SYMBOL(global_sym); +static spinlock_t my_lock; + +int testexport(void) +{ + printk("in testexport\n"); + return 0; +} + +EXPORT_SYMBOL(testexport); + +int testexport2(spinlock_t *t) +{ + printk("in testexport\n"); + return 0; +} +EXPORT_SYMBOL(testexport2); + +int hello_init(void) +{ + printk(KERN_INFO "Hello World!\n"); + return 0; +} + +void hello_exit(void) +{ + printk(KERN_INFO "Bye World!\n"); +} + +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); diff --git a/tests/data/test-read-ctf/test-linux-module.ko b/tests/data/test-read-ctf/test-linux-module.ko new file mode 100644 index 0000000000000000000000000000000000000000..c37d6e90511e7c497a5345bfbe4b03f29ed04710 GIT binary patch literal 26248 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