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 05D9C385840F for ; Thu, 23 Feb 2023 18:42:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 05D9C385840F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 31NGwi7c003682 for ; Thu, 23 Feb 2023 18:42:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2022-7-12; bh=XJX6M1j463RIQS3a6zIVDqwA6A/X4L1GpeAGVoMTiH8=; b=Z/weJY8HMeMYZQNz7KcAX6Xmq9wYdTy2KJJVYL+aNKNZzvQ+zq1E4LLRnVhtV6TyDa+N M7ngnMVfavD1bshjbecssWAjE8zukeqCEOSpROXFtRpt10MFteU3Dv4mEUhfJ4rOGwQE hbPQVAgxlUnLziFhX1Vp0XEY3VDxXaUSJkR+jHcTnGlg4uPxeVIWSMTCKBF2E1o6mNYq R5Hzt/vCGhBf9rI5uu0vYvBNc+tyB3kXx9VQdgAPl4pe36T5M8FZk+uKcTyFoo+5m1ao gXQZ/sM49Yya7IFLDrHEykHceTWRJI3ilXK971qTzGSvAzQZDlIhVbP6tSI8nutosJP+ zQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3ntn3dubj3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 23 Feb 2023 18:42:45 +0000 Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 31NIESD6033980 for ; Thu, 23 Feb 2023 18:42:44 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2169.outbound.protection.outlook.com [104.47.56.169]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ntn4fsu24-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 23 Feb 2023 18:42:44 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JmLvDJJEiqRlfDmFkMGsmNzib96/aVPvd6mfcKryEPwEdIFvuQjCmVpH5e3l4h9IIU9qVhDcg5Agps9xvG+L1khTjhbxxy3brlR9kswR5JaeqPSqnOQPwZhYqbdYJqlAS+w5CmUpJ9bNhuHKOXmigqDchVEj1fn7nQkIc6WWPNYqi8iK1O2FqRsdkkwar6dLRHqquTvahiD2XTI5FRvvvueBpsr+KOeHgZARnw5jvI7km1I5GyG2L36FFYw2SYQgEptZbCqr6flC5vgeCEbxoy/VkrgYr3EBdWJWapXh5UE3IjGFNjgPuXR8s900ql1VqvYVHoIMq/j5uxgAcIzmIw== 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=XJX6M1j463RIQS3a6zIVDqwA6A/X4L1GpeAGVoMTiH8=; b=Ugj7Pp0rnfwt4BYnDCh7/3clWs6RvBx2NdFEbNYioIInOIddPB7dq8JrsuJ/70QEt2VvNmBQX+WQzBtNd38GojEOoK1cGg8Zg3aZfwd9Q0SDzwGxRU6hvHNeBESLCTjXDn7uK6j0tzoR60tIdzzTbhctHCNDbfeK3hgqfZJxQXJWOplFqEJcLiIUO8MzAzVlSuMlIWAF3i5+m/+MKGFomemQVUbbCfubHe68GetsI2ZkV+gtY4jKwYwNHBALigtD9pIG4KIwji2HskuSJ+EcjaVvsm8fXcl8hy4637oYqUBbaV3hOj/CM+D3R13WVuLgiU+BbjQRBTHziU172MC0bg== 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XJX6M1j463RIQS3a6zIVDqwA6A/X4L1GpeAGVoMTiH8=; b=oaSEK8sVgERVf3OUz36O5aas4ZuPWxv+t9MN5tBam+uPvZuL0HSfXEO+uPYFQXXZ9w2bBxQ6buiQ3ns2eMAswZjgvwRE9jjvPj5+a8v+j2isMW+kXlxg9U1sOCoWjpeZ4sHq/1c5NNifWdyfKaTeV2yAoztpIJTqjiOMOHOXCFg= Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by DS7PR10MB7278.namprd10.prod.outlook.com (2603:10b6:8:d8::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6134.15; Thu, 23 Feb 2023 18:42:41 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::480f:b0b1:2e28:546e]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::480f:b0b1:2e28:546e%7]) with mapi id 15.20.6156.007; Thu, 23 Feb 2023 18:42:41 +0000 From: "Guillermo E. Martinez" To: elfutils-devel@sourceware.org Cc: "Guillermo E. Martinez" Subject: [PATCH v3] strip: keep .ctf section in stripped file Date: Thu, 23 Feb 2023 12:42:37 -0600 Message-Id: <20230223184237.240615-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20220601155527.2192182-1-guillermo.e.martinez@oracle.com> References: <20220601155527.2192182-1-guillermo.e.martinez@oracle.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SA0PR12CA0020.namprd12.prod.outlook.com (2603:10b6:806:6f::25) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR10MB1407:EE_|DS7PR10MB7278:EE_ X-MS-Office365-Filtering-Correlation-Id: 591ec8a3-08ef-45ab-dcd9-08db15cdbe86 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BedCoJSIqGLEdeS73Oa9kL2KV8Aj8wfXFYoBT4Q6yYRxx0AkMQIKAd9lTTzzTeJ0dy6OAwqYF+jgyjT9rMmNmMcG+99F5BmkxU4xLAvJHBEaaUNcalGZW4mCl9IJJ8cpD/tXE8YWEuOWTlWAvgRAlkoMSN6KiBWaS0Cu1EeB/5TLjy5K8Eqp0euAGmem0Ize8oWMAoClzygmBjBJcGqv0IpO8IhaEmtmVd/MdC272xkn1IlpaMvu5/t67jGh9pVmQgOnyQUd0+ALmVAb/NCyHTpJMd2G9ySBexgfQ2iQfDi1ekV4HsDBTkIun+kKXzQGQ+I7bprvWvWdHOCP7wjTnmnWwAD60CKNL80C9AZXR9WuIjoKVP7TPXe4VJLcWm1GdfrS+jmJGZErfpVw/uMWYiaMcx2yCRCxmkZhnI2+ffcx6JxMnN62GPGmCgeqDaAqHHI/gNvwcORP33tEck2AGLDzKyf8/b2vs27oZUzsGFtjEaBkVUeHAoa35YrBw1NLYMhazyPmBwtxp1yoBrvhj3DpAxswWV9KJDni0EAaktXuYNyGfHzeQBC5mKX49oAhnQgOlvfshttYpf0x4JUUPu081r+NHmHjCJjgNzNzx5TCXOqSB804xWLwsRStB88v5NYN6/PsKT/+b99QHrxBfsPVmzkMWiwMj3kAAAlPNB8x3rSJHuW9yBEylSHDWZiE51B9lEqwqGIoA2HxrQcHcA== 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:(13230025)(136003)(346002)(39860400002)(396003)(376002)(366004)(451199018)(1076003)(36756003)(66946007)(6506007)(41300700001)(6512007)(66556008)(8936002)(186003)(8676002)(66476007)(4326008)(6916009)(2616005)(86362001)(103116003)(83380400001)(5660300002)(30864003)(6666004)(478600001)(316002)(107886003)(6486002)(2906002)(38100700002)(142923001)(2004002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+Vcmbol5Xj9a/M9fGe+nDarcSrXc1hxQgaVpwfak9szgg2gA4tFuUbIEotel?= =?us-ascii?Q?P+Bzpl7tx18XJwxV+K3JuUCCqSnO2HzAbGCLF54xs87iE9Z20UGgaZYhPmI6?= =?us-ascii?Q?udI0lMbVQf48O0sn+KEkY46aXSLTpM0rQ4wl4S6LsMucDPNm2Lz9s+/tR1+3?= =?us-ascii?Q?TrOxVFzdJ11uCHs1AaRdqgzcrJFUnXhBCYftr5YOWrxc74tNnwJHuAl43fwt?= =?us-ascii?Q?HUYjfn5XIhfAoIVGN45cZl+VaX3pdvsXgj6sqJhBWvycr6psv7ASUJmgNyxP?= =?us-ascii?Q?anLPTQI5SWkHYEiXZ1z1ADFrpw/mpN7/h8KRTPZegybkKdoIpfnlQfvW3uOA?= =?us-ascii?Q?L5qotdeIxc7UZU0YALHRWuCVjJ0/0N08S32aNQozgM0H/rADhWWZSnCTbbPE?= =?us-ascii?Q?jhLQO8+JxcOuvMWZ2QWWtJCsKfwaDwn13nmCdR6xMS210VUEPQMa8/70vr3A?= =?us-ascii?Q?+Eey45IX6s4zr5xrr9odd72nVX/qKD5bxcU7aY6O0pjN+cJTndJQwMZ2oZRc?= =?us-ascii?Q?NhYwzwKyi+YuBSZ0OmrZZTE5MUKZ5PHnyIO0EHfpGN5V66/Jf5qiHeS78oW1?= =?us-ascii?Q?fp95gF6XPHKrwam/ylvFv15Nq6sAGEQoLxqNcAE3EiTch2pXLWVPE+fllsiA?= =?us-ascii?Q?Hk6PI6rmACDJBKGWiqCw1+HKZF2Gy3vi+PXmKC19so26kLTnbn0UFDcWpjsS?= =?us-ascii?Q?OhcCrGTjcoaq27Fxv6CUHK+v7utvp22F/a9GKrk3nR8E+iY6cnqTBiKxwez/?= =?us-ascii?Q?AKVT1DWuXwMD+kKxlO0lC7StU+RGYylVzB7HeFBx+PTa4Qs6Fk+ptzM23jwR?= =?us-ascii?Q?/RkT40rSMdmOa37/IQyM1bztCMwMxfQlqZROAvyTP/doC2U0CK0STqWJWEgj?= =?us-ascii?Q?Bd7cdmFEmfajj/7DIK/oFT93CcFesEs4qxhUczsVWN10nXTZTq7X3YEZ0FJR?= =?us-ascii?Q?r1ZeEVA5Er+/hJFiHq+77k9HntsiSwKIfWTQ38sDKCKxoREJnapoEVIsnZ17?= =?us-ascii?Q?M38vfQDh/dFCZxvz3R7pBvB5LKAMZyW/tazAaPR6gzXHX0a0kzeT+bwPAQG+?= =?us-ascii?Q?9wXZM/o7mbBcQ2rKPmIWCl1MpEhAtP2n4ZuBU3CFKAVcZIE/PgQvrwbelo3m?= =?us-ascii?Q?/MrAp1H4KJu0cWbseBBOxp9QEXGoPvdFQwXWTwnFc3OKmjiKI2sgmREH5pFm?= =?us-ascii?Q?zeSofkVx6dDLesR91ou7gi27LlSU4Rm4NeXQCGRxFQ1d3c74EqJ53L3m9Bvc?= =?us-ascii?Q?+hYQIoboRsLJBQf7hjtuTkwAINe9w6Wayuicq43aZl+FJFeOv6BE4jcqtWKC?= =?us-ascii?Q?Zlw9iZ+4Uuss/5+BI3q9ISWsr8Ut5pFVi5UOPo6FAIX1usDFNf2O/5PPyw6q?= =?us-ascii?Q?CfCCM1pa7++Xlwp8yvnsjgyOdoudwYAC+QICzn0A01LGzY9/MIYz52J2ZgD1?= =?us-ascii?Q?VvWX2aGo5hfezVHVwtTagnTOW+KqE0yj2Cwi8znn5bwNRrTEUVKM2XhI70eC?= =?us-ascii?Q?8GUaq2T5iTQDlwmLhLj8JHT31wQuq4w245RWa11o9eLYQcDNPR1ITfL33VQC?= =?us-ascii?Q?CLvp4rhEGOL6JQzuynh3wleDPn3cGPWW0suxvYchc0U0wlmT77QTAVQBmmvp?= =?us-ascii?Q?ag/QTj5onzaeBatg6UjXMhoZLzxGFWwL2/cJtaX98lTi?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: qN3CQo/m3yx0pTqY4O3HQ6bJVrwFBOaHEB78Ohov9hmk8VXVkKGjJKj5v14atuRqLqYt8PFR5/AudtaNhUDn6KBOYVx5nnVkXEcjFlm0SFY7w5ssXurjaAXDYYB+hi4/g+GsyGcab6MP31Ln1bSLxzNLDYoTSGu1fiAJuVkMPJC0SkQjRUcDGcv8eXRyypapFpf1qnH1Y+lKJQftKxsDCMCGQJBJsR2p3kfFq7Eph9AhL9coJFXvjPTB/NI6f3BfrQNQpAlu7FEtTcSrn/ybAY84vhdZO7v+Op9+tYO7tovEZ1bXSYz42K3OcLwgWDbqZaSgNv7ybY7c0Q3fUMB8VC0tFJMHDF8b1xo9so18mRh8kai0pmwpLnsZszw/egtbwUgqu4on8jA3b8oaEKeFOqyKrAN1j2kaKDGIWA2F+vQqQ1jdAywK5Tk/E4uYo7YM5WtwoE2aUEgIYi8txbfspjFz0yZ53rkmUhP6aXye9FbX5BI6qa6UTbCeyDrvSUWo8Oj/y0Hmm2tQCuefV4laTemW2uDgzq1hO51kFZJ1Aj1Blxytth0AOivt7TEKTMuj0LBFrSTV8cIKg8lKwwZk0NzyW0p6TL27Il4BgAGZ/w+zEyOHEYbQgi3bnpc2tczhBSkF3PyV+h0gIMKjhdGw+XW4xbwM+P1KFt/6iMQaFEZSEgMg68s+SPbR6K25KAAvZ9to4r5HSUQ1vgLq36o21F5n8kfgVTZfc0a0F3ZQSmwm2L+yKtSBBwI+AbCDg59m X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 591ec8a3-08ef-45ab-dcd9-08db15cdbe86 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Feb 2023 18:42:41.4701 (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: 2AmF4bFn/3kWsqz79GL5SAssFC70PrvEIFFBGU22Do5BiNvX3cStLfpe8wKII3xcnDDzPnqpMIVpZ/ZjQbvbS/3IMPHFKNQNJAbqjz9IP4k= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR10MB7278 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.170.22 definitions=2023-02-23_12,2023-02-23_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 mlxscore=0 phishscore=0 suspectscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2302230154 X-Proofpoint-GUID: sp0gyFHfHHFLGNJrcipujoxDF06gFtyI X-Proofpoint-ORIG-GUID: sp0gyFHfHHFLGNJrcipujoxDF06gFtyI X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hello, This is the third version of the patch to avoid remove the CTF section in stripped files. Changes from v2: - Rebased from master. Please let me know your thoughts. Kind regards, guillermo -- CTF debug format was designed to be present in stripped files, so this section should not be removed, so a new --remove-ctf option is added to indicate explicitly that .ctf section will be stripped out from binary file. Signed-off-by: Guillermo E. Martinez --- ChangeLog | 23 ++++ libebl/eblsectionstripp.c | 4 +- libebl/libebl.h | 2 +- libelf/elf-knowledge.h | 7 +- libelf/elf32_checksum.c | 2 +- src/elfcmp.c | 4 +- src/strip.c | 71 ++++++++-- tests/Makefile.am | 5 +- tests/run-strip-remove-keep-ctf.sh | 212 +++++++++++++++++++++++++++++ tests/testfile-ctf.bz2 | Bin 0 -> 2620 bytes 10 files changed, 308 insertions(+), 22 deletions(-) create mode 100755 tests/run-strip-remove-keep-ctf.sh create mode 100755 tests/testfile-ctf.bz2 diff --git a/ChangeLog b/ChangeLog index 53a1d292..eed54421 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2023-02-23 Guillermo E. Martinez + + * libebl/eblsectionstripp.c (ebl_section_strip_p): Use + remove_ctf argument. + (SECTION_STRIP_P): Likewise. + * libebl/libebl.h (ebl_section_strip_p): Likewise. + * libelf/elf-knowledge.h (SECTION_STRIP_P): Update macro + definition to use remove_ctf to determine whether .ctf + section is stripped out. + * libelf/elf32_checksum.c (elfw2): Use false value for + remove_ctf parameter. + * src/elfcmp.c (main): Likewise. + * src/strip.c (options): Add --remove-ctf option set by + remove_ctf variable. + (set_remove_special_section_opt): Add new function. + (erratic_special_section_opt): Likewise. + (parse_opt): Parse new --remove-ctf option. + (handle_elf): Adjust .comment and use remove_ctf argument. + * tests/Makefile.am (TEST): Add run-strip-remove-keep-ctf.sh + and testfile-ctf.bz2. + * tests/run-strip-remove-keep-ctf.sh: Add new testcase. + * tests/testfile-ctf.bz2: Add new test harness. + 2023-02-23 Mark Wielaard * NEWS: Add old version code names. diff --git a/libebl/eblsectionstripp.c b/libebl/eblsectionstripp.c index a5624ffe..f26cc170 100644 --- a/libebl/eblsectionstripp.c +++ b/libebl/eblsectionstripp.c @@ -37,7 +37,7 @@ bool ebl_section_strip_p (Ebl *ebl, const GElf_Shdr *shdr, const char *name, bool remove_comment, - bool only_remove_debug) + bool only_remove_debug, bool remove_ctf) { /* If only debug information should be removed check the name. There is unfortunately no other way. */ @@ -66,5 +66,5 @@ ebl_section_strip_p (Ebl *ebl, const GElf_Shdr *shdr, return false; } - return SECTION_STRIP_P (shdr, name, remove_comment); + return SECTION_STRIP_P (shdr, name, remove_comment, remove_ctf); } diff --git a/libebl/libebl.h b/libebl/libebl.h index 731001d3..067b769e 100644 --- a/libebl/libebl.h +++ b/libebl/libebl.h @@ -205,7 +205,7 @@ extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc); /* Check whether section should be stripped. */ extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Shdr *shdr, const char *name, - bool remove_comment, bool only_remove_debug); + bool remove_comment, bool only_remove_debug, bool remove_ctf); /* Check if backend uses a bss PLT in this file. */ extern bool ebl_bss_plt_p (Ebl *ebl); diff --git a/libelf/elf-knowledge.h b/libelf/elf-knowledge.h index 6e005fa5..903a0f4f 100644 --- a/libelf/elf-knowledge.h +++ b/libelf/elf-knowledge.h @@ -34,7 +34,7 @@ /* Test whether a section can be stripped or not. */ -#define SECTION_STRIP_P(shdr, name, remove_comment) \ +#define SECTION_STRIP_P(shdr, name, remove_comment, remove_ctf) \ /* Sections which are allocated are not removed. */ \ (((shdr)->sh_flags & SHF_ALLOC) == 0 \ /* We never remove .note sections. */ \ @@ -45,7 +45,10 @@ && strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." - 1) != 0\ /* We remove .comment sections only if explicitly told to do so. */\ && (remove_comment \ - || strcmp (name, ".comment") != 0)))) + || strcmp (name, ".comment") != 0) \ + /* We remove .ctf sections only if explicitly told to do so. */\ + && (remove_ctf \ + || strcmp (name, ".ctf") != 0)))) /* Test whether `sh_info' field in section header contains a section diff --git a/libelf/elf32_checksum.c b/libelf/elf32_checksum.c index a47b307d..8482eb07 100644 --- a/libelf/elf32_checksum.c +++ b/libelf/elf32_checksum.c @@ -104,7 +104,7 @@ elfw2(LIBELFBITS,checksum) (Elf *elf) if (SECTION_STRIP_P (shdr, INTUSE(elf_strptr) (elf, shstrndx, shdr->sh_name), - true)) + true, false)) /* The section can be stripped. Don't use it. */ continue; diff --git a/src/elfcmp.c b/src/elfcmp.c index fba67e02..66d1b4b9 100644 --- a/src/elfcmp.c +++ b/src/elfcmp.c @@ -269,7 +269,7 @@ main (int argc, char *argv[]) sname1 = elf_strptr (elf1, shstrndx1, shdr1->sh_name); } while (scn1 != NULL && shdr1 != NULL - && ebl_section_strip_p (ebl1, shdr1, sname1, true, false)); + && ebl_section_strip_p (ebl1, shdr1, sname1, true, false, false)); GElf_Shdr shdr2_mem; GElf_Shdr *shdr2; @@ -282,7 +282,7 @@ main (int argc, char *argv[]) sname2 = elf_strptr (elf2, shstrndx2, shdr2->sh_name); } while (scn2 != NULL && shdr2 != NULL - && ebl_section_strip_p (ebl2, shdr2, sname2, true, false)); + && ebl_section_strip_p (ebl2, shdr2, sname2, true, false, false)); if (scn1 == NULL || scn2 == NULL || shdr1 == NULL || shdr2 == NULL) break; diff --git a/src/strip.c b/src/strip.c index 2a2cc801..68dfdc1f 100644 --- a/src/strip.c +++ b/src/strip.c @@ -61,6 +61,7 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; #define OPT_RELOC_DEBUG 0x103 #define OPT_KEEP_SECTION 0x104 #define OPT_RELOC_DEBUG_ONLY 0x105 +#define OPT_REMOVE_CTF 0x106 /* Definitions of arguments for argp functions. */ @@ -86,6 +87,8 @@ static const struct argp_option options[] = N_("Similar to --reloc-debug-sections, but resolve all trivial relocations between debug sections in place. No other stripping is performed (operation is not reversible, incompatible with -f, -g, --remove-comment and --remove-section)"), 0 }, { "remove-comment", OPT_REMOVE_COMMENT, NULL, 0, N_("Remove .comment section"), 0 }, + { "remove-ctf", OPT_REMOVE_CTF, NULL, 0, + N_("Remove .ctf section"), 0 }, { "remove-section", 'R', "SECTION", 0, N_("Remove the named section. SECTION is an extended wildcard pattern. May be given more than once. Only non-allocated sections can be removed."), 0 }, { "keep-section", OPT_KEEP_SECTION, "SECTION", 0, N_("Keep the named section. SECTION is an extended wildcard pattern. May be given more than once."), 0 }, { "permissive", OPT_PERMISSIVE, NULL, 0, @@ -149,6 +152,9 @@ static bool preserve_dates; /* If true .comment sections will be removed. */ static bool remove_comment; +/* If true .ctf sections will be removed. */ +static bool remove_ctf; + /* If true remove all debug sections. */ static bool remove_debug; @@ -216,6 +222,48 @@ section_name_matches (struct section_pattern *patterns, const char *name) return false; } +static void +set_remove_special_section_opt (const char *arg) +{ + if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) + remove_comment = true; + else if (fnmatch (arg, ".ctf", FNM_EXTMATCH) == 0) + remove_ctf = true; +} + +static error_t +erratic_special_section_opt (struct argp_state *state) +{ + int s; + struct { + const char *name; + bool remove; + } special_secs[] = { + { + .name = ".comment", + .remove = remove_comment + }, + { + .name = ".ctf", + .remove = remove_ctf + }, + { + .name = NULL, + } + }; + + for (s = 0; special_secs[s].name; ++s) + if (special_secs[s].remove == true + && section_name_matches (keep_secs, special_secs[s].name)) + { + argp_error (state, + _("cannot both keep and remove %s section"), + special_secs[s].name); + return EINVAL; + } + + return 0; +} int main (int argc, char *argv[]) @@ -324,9 +372,12 @@ parse_opt (int key, char *arg, struct argp_state *state) remove_comment = true; break; + case OPT_REMOVE_CTF: + remove_ctf = true; + break; + case 'R': - if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) - remove_comment = true; + set_remove_special_section_opt (arg); add_pattern (&remove_secs, arg); break; @@ -352,13 +403,8 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case ARGP_KEY_SUCCESS: - if (remove_comment == true - && section_name_matches (keep_secs, ".comment")) - { - argp_error (state, - _("cannot both keep and remove .comment section")); - return EINVAL; - } + if (erratic_special_section_opt (state)) + return EINVAL; break; default: @@ -1357,7 +1403,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, all sections which are not used at runtime are stripped out. But there are a few exceptions: - - special sections named ".comment" and ".note" are kept + - special sections named ".comment", ".note" and ".ctf" are kept - OS or architecture specific sections are kept since we might not know how to handle them - if a section is referred to from a section which is not removed @@ -1370,7 +1416,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, if (remove_shdrs ? !(shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) : (ebl_section_strip_p (ebl, &shdr_info[cnt].shdr, shdr_info[cnt].name, remove_comment, - remove_debug) + remove_debug, remove_ctf) || cnt == shstrndx || section_name_matches (remove_secs, shdr_info[cnt].name))) { @@ -1533,7 +1579,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, &shdr_info[scnidx].shdr, shdr_info[scnidx].name, remove_comment, - remove_debug) + remove_debug, + remove_ctf) && ebl_data_marker_symbol (ebl, sym, elf_strptr (elf, shdr_info[cnt].shdr.sh_link, diff --git a/tests/Makefile.am b/tests/Makefile.am index fd58bf84..2267a364 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -207,7 +207,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ $(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \ run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \ run-readelf-dw-form-indirect.sh run-strip-largealign.sh \ - run-readelf-Dd.sh + run-readelf-Dd.sh run-strip-remove-keep-ctf.sh if !BIARCH export ELFUTILS_DISABLE_BIARCH = 1 @@ -619,7 +619,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \ testfile_nvidia_linemap.bz2 \ testfile-largealign.o.bz2 run-strip-largealign.sh \ - run-funcretval++11.sh + run-funcretval++11.sh \ + testfile-ctf.bz2 run-strip-remove-keep-ctf.sh if USE_VALGRIND diff --git a/tests/run-strip-remove-keep-ctf.sh b/tests/run-strip-remove-keep-ctf.sh new file mode 100755 index 00000000..9a4fde72 --- /dev/null +++ b/tests/run-strip-remove-keep-ctf.sh @@ -0,0 +1,212 @@ +#! /bin/sh +# Copyright (C) 2022 Oracle, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. $srcdir/test-subr.sh + +# - testfile-ctf.c +# int +# main () +# { +# return 0; +# } +# +# gcc -gctf -g -o testfile-ctf testfile-ctf.c +# eu-strip testfile-ctf + +# strip -o output and -f debug files +tempfiles testfile.elf testfile.debug + +# A random 32bit testfile +testfiles testfile-ctf + +# strip should keep .ctf section +echo strip testfile-ctf +testrun ${abs_top_builddir}/src/strip -o testfile.elf -f testfile.debug testfile-ctf +echo elflint testfile.elf +testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf +echo elflint testfile.debug +testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug +echo readelf testfile.elf +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF +There are 28 section headers, starting at offset 0x31d8: + +Section Headers: +[Nr] Name Type Addr Off Size ES Flags Lk Inf Al +[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 +[ 1] .interp PROGBITS 0000000000400318 00000318 0000001c 0 A 0 0 1 +[ 2] .note.gnu.property NOTE 0000000000400338 00000338 00000020 0 A 0 0 8 +[ 3] .note.ABI-tag NOTE 0000000000400358 00000358 00000020 0 A 0 0 4 +[ 4] .hash HASH 0000000000400378 00000378 00000018 4 A 6 0 8 +[ 5] .gnu.hash GNU_HASH 0000000000400390 00000390 0000001c 0 A 6 0 8 +[ 6] .dynsym DYNSYM 00000000004003b0 000003b0 00000048 24 A 7 1 8 +[ 7] .dynstr STRTAB 00000000004003f8 000003f8 00000038 0 A 0 0 1 +[ 8] .gnu.version GNU_versym 0000000000400430 00000430 00000006 2 A 6 0 2 +[ 9] .gnu.version_r GNU_verneed 0000000000400438 00000438 00000020 0 A 7 1 8 +[10] .rela.dyn RELA 0000000000400458 00000458 00000030 24 A 6 0 8 +[11] .init PROGBITS 0000000000401000 00001000 00000017 0 AX 0 0 4 +[12] .text PROGBITS 0000000000401020 00001020 00000191 0 AX 0 0 16 +[13] .fini PROGBITS 00000000004011b4 000011b4 00000009 0 AX 0 0 4 +[14] .rodata PROGBITS 0000000000402000 00002000 00000004 4 AM 0 0 4 +[15] .eh_frame_hdr PROGBITS 0000000000402004 00002004 00000034 0 A 0 0 4 +[16] .eh_frame PROGBITS 0000000000402038 00002038 000000d8 0 A 0 0 8 +[17] .init_array INIT_ARRAY 0000000000403e40 00002e40 00000008 8 WA 0 0 8 +[18] .fini_array FINI_ARRAY 0000000000403e48 00002e48 00000008 8 WA 0 0 8 +[19] .dynamic DYNAMIC 0000000000403e50 00002e50 000001a0 16 WA 7 0 8 +[20] .got PROGBITS 0000000000403ff0 00002ff0 00000010 8 WA 0 0 8 +[21] .got.plt PROGBITS 0000000000404000 00003000 00000018 8 WA 0 0 8 +[22] .data PROGBITS 0000000000404018 00003018 00000010 0 WA 0 0 8 +[23] .bss NOBITS 0000000000404028 00003028 00000008 0 WA 0 0 1 +[24] .comment PROGBITS 0000000000000000 00003028 0000002a 1 MS 0 0 1 +[25] .ctf PROGBITS 0000000000000000 00003052 00000071 0 0 0 1 +[26] .gnu_debuglink PROGBITS 0000000000000000 000030c4 00000014 0 0 0 4 +[27] .shstrtab STRTAB 0000000000000000 000030d8 000000fd 0 0 0 1 + +EOF +echo readelf testfile.debug +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF +There are 35 section headers, starting at offset 0xb80: + +Section Headers: +[Nr] Name Type Addr Off Size ES Flags Lk Inf Al +[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 +[ 1] .interp NOBITS 0000000000400318 00000318 0000001c 0 A 0 0 1 +[ 2] .note.gnu.property NOTE 0000000000400338 00000318 00000020 0 A 0 0 8 +[ 3] .note.ABI-tag NOTE 0000000000400358 00000338 00000020 0 A 0 0 4 +[ 4] .hash NOBITS 0000000000400378 00000358 00000018 4 A 6 0 8 +[ 5] .gnu.hash NOBITS 0000000000400390 00000358 0000001c 0 A 6 0 8 +[ 6] .dynsym NOBITS 00000000004003b0 00000358 00000048 24 A 7 1 8 +[ 7] .dynstr NOBITS 00000000004003f8 00000358 00000038 0 A 0 0 1 +[ 8] .gnu.version NOBITS 0000000000400430 00000358 00000006 2 A 6 0 2 +[ 9] .gnu.version_r NOBITS 0000000000400438 00000358 00000020 0 A 7 1 8 +[10] .rela.dyn NOBITS 0000000000400458 00000358 00000030 24 A 6 0 8 +[11] .init NOBITS 0000000000401000 00000358 00000017 0 AX 0 0 4 +[12] .text NOBITS 0000000000401020 00000360 00000191 0 AX 0 0 16 +[13] .fini NOBITS 00000000004011b4 00000360 00000009 0 AX 0 0 4 +[14] .rodata NOBITS 0000000000402000 00000360 00000004 4 AM 0 0 4 +[15] .eh_frame_hdr NOBITS 0000000000402004 00000360 00000034 0 A 0 0 4 +[16] .eh_frame NOBITS 0000000000402038 00000360 000000d8 0 A 0 0 8 +[17] .init_array NOBITS 0000000000403e40 00000360 00000008 8 WA 0 0 8 +[18] .fini_array NOBITS 0000000000403e48 00000360 00000008 8 WA 0 0 8 +[19] .dynamic NOBITS 0000000000403e50 00000360 000001a0 16 WA 7 0 8 +[20] .got NOBITS 0000000000403ff0 00000360 00000010 8 WA 0 0 8 +[21] .got.plt NOBITS 0000000000404000 00000360 00000018 8 WA 0 0 8 +[22] .data NOBITS 0000000000404018 00000360 00000010 0 WA 0 0 8 +[23] .bss NOBITS 0000000000404028 00000360 00000008 0 WA 0 0 1 +[24] .comment NOBITS 0000000000000000 00000360 0000002a 1 MS 0 0 1 +[25] .ctf NOBITS 0000000000000000 00000360 00000071 0 0 0 1 +[26] .debug_aranges PROGBITS 0000000000000000 00000360 00000030 0 0 0 1 +[27] .debug_info PROGBITS 0000000000000000 00000390 00000054 0 0 0 1 +[28] .debug_abbrev PROGBITS 0000000000000000 000003e4 00000038 0 0 0 1 +[29] .debug_line PROGBITS 0000000000000000 0000041c 0000004f 0 0 0 1 +[30] .debug_str PROGBITS 0000000000000000 0000046b 0000005f 1 MS 0 0 1 +[31] .debug_line_str PROGBITS 0000000000000000 000004ca 0000001c 1 MS 0 0 1 +[32] .symtab SYMTAB 0000000000000000 000004e8 00000378 24 33 20 8 +[33] .strtab STRTAB 0000000000000000 00000860 000001cb 0 0 0 1 +[34] .shstrtab STRTAB 0000000000000000 00000a2b 0000014e 0 0 0 1 + +EOF + +# gcc -gctf -g -o testfile-ctf testfile-ctf.c +# eu-strip --remove-ctf testfile-ctf + +# Explicitly removes .ctf section +echo strip --remove-ctf testfile-ctf +testrun ${abs_top_builddir}/src/strip --remove-ctf -o testfile.elf -f testfile.debug testfile-ctf +echo elflint testfile.elf +testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf +echo elflint testfile.debug +testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug +echo readelf testfile.elf +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF +There are 27 section headers, starting at offset 0x3160: + +Section Headers: +[Nr] Name Type Addr Off Size ES Flags Lk Inf Al +[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 +[ 1] .interp PROGBITS 0000000000400318 00000318 0000001c 0 A 0 0 1 +[ 2] .note.gnu.property NOTE 0000000000400338 00000338 00000020 0 A 0 0 8 +[ 3] .note.ABI-tag NOTE 0000000000400358 00000358 00000020 0 A 0 0 4 +[ 4] .hash HASH 0000000000400378 00000378 00000018 4 A 6 0 8 +[ 5] .gnu.hash GNU_HASH 0000000000400390 00000390 0000001c 0 A 6 0 8 +[ 6] .dynsym DYNSYM 00000000004003b0 000003b0 00000048 24 A 7 1 8 +[ 7] .dynstr STRTAB 00000000004003f8 000003f8 00000038 0 A 0 0 1 +[ 8] .gnu.version GNU_versym 0000000000400430 00000430 00000006 2 A 6 0 2 +[ 9] .gnu.version_r GNU_verneed 0000000000400438 00000438 00000020 0 A 7 1 8 +[10] .rela.dyn RELA 0000000000400458 00000458 00000030 24 A 6 0 8 +[11] .init PROGBITS 0000000000401000 00001000 00000017 0 AX 0 0 4 +[12] .text PROGBITS 0000000000401020 00001020 00000191 0 AX 0 0 16 +[13] .fini PROGBITS 00000000004011b4 000011b4 00000009 0 AX 0 0 4 +[14] .rodata PROGBITS 0000000000402000 00002000 00000004 4 AM 0 0 4 +[15] .eh_frame_hdr PROGBITS 0000000000402004 00002004 00000034 0 A 0 0 4 +[16] .eh_frame PROGBITS 0000000000402038 00002038 000000d8 0 A 0 0 8 +[17] .init_array INIT_ARRAY 0000000000403e40 00002e40 00000008 8 WA 0 0 8 +[18] .fini_array FINI_ARRAY 0000000000403e48 00002e48 00000008 8 WA 0 0 8 +[19] .dynamic DYNAMIC 0000000000403e50 00002e50 000001a0 16 WA 7 0 8 +[20] .got PROGBITS 0000000000403ff0 00002ff0 00000010 8 WA 0 0 8 +[21] .got.plt PROGBITS 0000000000404000 00003000 00000018 8 WA 0 0 8 +[22] .data PROGBITS 0000000000404018 00003018 00000010 0 WA 0 0 8 +[23] .bss NOBITS 0000000000404028 00003028 00000008 0 WA 0 0 1 +[24] .comment PROGBITS 0000000000000000 00003028 0000002a 1 MS 0 0 1 +[25] .gnu_debuglink PROGBITS 0000000000000000 00003054 00000014 0 0 0 4 +[26] .shstrtab STRTAB 0000000000000000 00003068 000000f8 0 0 0 1 + +EOF +echo readelf testfile.debug +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF +There are 35 section headers, starting at offset 0xbf0: + +Section Headers: +[Nr] Name Type Addr Off Size ES Flags Lk Inf Al +[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 +[ 1] .interp NOBITS 0000000000400318 00000318 0000001c 0 A 0 0 1 +[ 2] .note.gnu.property NOTE 0000000000400338 00000318 00000020 0 A 0 0 8 +[ 3] .note.ABI-tag NOTE 0000000000400358 00000338 00000020 0 A 0 0 4 +[ 4] .hash NOBITS 0000000000400378 00000358 00000018 4 A 6 0 8 +[ 5] .gnu.hash NOBITS 0000000000400390 00000358 0000001c 0 A 6 0 8 +[ 6] .dynsym NOBITS 00000000004003b0 00000358 00000048 24 A 7 1 8 +[ 7] .dynstr NOBITS 00000000004003f8 00000358 00000038 0 A 0 0 1 +[ 8] .gnu.version NOBITS 0000000000400430 00000358 00000006 2 A 6 0 2 +[ 9] .gnu.version_r NOBITS 0000000000400438 00000358 00000020 0 A 7 1 8 +[10] .rela.dyn NOBITS 0000000000400458 00000358 00000030 24 A 6 0 8 +[11] .init NOBITS 0000000000401000 00000358 00000017 0 AX 0 0 4 +[12] .text NOBITS 0000000000401020 00000360 00000191 0 AX 0 0 16 +[13] .fini NOBITS 00000000004011b4 00000360 00000009 0 AX 0 0 4 +[14] .rodata NOBITS 0000000000402000 00000360 00000004 4 AM 0 0 4 +[15] .eh_frame_hdr NOBITS 0000000000402004 00000360 00000034 0 A 0 0 4 +[16] .eh_frame NOBITS 0000000000402038 00000360 000000d8 0 A 0 0 8 +[17] .init_array NOBITS 0000000000403e40 00000360 00000008 8 WA 0 0 8 +[18] .fini_array NOBITS 0000000000403e48 00000360 00000008 8 WA 0 0 8 +[19] .dynamic NOBITS 0000000000403e50 00000360 000001a0 16 WA 7 0 8 +[20] .got NOBITS 0000000000403ff0 00000360 00000010 8 WA 0 0 8 +[21] .got.plt NOBITS 0000000000404000 00000360 00000018 8 WA 0 0 8 +[22] .data NOBITS 0000000000404018 00000360 00000010 0 WA 0 0 8 +[23] .bss NOBITS 0000000000404028 00000360 00000008 0 WA 0 0 1 +[24] .comment NOBITS 0000000000000000 00000360 0000002a 1 MS 0 0 1 +[25] .ctf PROGBITS 0000000000000000 00000360 00000071 0 0 0 1 +[26] .debug_aranges PROGBITS 0000000000000000 000003d1 00000030 0 0 0 1 +[27] .debug_info PROGBITS 0000000000000000 00000401 00000054 0 0 0 1 +[28] .debug_abbrev PROGBITS 0000000000000000 00000455 00000038 0 0 0 1 +[29] .debug_line PROGBITS 0000000000000000 0000048d 0000004f 0 0 0 1 +[30] .debug_str PROGBITS 0000000000000000 000004dc 0000005f 1 MS 0 0 1 +[31] .debug_line_str PROGBITS 0000000000000000 0000053b 0000001c 1 MS 0 0 1 +[32] .symtab SYMTAB 0000000000000000 00000558 00000378 24 33 20 8 +[33] .strtab STRTAB 0000000000000000 000008d0 000001cb 0 0 0 1 +[34] .shstrtab STRTAB 0000000000000000 00000a9b 0000014e 0 0 0 1 + +EOF + +exit 0 diff --git a/tests/testfile-ctf.bz2 b/tests/testfile-ctf.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..f48bb9304f1e2194500f5091dbb3aa1a7b8806cc GIT binary patch literal 2620 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 literal 0 HcmV?d00001 -- 2.39.1