From patchwork Fri Jul 31 12:10:37 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 140329 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DD62C4B1A29A for ; Fri, 31 Jul 2026 12:11:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD62C4B1A29A Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=cSvvNXRi X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by sourceware.org (Postfix) with ESMTPS id 060674B1A378 for ; Fri, 31 Jul 2026 12:10:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 060674B1A378 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 060674B1A378 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::430 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499840; cv=none; b=OxzRw5tWho4E9aZRHcIn0K5wpsjQrY4rGVim0JiBY/qe7VUxKn11izhkzw3TzqN69OxksKaNDLEuf+Asx5haxkJCLTyrsHBe+h3DO4U9yG7LJEWNf4dy40/WOrmIPqideM6ycVwvzNZ/f1zhZdkBm6jvTFispbmRCqUC6hjGnkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499840; c=relaxed/simple; bh=VJgfbJdakTvvuaNc3Plp+U8sYygZswlVkzhdZ2h+mTE=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=AjdnuOfw+irJN48bSxhN+w/bRe0ZhVTHOzv5ub/IjymIMvwueYxWE8UmUZJzj/OaEwn2xP0CgkfXY9lNpgCe0CfiZE+WYy+NPJ7e01BMvfhi6BGgbExg31a8mB06oCZq3KiNyqiF1l8r1bPChuEJQhW/iPuZ1YrHjaGfIsqR658= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=cSvvNXRi DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 060674B1A378 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-47f703a9e5dso451966f8f.0 for ; Fri, 31 Jul 2026 05:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1785499839; x=1786104639; darn=sourceware.org; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=QWYSi8VwQuUGQQndEnCVa35cb0blIaEsoMoviM8CZLo=; b=cSvvNXRi2tl2hb3L7qYIf//ZvBFGU8PFOAJnS6YxVzUU/rkhtQCWWS3c7VDRESmYFf mP+xRTdGu/YEAEpAGfhzsngR1IvYj+1ivvC58XdhBb/krOX4sEvE+FMy5DwguMCLzIYx V/qlc/7kiA4huVMXCGaYWUAtqfmFu1SOO6pC9qSv2AQkL7aKW82fKPwKM56bXiGlMXaP ms9MBe/FtGnYlFcl9VnM9EKNF6Irzs/wm4+C7vMxQEWsqlwXOCe77pvxR1vZEyf9bFV6 ZZQxrLsSuR20d4z0GkLHJK7I3ll+5DHHGZHZTYqqVxBPiHKUiRL8b/bthp0RGkgSzTE4 BmOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785499839; x=1786104639; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=QWYSi8VwQuUGQQndEnCVa35cb0blIaEsoMoviM8CZLo=; b=D5x9pSG+R8t07GlT5FkxHoLYh+WqCSGeohNpYQqVlHdxCUiIgbmNlOLC6jm+NkyMEY 2zYnCSAT6qkmecoKOZls+JfOxVO0Db7Jl619Vz5VvK02cJO5HDr+knqspcoz22q7FcHw P60s/Tp7X/Bgu9Lrg3xCo6bJEDj8HcGdkMKf4DpJ8iaCvOMcR2FUpx7QEtpM6tx6ClCT 2lRBB9vNB0aXW1HDTm3An6pOj9T9Pqlg72oGx4zB+vOxZ8xc2Vd4eXhe66Ct3HKZI12m Zu7SKpMrTETiaX9aPiZvooi025YmctjjPWaOXqjRUM8qhMaFIjsCcz8jAqsgKhq2R93Q Feew== X-Gm-Message-State: AOJu0YwpCseWtv+FqlLFT1QRlTPp2G43CaLpYE06cNT7xXTPuVwbJ6dL dyS6zESsMSGevD1Aw7N0UJVtN7ApAD6WjYp5+0ka1Ja+wgxopmvP4DGC67cEui8OZqJjFTs7JEd UfdsphA== X-Gm-Gg: AR+sD12FMvUZ7IpOjz3x/5yRX3gZETPkrMDFs7IcOmSY5vKRiMPN9UVbIOV0Ln4wmiw Yd9wQoSe8zgtkH9pSh44iVIpTfoQptklfst30iDFpNnvz6Z+sMR51TCuXryLKD6cfPMw+Vc80jQ 8aj5CZtMxkh1RSGyJIs56IwYtL6+k2e6xOefsCccPTNeuX9nfxpxjYd0MytulTvLIOtlkCLqHAV ghvPWlZsytMqmJYfmKd+iRpNlVToCeCMhC5VsfbHofngBFZ7aiMZ7PvVu5BMTtN27r/S1DoB9Bl 8KLK6ESj9lm3NI9PFNZpYlHmKltmvROPtHOynMZYYpUTvPiaNlhl32EKc3wwUSMOgGyggfhGog2 euOkIeNKTSGdmF99L2BEWwDMyqxoaOWPhjQ4vpZxp/EhEoYCvkMS3MTy3p+ccthamiF6+/baVbq Rjl6BP7/Ovfpn3GPG9UdsBNjnsfiL242cBPKzgMaEJ/VhSz3zf1AaeQJVvXtmVM8PcYP42y9vJg lhf6B/h10z2NL+DQZPlysrH4DTeEsuAul9C16IWdVtuYsEXtHy5 X-Received: by 2002:a05:6000:2c0f:b0:47f:9022:8531 with SMTP id ffacd0b85a97d-47fd2aca423mr3966906f8f.22.1785499838839; Fri, 31 Jul 2026 05:10:38 -0700 (PDT) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd41e296csm4236600f8f.12.2026.07.31.05.10.37 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 31 Jul 2026 05:10:38 -0700 (PDT) Message-ID: <0a2cd844-ec6a-421b-94e1-c2042a645219@suse.com> Date: Fri, 31 Jul 2026 14:10:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 1/5] readelf: fold get_{32,64}bit_program_headers() From: Jan Beulich To: Binutils References: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> X-Spam-Status: No, score=-3015.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org PR binutils/34356 They're identical except for the types used and the order of fields processed. The latter doesn't matter for correctness, and the former can be addressed by compiling the same code twice. --- v2: Use new file readelf-nn.c. --- a/binutils/Makefile.am +++ b/binutils/Makefile.am @@ -141,7 +141,7 @@ CFILES = \ nm.c not-ranlib.c not-strip.c \ objcopy.c objdump.c prdbg.c \ od-elf32_avr.c od-macho.c od-pe.c od-xcoff.c \ - rclex.c rdcoff.c rddbg.c readelf.c rename.c \ + rclex.c rdcoff.c rddbg.c readelf.c readelf-nn.c rename.c \ resbin.c rescoff.c resrc.c resres.c \ size.c srconv.c stabs.c strings.c sysdump.c \ syslex_wrap.c unwind-ia64.c elfedit.c version.c \ @@ -385,7 +385,7 @@ endif $(AM_V_CC)$(COMPILE) $(DEBUGINFOD_CFLAGS) -c -o $@ $(srcdir)/dwarf.c endif -readelf.@OBJEXT@: readelf.c +readelf.@OBJEXT@: readelf.c readelf-nn.c if am__fastdepCC $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo $(MSGPACK_CFLAGS) -c -o $@ $(srcdir)/readelf.c $(AM_V_at)mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po --- a/binutils/Makefile.in +++ b/binutils/Makefile.in @@ -724,7 +724,7 @@ CFILES = \ nm.c not-ranlib.c not-strip.c \ objcopy.c objdump.c prdbg.c \ od-elf32_avr.c od-macho.c od-pe.c od-xcoff.c \ - rclex.c rdcoff.c rddbg.c readelf.c rename.c \ + rclex.c rdcoff.c rddbg.c readelf.c readelf-nn.c rename.c \ resbin.c rescoff.c resrc.c resres.c \ size.c srconv.c stabs.c strings.c sysdump.c \ syslex_wrap.c unwind-ia64.c elfedit.c version.c \ @@ -1196,6 +1196,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rcparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdcoff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rddbg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readelf-nn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readelf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resbin.Po@am__quote@ @@ -1936,7 +1937,7 @@ dwarf.@OBJEXT@: dwarf.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC)$(COMPILE) $(DEBUGINFOD_CFLAGS) -c -o $@ $(srcdir)/dwarf.c -readelf.@OBJEXT@: readelf.c +readelf.@OBJEXT@: readelf.c readelf-nn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo $(MSGPACK_CFLAGS) -c -o $@ $(srcdir)/readelf.c @am__fastdepCC_TRUE@ $(AM_V_at)mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='readelf.c' object='$@' libtool=no @AMDEPBACKSLASH@ --- a/binutils/po/POTFILES.in +++ b/binutils/po/POTFILES.in @@ -50,6 +50,7 @@ rdcoff.c rddbg.c rddbg.c readelf.c +readelf-nn.c rename.c resbin.c rescoff.c --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3469,6 +3469,11 @@ get_dynamic_type (Filedata * filedata, u } } +#define ElfXX(n) Elf32 ## n +#include "readelf-nn.c" +#define ElfXX(n) Elf64 ## n +#include "readelf-nn.c" + static bool get_program_headers (Filedata *); static bool get_dynamic_section (Filedata *); @@ -7366,100 +7371,6 @@ process_file_header (Filedata * filedata return true; } -/* Read in the program headers from FILEDATA and store them in PHEADERS. - Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */ - -static bool -get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders) -{ - Elf32_External_Phdr * phdrs; - Elf32_External_Phdr * external; - Elf_Internal_Phdr * internal; - unsigned int i; - unsigned int size = filedata->file_header.e_phentsize; - unsigned int num = filedata->file_header.e_phnum; - - /* PR binutils/17531: Cope with unexpected section header sizes. */ - if (size == 0 || num == 0) - return false; - if (size < sizeof * phdrs) - { - error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n")); - return false; - } - if (size > sizeof * phdrs) - warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n")); - - phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff, - size, num, _("program headers")); - if (phdrs == NULL) - return false; - - for (i = 0, internal = pheaders, external = phdrs; - i < filedata->file_header.e_phnum; - i++, internal++, external++) - { - internal->p_type = BYTE_GET (external->p_type); - internal->p_offset = BYTE_GET (external->p_offset); - internal->p_vaddr = BYTE_GET (external->p_vaddr); - internal->p_paddr = BYTE_GET (external->p_paddr); - internal->p_filesz = BYTE_GET (external->p_filesz); - internal->p_memsz = BYTE_GET (external->p_memsz); - internal->p_flags = BYTE_GET (external->p_flags); - internal->p_align = BYTE_GET (external->p_align); - } - - free (phdrs); - return true; -} - -/* Read in the program headers from FILEDATA and store them in PHEADERS. - Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */ - -static bool -get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders) -{ - Elf64_External_Phdr * phdrs; - Elf64_External_Phdr * external; - Elf_Internal_Phdr * internal; - unsigned int i; - unsigned int size = filedata->file_header.e_phentsize; - unsigned int num = filedata->file_header.e_phnum; - - /* PR binutils/17531: Cope with unexpected section header sizes. */ - if (size == 0 || num == 0) - return false; - if (size < sizeof * phdrs) - { - error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n")); - return false; - } - if (size > sizeof * phdrs) - warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n")); - - phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff, - size, num, _("program headers")); - if (!phdrs) - return false; - - for (i = 0, internal = pheaders, external = phdrs; - i < filedata->file_header.e_phnum; - i++, internal++, external++) - { - internal->p_type = BYTE_GET (external->p_type); - internal->p_flags = BYTE_GET (external->p_flags); - internal->p_offset = BYTE_GET (external->p_offset); - internal->p_vaddr = BYTE_GET (external->p_vaddr); - internal->p_paddr = BYTE_GET (external->p_paddr); - internal->p_filesz = BYTE_GET (external->p_filesz); - internal->p_memsz = BYTE_GET (external->p_memsz); - internal->p_align = BYTE_GET (external->p_align); - } - - free (phdrs); - return true; -} - /* Returns TRUE if the program headers were read into `program_headers'. */ static bool @@ -7492,8 +7403,8 @@ get_program_headers (Filedata * filedata } if (is_32bit_elf - ? get_32bit_program_headers (filedata, phdrs) - : get_64bit_program_headers (filedata, phdrs)) + ? Elf32_get_program_headers (filedata, phdrs) + : Elf64_get_program_headers (filedata, phdrs)) { filedata->program_headers = phdrs; return true; --- /dev/null +++ b/binutils/readelf-nn.c @@ -0,0 +1,90 @@ +/* readelf-nn.c -- ELF32 / ELF64 helper of readelf.c + Copyright (C) 1998-2026 Free Software Foundation, Inc. + + Originally developed by Eric Youngdale + Modifications by Nick Clifton + + This file is part of GNU Binutils. + + This program 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* The difference between readelf and objdump: + + Both programs are capable of displaying the contents of ELF format files, + so why does the binutils project have two file dumpers ? + + The reason is that objdump sees an ELF file through a BFD filter of the + world; if BFD has a bug where, say, it disagrees about a machine constant + in e_flags, then the odds are good that it will remain internally + consistent. The linker sees it the BFD way, objdump sees it the BFD way, + GAS sees it the BFD way. There was need for a tool to go find out what + the file actually says. + + This is why the readelf program does not link against the BFD library - it + exists as an independent program to help verify the correct working of BFD. + + There is also the case that readelf can provide more information about an + ELF file than is provided by objdump. In particular it can display DWARF + debugging information which (at the moment) objdump cannot. */ + +/* Read in the program headers from FILEDATA and store them in PHEADERS. + Returns TRUE upon success, FALSE otherwise. */ + +static bool +ElfXX(_get_program_headers) (Filedata * filedata, Elf_Internal_Phdr * pheaders) +{ + ElfXX(_External_Phdr) * phdrs; + const ElfXX(_External_Phdr) * external; + Elf_Internal_Phdr * internal; + unsigned int i; + unsigned int size = filedata->file_header.e_phentsize; + unsigned int num = filedata->file_header.e_phnum; + + /* PR binutils/17531: Cope with unexpected section header sizes. */ + if (size == 0 || num == 0) + return false; + if (size < sizeof * phdrs) + { + error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n")); + return false; + } + if (size > sizeof * phdrs) + warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n")); + + phdrs = get_data (NULL, filedata, filedata->file_header.e_phoff, size, num, + _("program headers")); + if (phdrs == NULL) + return false; + + for (i = 0, internal = pheaders, external = phdrs; + i < filedata->file_header.e_phnum; + i++, internal++, external++) + { + internal->p_type = BYTE_GET (external->p_type); + internal->p_offset = BYTE_GET (external->p_offset); + internal->p_vaddr = BYTE_GET (external->p_vaddr); + internal->p_paddr = BYTE_GET (external->p_paddr); + internal->p_filesz = BYTE_GET (external->p_filesz); + internal->p_memsz = BYTE_GET (external->p_memsz); + internal->p_flags = BYTE_GET (external->p_flags); + internal->p_align = BYTE_GET (external->p_align); + } + + free (phdrs); + return true; +} + +#undef ElfXX From patchwork Fri Jul 31 12:11:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 140332 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0BEDD4B1972B for ; Fri, 31 Jul 2026 12:13:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0BEDD4B1972B Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=a4wCq58J X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id 5DA2F4BCA415 for ; Fri, 31 Jul 2026 12:11:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5DA2F4BCA415 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5DA2F4BCA415 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::434 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499862; cv=none; b=UBZlPOuI+lNmDdkFscd1xCh+MUfnfGcm2k0KX1yCS4TKPJnMN/wPFA+/dwDtKRTPsuWoz8/L4MQHWmLmxr8jvsF7v1hiGAS2mxGAUZpNAShkTkM+zgzN8vXsxg9zP7T+J4EDZ08pc/DANaYZQeknQi0XNo2XmZX/FCl+v9o5T+Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499862; c=relaxed/simple; bh=B4AAPEJ0uUC9FkZohZtrpsC+LYsIni5y5xfHwMP5ZuM=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=Ty+5JmRUK+Nhu3L1V5nX40cUdi3QsI96M1W4p3n29t1hYQER9TXxLQRVEgkuhDslwXB7v5lLJkvaP79yV0fOy5Xj38Kpr39YemBZ5c0K7t9M2+slLpCgQIwal9a1V/d2s39jXYyKWANbVVJo4ltDVWiW+XJ0fng1zo8uX6Z7sME= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=a4wCq58J DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5DA2F4BCA415 Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-47c6e9a694bso569611f8f.1 for ; Fri, 31 Jul 2026 05:11:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1785499861; x=1786104661; darn=sourceware.org; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=WBAYEdABOHP/UYy1Nkim34dzk/6TKD/Q/JvIJZmsww4=; b=a4wCq58JKM7gW7uV5uUy+jvX3BADvgla4b8dm2m+FoQ8xL4spKm8jyb82AysXdohgY J6V+0KWTh9t/8T9G5y+OFhaY+rIxQeOh1zJpzLS+0n+FecPOFmvcjXMOdYSwy3kLLN1J bbffzA51c8aYZ+gj/SxFuZngCQgv0pJSJeK1aPqmoMu4vvADiOKcPd4APhFn7NgeXNur zUw0jE1GUXTv2+v1yvM96ofk2CFWZG6bymXUmo2TIXQ1ZPt6Xk8SiZjlys0izqzgSMzk dDGlAJCyF+/ms41EQEXTNnQADB3nTu0DX8gy1K+Qy33bLMFKwty7qez0cQNMDGZ5g7/y MrDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785499861; x=1786104661; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WBAYEdABOHP/UYy1Nkim34dzk/6TKD/Q/JvIJZmsww4=; b=KkZuw0jX2Nix2oKW2wV6M/oA5hqQ1R0kQLN+mScrrWcm00/yrEl9fkgw2sH6WbTzPM 5Ojh89uo+aqLrZCv7ISryJWFN3sV9b1rhehsXCGIvZ3njOjINSjMQcJtXAH6kk2RU5UD j2uWzagntukqu5X1LdYd1yQZbKzgTwzvZjDKuIjFXE95fTMuXtGD47kUqqx7hBKVMcZK lFHD/XPIz7BfPlzGs5wx8isxA/VOt23mdlzuFNv79sPQFFgJHi2DF3XqjiGoO6xU0bfe r1OEszF3GH1tdb5pbNMQVlyVCp6bXw1HOVcVOud8jBvOLsIDP54ptslca4PabEPbbtnP XduA== X-Gm-Message-State: AOJu0Yw3LhPToiw5vHPnSh8Q5+ocVK0bi0qs5TIS6riXXT4X83VBaV5W uvwWwjz/sFk6Sf6U7DmQLf24phkuuK+2axA86LftvePPaOku4kKBcYyaX/WI0ykT8Zv+KkzMR3p lJJou7g== X-Gm-Gg: AR+sD11m/mGhs424Ji0EPqMLPO4umJCPDjK+f8Xy6mNbf7cAH1T4zoCyx+rzAJCrnZe cZphwD1HcZ4WnsyNPh/Nj9lYwY2fkGNqirf4LfFGvYfghd7acdTpdpsVRHJH5H+bSpAkY9GkgsE onqVwZbY+T/UMuIMC5AAvqC8PVCmPcRCu/CNYyej8pRn7gLFRXR7D8AWK8jD5T+y4c+QRCa1XIx duNq22t6r4XrF6O3vWfgkc9Tj7FXmWGxOLQ9ZGF4f+vZFHrNZThIIYtWET7gsJYu7hTGjBh75qh /N1Se4bhtHh1Rd0edLUoo2Bc6rV1WkBDR6AHAPRbRVjNUbyFtLIuBuZ7QqZNb204BKWb3GsEgDZ Ky/rHZIvXmvOYi8nsytTIiVGfRCShnsd1X9OiFDLCC6Dv3oimdcPqQmwaqc40a+LqqS34CNFWni Pt5V0Yl9Uq3Ga4GdZX5ZEal+WT1IhYa6i0/NSi8z3UbIy/Z+r2+oWCBupFcGWQNy2iEZB4QGnxf CgIs7HrSkkK8LEmiZd6AK2jseLPygZquZeS9kiDhvHcvbih56JB X-Received: by 2002:a05:6000:2c10:b0:47f:80ef:2c50 with SMTP id ffacd0b85a97d-47fd2adbda6mr4031910f8f.23.1785499861109; Fri, 31 Jul 2026 05:11:01 -0700 (PDT) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd41d1a58sm4719464f8f.7.2026.07.31.05.11.00 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 31 Jul 2026 05:11:00 -0700 (PDT) Message-ID: Date: Fri, 31 Jul 2026 14:11:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 2/5] readelf: fold get_{32,64}bit_section_headers() From: Jan Beulich To: Binutils References: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> X-Spam-Status: No, score=-3015.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org PR binutils/34356 They're identical except for the types used and the order of fields processed. The latter doesn't matter for correctness, and the former can be addressed by compiling the same code twice. Sadly the placement of the recently added validate_section_info() now requires a forward declaration. --- v2: Use new file readelf-nn.c. --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3469,6 +3469,10 @@ get_dynamic_type (Filedata * filedata, u } } +static void +validate_section_info (Elf_Internal_Shdr *, Elf_Internal_Shdr **, + unsigned int, Filedata *); + #define ElfXX(n) Elf32 ## n #include "readelf-nn.c" #define ElfXX(n) Elf64 ## n @@ -7854,158 +7858,6 @@ validate_section_info (Elf_Internal_Shdr } } -/* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers. - If PROBE is true, this is just a probe and we do not generate any error - messages if the load fails. */ - -static bool -get_32bit_section_headers (Filedata * filedata, bool probe) -{ - Elf32_External_Shdr * shdrs; - Elf_Internal_Shdr * internal; - Elf_Internal_Shdr ** orig_internal; - unsigned int i; - unsigned int size = filedata->file_header.e_shentsize; - unsigned int num = probe ? 1 : filedata->file_header.e_shnum; - - /* PR binutils/17531: Cope with unexpected section header sizes. */ - if (size == 0 || num == 0) - return false; - - /* The section header cannot be at the start of the file - that is - where the ELF file header is located. A file with absolutely no - sections in it will use a shoff of 0. */ - if (filedata->file_header.e_shoff == 0) - return false; - - if (size < sizeof * shdrs) - { - if (! probe) - error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n")); - return false; - } - if (!probe && size > sizeof * shdrs) - warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n")); - - shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff, - size, num, - probe ? NULL : _("section headers")); - if (shdrs == NULL) - return false; - - filedata->section_headers = (Elf_Internal_Shdr *) - cmalloc (num, sizeof (Elf_Internal_Shdr)); - if (filedata->section_headers == NULL) - { - if (!probe) - error (_("Out of memory reading %u section headers\n"), num); - free (shdrs); - return false; - } - - if (!probe) - filedata->orig_section_headers = xcalloc2 (num, - sizeof (Elf_Internal_Shdr *)); - - orig_internal = filedata->orig_section_headers; - for (i = 0, internal = filedata->section_headers; - i < num; - i++, internal++, orig_internal++) - { - internal->sh_name = BYTE_GET (shdrs[i].sh_name); - internal->sh_type = BYTE_GET (shdrs[i].sh_type); - internal->sh_flags = BYTE_GET (shdrs[i].sh_flags); - internal->sh_addr = BYTE_GET (shdrs[i].sh_addr); - internal->sh_offset = BYTE_GET (shdrs[i].sh_offset); - internal->sh_size = BYTE_GET (shdrs[i].sh_size); - internal->sh_link = BYTE_GET (shdrs[i].sh_link); - internal->sh_info = BYTE_GET (shdrs[i].sh_info); - internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign); - internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize); - if (!probe) - validate_section_info (internal, orig_internal, i, filedata); - } - - free (shdrs); - return true; -} - -/* Like get_32bit_section_headers, except that it fetches 64-bit headers. */ - -static bool -get_64bit_section_headers (Filedata * filedata, bool probe) -{ - Elf64_External_Shdr * shdrs; - Elf_Internal_Shdr * internal; - Elf_Internal_Shdr ** orig_internal; - unsigned int i; - unsigned int size = filedata->file_header.e_shentsize; - unsigned int num = probe ? 1 : filedata->file_header.e_shnum; - - /* PR binutils/17531: Cope with unexpected section header sizes. */ - if (size == 0 || num == 0) - return false; - - /* The section header cannot be at the start of the file - that is - where the ELF file header is located. A file with absolutely no - sections in it will use a shoff of 0. */ - if (filedata->file_header.e_shoff == 0) - return false; - - if (size < sizeof * shdrs) - { - if (! probe) - error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n")); - return false; - } - - if (! probe && size > sizeof * shdrs) - warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n")); - - shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata, - filedata->file_header.e_shoff, - size, num, - probe ? NULL : _("section headers")); - if (shdrs == NULL) - return false; - - filedata->section_headers = (Elf_Internal_Shdr *) - cmalloc (num, sizeof (Elf_Internal_Shdr)); - if (filedata->section_headers == NULL) - { - if (! probe) - error (_("Out of memory reading %u section headers\n"), num); - free (shdrs); - return false; - } - - if (!probe) - filedata->orig_section_headers = xcalloc2 (num, - sizeof (Elf_Internal_Shdr *)); - - orig_internal = filedata->orig_section_headers; - for (i = 0, internal = filedata->section_headers; - i < num; - i++, internal++, orig_internal++) - { - internal->sh_name = BYTE_GET (shdrs[i].sh_name); - internal->sh_type = BYTE_GET (shdrs[i].sh_type); - internal->sh_flags = BYTE_GET (shdrs[i].sh_flags); - internal->sh_addr = BYTE_GET (shdrs[i].sh_addr); - internal->sh_size = BYTE_GET (shdrs[i].sh_size); - internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize); - internal->sh_link = BYTE_GET (shdrs[i].sh_link); - internal->sh_info = BYTE_GET (shdrs[i].sh_info); - internal->sh_offset = BYTE_GET (shdrs[i].sh_offset); - internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign); - if (!probe) - validate_section_info (internal, orig_internal, i, filedata); - } - - free (shdrs); - return true; -} - static bool get_section_headers (Filedata *filedata, bool probe) { @@ -8013,9 +7865,9 @@ get_section_headers (Filedata *filedata, return true; if (is_32bit_elf) - return get_32bit_section_headers (filedata, probe); + return Elf32_get_section_headers (filedata, probe); else - return get_64bit_section_headers (filedata, probe); + return Elf64_get_section_headers (filedata, probe); } static Elf_Internal_Sym * --- a/binutils/readelf-nn.c +++ b/binutils/readelf-nn.c @@ -87,4 +87,79 @@ ElfXX(_get_program_headers) (Filedata * return true; } +/* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers. + If PROBE is true, this is just a probe and we do not generate any error + messages if the load fails. */ + +static bool +ElfXX(_get_section_headers) (Filedata * filedata, bool probe) +{ + ElfXX(_External_Shdr) * shdrs; + Elf_Internal_Shdr * internal; + Elf_Internal_Shdr ** orig_internal; + unsigned int i; + unsigned int size = filedata->file_header.e_shentsize; + unsigned int num = probe ? 1 : filedata->file_header.e_shnum; + + /* PR binutils/17531: Cope with unexpected section header sizes. */ + if (size == 0 || num == 0) + return false; + + /* The section header cannot be at the start of the file - that is + where the ELF file header is located. A file with absolutely no + sections in it will use a shoff of 0. */ + if (filedata->file_header.e_shoff == 0) + return false; + + if (size < sizeof * shdrs) + { + if (! probe) + error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n")); + return false; + } + if (!probe && size > sizeof * shdrs) + warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n")); + + shdrs = get_data (NULL, filedata, filedata->file_header.e_shoff, size, num, + probe ? NULL : _("section headers")); + if (shdrs == NULL) + return false; + + filedata->section_headers = (Elf_Internal_Shdr *) + cmalloc (num, sizeof (Elf_Internal_Shdr)); + if (filedata->section_headers == NULL) + { + if (!probe) + error (_("Out of memory reading %u section headers\n"), num); + free (shdrs); + return false; + } + + if (!probe) + filedata->orig_section_headers = xcalloc2 (num, + sizeof (Elf_Internal_Shdr *)); + + orig_internal = filedata->orig_section_headers; + for (i = 0, internal = filedata->section_headers; + i < num; + i++, internal++, orig_internal++) + { + internal->sh_name = BYTE_GET (shdrs[i].sh_name); + internal->sh_type = BYTE_GET (shdrs[i].sh_type); + internal->sh_flags = BYTE_GET (shdrs[i].sh_flags); + internal->sh_addr = BYTE_GET (shdrs[i].sh_addr); + internal->sh_offset = BYTE_GET (shdrs[i].sh_offset); + internal->sh_size = BYTE_GET (shdrs[i].sh_size); + internal->sh_link = BYTE_GET (shdrs[i].sh_link); + internal->sh_info = BYTE_GET (shdrs[i].sh_info); + internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign); + internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize); + if (!probe) + validate_section_info (internal, orig_internal, i, filedata); + } + + free (shdrs); + return true; +} + #undef ElfXX From patchwork Fri Jul 31 12:11:18 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 140330 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 355154B9DB4B for ; Fri, 31 Jul 2026 12:12:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 355154B9DB4B Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=ZRIr0WCC X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by sourceware.org (Postfix) with ESMTPS id 6D7044B1A378 for ; Fri, 31 Jul 2026 12:11:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6D7044B1A378 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6D7044B1A378 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::436 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499880; cv=none; b=L+tuLdHdJPRxKeqnxo1peYoTZ0NAXPjzlYFQikatev7cAwzwC5nMA/Tmt8JJDBAt4VgL3ISI0bWKp3mramKTbDcFt0T4/ZuYVvRXUIKhypefMKNaVhVDH4GSq25ILTTLWUiDTOcZFF5qa742HIH8IPbbbWOgDrk2LJmP6HwerLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499880; c=relaxed/simple; bh=MMtQ9MSNzHYNPzRyqvB2L5H4m2Qcwwd3LqkcxtvHcrk=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=RLZmB68QhY8888XYtiDz2VSqyPb3qwwT3VHPcmhODSp4QcDjK28y3FStuKlLXxXhT2yTQnI3pEWVThTnelJZe8E4GNpNG04w+BabMUrmWuQzbnLUWJ0chwnFpK1ZA60qNEZ+WxHrD+3UEPheQIiyrxfMqcHEqihs6fEBntkoB8w= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=ZRIr0WCC DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6D7044B1A378 Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-47f3b39f2a1so226269f8f.2 for ; Fri, 31 Jul 2026 05:11:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1785499879; x=1786104679; darn=sourceware.org; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=KC8pNtQJXR2RROBXDg5dmi/SSoL2v57Nc/53v/8rl4c=; b=ZRIr0WCCamD7q4s6RJpdVBVs41AsP25oic4aQLG2upIgdfR3+AhQqtUjnCuYiHR7rC Mqet3Xto1iRftnFj3cmg9C3hKJUhSmpMDwqbmJ3SjqIo81f6trORNKTqVoadyupuVmhf yw/UyDMbaN4ApOYireJl/RAsqstUREFUUkk56FBP2m//mN+oBg50zEC3zA6bgCGH9jDD a+aSwGdKZ11PealULH5DgoNA8HeDWlYpcYcbd126WA+eVsj/OidUxmTg24zIiLMBvgIp 0VTh/THmWQJGQbPJQfpxDuFTzhl0f4M3CgqXh2xEhUBdmWgnfiEHCIjRuFVRw2lOFXxA NR0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785499879; x=1786104679; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=KC8pNtQJXR2RROBXDg5dmi/SSoL2v57Nc/53v/8rl4c=; b=OXWLjD41h7pbjK2iLLilUBAfJrGrSDzTfxUKOxI7RMSBMl0SkDv4RrwHargWCP+Aaf b7sLHrvbNuwvVjY7k+gVXZ756c15TdeQtkaMN+Pf4yRj0qbnpPmxrL07F4zfaY7iAq/8 mZBJL4IHb8r9FPxT3qf5+ALlx+2ls+2EtGIjsh8psSdcIcjeiLNIlU13FWkWm9Vf6yU2 IY1HX67EjVx2ZQHG324VJvOMDUChs/ilfYEIbmIRyWjQYS+UwLTmLeJaAwmRTBvvH9fN GPKklHhzR5atx8vbaFTzfD6W7OwOA3R01UfVFVoZlW4HgvnCkskn4b34cUbqmeeNWJyT xJ1A== X-Gm-Message-State: AOJu0YxxUopcjYIh95kQjL+orES+oLsMQD+YgVlx8Fm+ScXEo1xmodg7 WWddN1rdig3BxO73JiFKZZF9H0STJRfItE3Fu1ND4hZeG0ocISiGC3BUtQ8+EFyOwawyt9SaogW faZFoAw== X-Gm-Gg: AR+sD12yGZu6AiX/wkisKP3lqx0fAkaKMpmxIjj0fJXf9luRM3o0ODIhZzxhllXsaBA C4excwRRcZeQZuH8DJaI+SJHmZqhaAL0dXS2C12GSAvNqblDlPFvT857YBgEyLhLE59VgFYZGs9 uI+dQJh4e8vSuO0Lb1/lPcfxFK2DHR3RQHh2sNmQgihcBGa2bgOBwJc3B1lLQFT8BJjT7C8G7T1 xwm3Pqv0RPALZUT3DBZ2T5/St1j/olS+Z+9W8hsxfelalldrNddAVP0QNRXUJhYGFQeeDMI2X+I ht5O2Yb+bSoSL192aU410phhvHZ2ghY3vvllUs+lNLcRxQAUH9LDJRuq2Letk/r/4mpxYJfOe+m kj2nwCaZfaz/NtNTvwwcPKrlfzVIIPcjgXcphGZd3qaWrmjTqeKhD/B/w5Guxcb047peYGzd34F X+mViI7JNHDfx04D41TbQVlJ0HmdYs3/GmtJXsfxUMJwX9zfow4SqiWrdpQbZjrJZAMYWEKDB2w oPikL4t41RRWnmUCqClNn6sxZHCDhHzotirIiB6AWCr9Jhhb8M/BlltgQHua6M= X-Received: by 2002:a05:6000:1789:b0:47f:93d8:f480 with SMTP id ffacd0b85a97d-47fd2b4d714mr4341263f8f.39.1785499879235; Fri, 31 Jul 2026 05:11:19 -0700 (PDT) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd456220esm4329558f8f.18.2026.07.31.05.11.18 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 31 Jul 2026 05:11:18 -0700 (PDT) Message-ID: Date: Fri, 31 Jul 2026 14:11:18 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 3/5] readelf: fold get_{32,64}bit_elf_symbols() From: Jan Beulich To: Binutils References: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> X-Spam-Status: No, score=-3015.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org PR binutils/34356 They're identical except for the types used and the order of fields processed. The latter doesn't matter for correctness, and the former can be addressed by compiling the same code twice. --- v2: Use new file readelf-nn.c. --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -7871,250 +7871,14 @@ get_section_headers (Filedata *filedata, } static Elf_Internal_Sym * -get_32bit_elf_symbols (Filedata *filedata, - Elf_Internal_Shdr *section, - uint64_t *num_syms_return) -{ - uint64_t number = 0; - Elf32_External_Sym * esyms = NULL; - Elf_External_Sym_Shndx * shndx = NULL; - Elf_Internal_Sym * isyms = NULL; - Elf_Internal_Sym * psym; - unsigned int j; - elf_section_list * entry; - - if (section->sh_size == 0) - { - if (num_syms_return != NULL) - * num_syms_return = 0; - return NULL; - } - - /* Run some sanity checks first. */ - if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size) - { - error (_("Section %s has an invalid sh_entsize of %#" PRIx64 "\n"), - printable_section_name (filedata, section), - section->sh_entsize); - goto exit_point; - } - - if (section->sh_size > filedata->file_size) - { - error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"), - printable_section_name (filedata, section), - section->sh_size); - goto exit_point; - } - - number = section->sh_size / section->sh_entsize; - - if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1) - { - error (_("Size (%#" PRIx64 ") of section %s " - "is not a multiple of its sh_entsize (%#" PRIx64 ")\n"), - section->sh_size, - printable_section_name (filedata, section), - section->sh_entsize); - goto exit_point; - } - - esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1, - section->sh_size, _("symbols")); - if (esyms == NULL) - goto exit_point; - - shndx = NULL; - for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next) - { - if (entry->hdr->sh_link != (size_t) (section - filedata->section_headers)) - continue; - - if (shndx != NULL) - { - error (_("Multiple symbol table index sections associated with the same symbol section\n")); - free (shndx); - } - - shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, - entry->hdr->sh_offset, - 1, entry->hdr->sh_size, - _("symbol table section indices")); - if (shndx == NULL) - goto exit_point; - - /* PR17531: file: heap-buffer-overflow */ - if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) - { - error (_("Index section %s has an sh_size of %#" PRIx64 " - expected %#" PRIx64 "\n"), - printable_section_name (filedata, entry->hdr), - entry->hdr->sh_size, - section->sh_size); - goto exit_point; - } - } - - isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym)); - - if (isyms == NULL) - { - error (_("Out of memory reading %" PRIu64 " symbols\n"), number); - goto exit_point; - } - - for (j = 0, psym = isyms; j < number; j++, psym++) - { - psym->st_name = BYTE_GET (esyms[j].st_name); - psym->st_value = BYTE_GET (esyms[j].st_value); - psym->st_size = BYTE_GET (esyms[j].st_size); - psym->st_shndx = BYTE_GET (esyms[j].st_shndx); - if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL) - psym->st_shndx - = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j])); - else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff)) - psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff); - psym->st_info = BYTE_GET (esyms[j].st_info); - psym->st_other = BYTE_GET (esyms[j].st_other); - } - - exit_point: - free (shndx); - free (esyms); - - if (num_syms_return != NULL) - * num_syms_return = isyms == NULL ? 0 : number; - - return isyms; -} - -static Elf_Internal_Sym * -get_64bit_elf_symbols (Filedata *filedata, - Elf_Internal_Shdr *section, - uint64_t *num_syms_return) -{ - uint64_t number = 0; - Elf64_External_Sym * esyms = NULL; - Elf_External_Sym_Shndx * shndx = NULL; - Elf_Internal_Sym * isyms = NULL; - Elf_Internal_Sym * psym; - unsigned int j; - elf_section_list * entry; - - if (section->sh_size == 0) - { - if (num_syms_return != NULL) - * num_syms_return = 0; - return NULL; - } - - /* Run some sanity checks first. */ - if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size) - { - error (_("Section %s has an invalid sh_entsize of %#" PRIx64 "\n"), - printable_section_name (filedata, section), - section->sh_entsize); - goto exit_point; - } - - if (section->sh_size > filedata->file_size) - { - error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"), - printable_section_name (filedata, section), - section->sh_size); - goto exit_point; - } - - number = section->sh_size / section->sh_entsize; - - if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1) - { - error (_("Size (%#" PRIx64 ") of section %s " - "is not a multiple of its sh_entsize (%#" PRIx64 ")\n"), - section->sh_size, - printable_section_name (filedata, section), - section->sh_entsize); - goto exit_point; - } - - esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1, - section->sh_size, _("symbols")); - if (!esyms) - goto exit_point; - - shndx = NULL; - for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next) - { - if (entry->hdr->sh_link != (size_t) (section - filedata->section_headers)) - continue; - - if (shndx != NULL) - { - error (_("Multiple symbol table index sections associated with the same symbol section\n")); - free (shndx); - } - - shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, - entry->hdr->sh_offset, - 1, entry->hdr->sh_size, - _("symbol table section indices")); - if (shndx == NULL) - goto exit_point; - - /* PR17531: file: heap-buffer-overflow */ - if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) - { - error (_("Index section %s has an sh_size of %#" PRIx64 " - expected %#" PRIx64 "\n"), - printable_section_name (filedata, entry->hdr), - entry->hdr->sh_size, - section->sh_size); - goto exit_point; - } - } - - isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym)); - - if (isyms == NULL) - { - error (_("Out of memory reading %" PRIu64 " symbols\n"), number); - goto exit_point; - } - - for (j = 0, psym = isyms; j < number; j++, psym++) - { - psym->st_name = BYTE_GET (esyms[j].st_name); - psym->st_info = BYTE_GET (esyms[j].st_info); - psym->st_other = BYTE_GET (esyms[j].st_other); - psym->st_shndx = BYTE_GET (esyms[j].st_shndx); - - if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL) - psym->st_shndx - = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j])); - else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff)) - psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff); - - psym->st_value = BYTE_GET (esyms[j].st_value); - psym->st_size = BYTE_GET (esyms[j].st_size); - } - - exit_point: - free (shndx); - free (esyms); - - if (num_syms_return != NULL) - * num_syms_return = isyms == NULL ? 0 : number; - - return isyms; -} - -static Elf_Internal_Sym * get_elf_symbols (Filedata *filedata, Elf_Internal_Shdr *section, uint64_t *num_syms_return) { if (is_32bit_elf) - return get_32bit_elf_symbols (filedata, section, num_syms_return); + return Elf32_get_symbols (filedata, section, num_syms_return); else - return get_64bit_elf_symbols (filedata, section, num_syms_return); + return Elf64_get_symbols (filedata, section, num_syms_return); } static const char * --- a/binutils/readelf-nn.c +++ b/binutils/readelf-nn.c @@ -162,4 +162,122 @@ ElfXX(_get_section_headers) (Filedata * return true; } +static Elf_Internal_Sym * +ElfXX(_get_symbols) (Filedata *filedata, const Elf_Internal_Shdr *section, + uint64_t *num_syms_return) +{ + uint64_t number = 0; + ElfXX(_External_Sym) * esyms = NULL; + Elf_External_Sym_Shndx * shndx = NULL; + Elf_Internal_Sym * isyms = NULL; + Elf_Internal_Sym * psym; + unsigned int j; + elf_section_list * entry; + + if (section->sh_size == 0) + { + if (num_syms_return != NULL) + * num_syms_return = 0; + return NULL; + } + + /* Run some sanity checks first. */ + if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size) + { + error (_("Section %s has an invalid sh_entsize of %#" PRIx64 "\n"), + printable_section_name (filedata, section), + section->sh_entsize); + goto exit_point; + } + + if (section->sh_size > filedata->file_size) + { + error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"), + printable_section_name (filedata, section), + section->sh_size); + goto exit_point; + } + + number = section->sh_size / section->sh_entsize; + + if (number * sizeof (*esyms) > section->sh_size + 1) + { + error (_("Size (%#" PRIx64 ") of section %s " + "is not a multiple of its sh_entsize (%#" PRIx64 ")\n"), + section->sh_size, + printable_section_name (filedata, section), + section->sh_entsize); + goto exit_point; + } + + esyms = get_data (NULL, filedata, section->sh_offset, 1, section->sh_size, + _("symbols")); + if (esyms == NULL) + goto exit_point; + + shndx = NULL; + for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next) + { + if (entry->hdr->sh_link != (size_t) (section - filedata->section_headers)) + continue; + + if (shndx != NULL) + { + error (_("Multiple symbol table index sections associated with the same symbol section\n")); + free (shndx); + } + + shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, + entry->hdr->sh_offset, + 1, entry->hdr->sh_size, + _("symbol table section indices")); + if (shndx == NULL) + goto exit_point; + + /* PR17531: file: heap-buffer-overflow */ + if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) + { + error (_("Index section %s has an sh_size of %#" PRIx64 " - expected %#" PRIx64 "\n"), + printable_section_name (filedata, entry->hdr), + entry->hdr->sh_size, + section->sh_size); + goto exit_point; + } + } + + isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym)); + + if (isyms == NULL) + { + error (_("Out of memory reading %" PRIu64 " symbols\n"), number); + goto exit_point; + } + + for (j = 0, psym = isyms; j < number; j++, psym++) + { + psym->st_name = BYTE_GET (esyms[j].st_name); + psym->st_value = BYTE_GET (esyms[j].st_value); + psym->st_size = BYTE_GET (esyms[j].st_size); + psym->st_shndx = BYTE_GET (esyms[j].st_shndx); + + if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL) + psym->st_shndx + = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j])); + else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff)) + psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff); + + psym->st_info = BYTE_GET (esyms[j].st_info); + psym->st_other = BYTE_GET (esyms[j].st_other); + } + + exit_point: + free (shndx); + free (esyms); + + if (num_syms_return != NULL) + * num_syms_return = isyms == NULL ? 0 : number; + + return isyms; +} + #undef ElfXX From patchwork Fri Jul 31 12:11:38 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 140331 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1E52E4B1970E for ; Fri, 31 Jul 2026 12:12:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1E52E4B1970E Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=DKykreXL X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id C001C4B1A2BE for ; Fri, 31 Jul 2026 12:11:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C001C4B1A2BE Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C001C4B1A2BE Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::42d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499901; cv=none; b=iIfQ66v2XYeBm2AmLl24bbSsD+a4hPxTN2CrmteammYINBr0kSfPuDqD4PvWvxsbzO5ZGN2hhVH/p2fie2+Xg53NdGggtD4eN5yDLqtwT1sjq3iYZMQTu5k41duwb0on8EDYYQIuzP6byIQWk5O/c4idFPXaB3YBOEuPaIA3CAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499901; c=relaxed/simple; bh=+MdAarQRZP7xfr3hzqZ4fc+GQwe0sfk858kq0YUZTx4=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=A3TgaWSdoswnb9W2HrRSnYYShzSQmXLpOyqPmnwCh+bVsBTNEYWXm+aKZxvwWVXXB8qgrcAQQ2AVRslswUHWbZ49/vo7dX+bgQIp3EtftxBs179hTNmZCDMc4uk0FUEhJOJg1q33Q29OIt/KinaSjwNLQCWbhqwDVH6w8bR1ggE= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=DKykreXL DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C001C4B1A2BE Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-472326ca506so634172f8f.2 for ; Fri, 31 Jul 2026 05:11:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1785499900; x=1786104700; darn=sourceware.org; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=rLbFfG+cLqdPeqn9THm+uYx+jwyt7wpAiPm8ei0y//Q=; b=DKykreXLL9jhaXk5/SXNjI50zP8MVjZ883i//34fFf1YSR0ATikYihAuhq9vP7TFkk osG3VkB4FHlCbVAXDhcuPln2epUuDzrihfb847L062zVR3RC2HdeEEFqYWMByYvElxFB XXXL9ZHYJKEigJSaZCMlIifVJeKXFjLrclyZFUyb+s/DPdTfnPVxFnppLbhl2p7mybiu OkVHuQV1OeG+eWtbYKzYrPTLk+DxZNnLA6cDX8rgau7EmANcxb5tMyV2ndaMQCME6RmC VsKLVnleGQx62Y0ZCNxWzC3wDy6zLYKhHgarkY5hy+5EoVX8iMjt11mwdy1XZOPcQOGE d2yQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785499900; x=1786104700; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rLbFfG+cLqdPeqn9THm+uYx+jwyt7wpAiPm8ei0y//Q=; b=T2VXLkHH9uFIqu2URoa4aFZt4LoqGraulis8W4zqA3gLxMh7TNxTRsM/8B/aB0A0gr 0feUHqwpXDKq9dJ0EwnaJ9LQoWmjm8CbnWnMJSx8uAmvUk65IOP5QJAcvp6K05mGdT5h o8BIVpJofUsei4NPAKAk31mLzmWd81a+BcRxf/K60f/ccM/sRkmGZqBL2auF/pbLdu7V CZvipsMlt19vIUBiioryD4IcvNJQxJ6NMN9OslVELF1Gw9ijMif31zV98O2WQQuGbol1 3383RFHkItzYJ0o5v0U6I0reN9MoKQOeEv2nKJMnwdSHGaHb3ilRVKpD3W+1w5yg7BEs HSpQ== X-Gm-Message-State: AOJu0YzLWlGRgsGmtRfWahOtuMRcUegFnP44a7R2V4uwtgddycEYwm29 bki8xJOB9YZ3OFFQ2crQeBECkjDSj7TQTiylemEcJj5dB+rdYH5gOMVM0CPv0ONd47pHIDM6SRt K7GSEAg== X-Gm-Gg: AR+sD12+dVhCa8BRx3yPBPPr4TxJRYepHRVS3/yEIczuu1qWYdLu5/C3FIB7zNhsSo5 vKKa6gbZSfSKN5rk70CZ/O78lM5Dr+OLDOisK/WKHlHEf0Ne9ZMcdZs/RFvRmyc3B4YADCk02Wo JLS9yZiJ/Zm6vDgJ9Jc3EiQ5GGknL8JJL1eGSrsJVEv0Ao7KCyP1SHx9BlVbZX6FKPWIMD9sWwv +le70813nT/LfD/qELXcd2fY57Qq3MEQhbXOgE0ellhQDeFtVi1UkF1W675AHPpbfCDhxiPaFs1 hQIa5ft+W9gYzVsn0bnNBoBJGOnFB8f6tbQ34Bkx0As0btfg/io5sTE1adGS3mBBFMJxnzIjFzZ bSx45aei/pymMc7FQWAy3WBP44cM0uMWfzNdhUvX1EBhgcRDKzYOU++Itpx6YegqBV4V+1ELCZ6 nUvKKu56LZkQBv7gCz//I51oosPvyq+KH7c/iSbnnaKmXIQz4s2sT0Pq4SMGNgMopIJ+FX9MNoC bzjg5nuLZ6kZVkJI1AL2V6I4uCs6q2KO7qE43qdWEffmQhITnCu X-Received: by 2002:a05:6000:25f6:b0:47f:9de0:c27f with SMTP id ffacd0b85a97d-47fd2ab78d5mr4317314f8f.1.1785499899637; Fri, 31 Jul 2026 05:11:39 -0700 (PDT) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd456262bsm3713509f8f.17.2026.07.31.05.11.39 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 31 Jul 2026 05:11:39 -0700 (PDT) Message-ID: <213ad5b3-9a3d-4cc1-976e-83f9c0074b82@suse.com> Date: Fri, 31 Jul 2026 14:11:38 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 4/5] readelf: fold get_{32,64}bit_dynamic_section() From: Jan Beulich To: Binutils References: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> X-Spam-Status: No, score=-3015.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org PR binutils/34356 They're identical except for the types used, which can be addressed by compiling the same code twice. --- v2: Use new file readelf-nn.c. --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -12132,116 +12132,15 @@ dynamic_section_ia64_val (Elf_Internal_D } static bool -get_32bit_dynamic_section (Filedata * filedata) -{ - Elf32_External_Dyn * edyn; - Elf32_External_Dyn * ext; - Elf_Internal_Dyn * entry; - - edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, - filedata->dynamic_addr, 1, - filedata->dynamic_size, - _("dynamic section")); - if (!edyn) - return false; - - /* SGI's ELF has more than one section in the DYNAMIC segment, and we - might not have the luxury of section headers. Look for the DT_NULL - terminator to determine the number of entries. */ - for (ext = edyn, filedata->dynamic_nent = 0; - (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size; - ext++) - { - filedata->dynamic_nent++; - if (BYTE_GET (ext->d_tag) == DT_NULL) - break; - } - - filedata->dynamic_section - = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry)); - if (filedata->dynamic_section == NULL) - { - error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"), - filedata->dynamic_nent); - free (edyn); - return false; - } - - for (ext = edyn, entry = filedata->dynamic_section; - entry < filedata->dynamic_section + filedata->dynamic_nent; - ext++, entry++) - { - entry->d_tag = BYTE_GET (ext->d_tag); - entry->d_un.d_val = BYTE_GET (ext->d_un.d_val); - } - - free (edyn); - - return true; -} - -static bool -get_64bit_dynamic_section (Filedata * filedata) -{ - Elf64_External_Dyn * edyn; - Elf64_External_Dyn * ext; - Elf_Internal_Dyn * entry; - - /* Read in the data. */ - edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, - filedata->dynamic_addr, 1, - filedata->dynamic_size, - _("dynamic section")); - if (!edyn) - return false; - - /* SGI's ELF has more than one section in the DYNAMIC segment, and we - might not have the luxury of section headers. Look for the DT_NULL - terminator to determine the number of entries. */ - for (ext = edyn, filedata->dynamic_nent = 0; - /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */ - (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size; - ext++) - { - filedata->dynamic_nent++; - if (BYTE_GET (ext->d_tag) == DT_NULL) - break; - } - - filedata->dynamic_section - = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry)); - if (filedata->dynamic_section == NULL) - { - error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"), - filedata->dynamic_nent); - free (edyn); - return false; - } - - /* Convert from external to internal formats. */ - for (ext = edyn, entry = filedata->dynamic_section; - entry < filedata->dynamic_section + filedata->dynamic_nent; - ext++, entry++) - { - entry->d_tag = BYTE_GET (ext->d_tag); - entry->d_un.d_val = BYTE_GET (ext->d_un.d_val); - } - - free (edyn); - - return true; -} - -static bool get_dynamic_section (Filedata *filedata) { if (filedata->dynamic_section) return true; if (is_32bit_elf) - return get_32bit_dynamic_section (filedata); + return Elf32_get_dynamic_section (filedata); else - return get_64bit_dynamic_section (filedata); + return Elf64_get_dynamic_section (filedata); } static void --- a/binutils/readelf-nn.c +++ b/binutils/readelf-nn.c @@ -280,4 +280,52 @@ ElfXX(_get_symbols) (Filedata *filedata, return isyms; } +static bool +ElfXX(_get_dynamic_section) (Filedata * filedata) +{ + ElfXX(_External_Dyn) * edyn, * ext; + Elf_Internal_Dyn * entry; + + edyn = get_data (NULL, filedata, filedata->dynamic_addr, 1, + filedata->dynamic_size, _("dynamic section")); + if (!edyn) + return false; + + /* SGI's ELF has more than one section in the DYNAMIC segment, and we + might not have the luxury of section headers. Look for the DT_NULL + terminator to determine the number of entries. */ + for (ext = edyn, filedata->dynamic_nent = 0; + /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */ + (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size; + ext++) + { + filedata->dynamic_nent++; + if (BYTE_GET (ext->d_tag) == DT_NULL) + break; + } + + filedata->dynamic_section + = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry)); + if (filedata->dynamic_section == NULL) + { + error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"), + filedata->dynamic_nent); + free (edyn); + return false; + } + + /* Convert from external to internal formats. */ + for (ext = edyn, entry = filedata->dynamic_section; + entry < filedata->dynamic_section + filedata->dynamic_nent; + ext++, entry++) + { + entry->d_tag = BYTE_GET (ext->d_tag); + entry->d_un.d_val = BYTE_GET (ext->d_un.d_val); + } + + free (edyn); + + return true; +} + #undef ElfXX From patchwork Fri Jul 31 12:12:33 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 140333 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1B83C4BA2E3F for ; Fri, 31 Jul 2026 12:14:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1B83C4BA2E3F Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=MjYtdZ99 X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by sourceware.org (Postfix) with ESMTPS id A95BC4BB3BD2 for ; Fri, 31 Jul 2026 12:12:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A95BC4BB3BD2 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A95BC4BB3BD2 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::435 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499955; cv=none; b=Xyw6wdXrbbx3TLUUavK+UWq/WcKsYaArV4FVUE4jLoqFeQwpqh1RY7mzp3l7XPK8vLz2WIs2i3lsDQW4uk7ru3E4a8AWdBim/xP9RZfM+A1vXUaGu9vNEPtvCzlbemuWSYqkIl4KuBpzZ9R6Y2UEhXRuTM854BrCQMQAfPHQD6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785499955; c=relaxed/simple; bh=N8IW7aCl2RCeYfeevjK5daLvWNRT0dbkbTqSd7raGrs=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=hEy8azTfYbpz3hVNWk+XrH4n1EdyDuw8ylD/G+e/qV6rhv9FpgnxI27f5c2qsQlQ4yHopSS4G7Az3rYd0yn5+tqQEP4O9c11qxHyGkSJpKBrK69XQzaWGzsuD/0OXYityhikqIo5/fkgtu1n85iRyrECvfzphIWrxKUN/xDxftE= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=MjYtdZ99 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A95BC4BB3BD2 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-472326ca506so634764f8f.2 for ; Fri, 31 Jul 2026 05:12:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1785499954; x=1786104754; darn=sourceware.org; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=h6tGXdCmdQslM1Qc/O6JCx2oK8pUAUgXw9FAaLw4lYY=; b=MjYtdZ994/0vrstEe5cAc8ZTxSsOJGPd37TKHGvc2EvkF1aAd1X6cpO091FUKk43c7 J+NfMaDyeSs6lhG5ad5/1wDe0EFHtXQD+/39+mhE/wyhPm1lJS8FX65NAOvCnVGYNlJG 882k2oSUM1wra5tFk/m1VWVaJ35cq8fm/8+NKSV8UjkL2RdXxix7PGGpToO5OvMv+rYD CgFEJ4Y0HkF5xm488lPR4o5dtJBgE1wbl/Hk8pHtirTZBL1Rrj1NRJ8uOS7/+bwCQ/Yi Ggk/jseQ2FHr42AxmP2n0UQYn6ufFjTFtw0JliZLuqb55BkTUmEMn6xMiYuRmSwp5YQP q7CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785499954; x=1786104754; h=content-transfer-encoding:content-type:in-reply-to:autocrypt :content-language:references:to:from:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=h6tGXdCmdQslM1Qc/O6JCx2oK8pUAUgXw9FAaLw4lYY=; b=dan/uSMoFq5YUB6CHov/aHF1mzug0AZUJb4p7ZqqDk4KV386No+ciQNQ8Ai58Lb2e0 P+Y2oruhP3odpHyKPGsGCIc2UvdFUj+AAyEdSa1AKT7X9RTXp0UfsXijblZIeKaqJmKJ ovyiTp3e6huon28NtkVzmgwV6S1Drf9JqX6mtyx6d1DoIuBI+8gYP7WMSqHOzY4E5GDc CrdDCj7XUQmZcREAZsApR57p8Oz3eehidSU/AEn6A3IoRnduMguPUoKC4pVbYDoLOpp6 09wsLOi7oqODGra0oxh+LwrzIN7VF5Tw/zDD1dRwFYsSZOZHdXNgA89tNzaa+c9P5ZzE /aKQ== X-Gm-Message-State: AOJu0Yxt1swHVeiemFu+g/fTWjCUdQ5fW7OzgF2ATKuL++fWmKTqX6Mg 8f/AGsqcM2x/yVHqYYavy+5ERt8YYtmiJDeCmvMLrdga4XPdgW3fM8qUHEVyvck9+Zh5fAnP833 /N6Y+tw== X-Gm-Gg: AR+sD137Mk0ts887NbdTb4MMelffMYqpwQ/1ql9+otVxaAvIQe9VBRFrH6wzSO7vNuq pH8GtHnF17Pd4VtO0vG3aIvcpDsIvMWdYhGWqv9IbfwCncgYkLfi/bv93WZYkAe8nCOVTopsluU aWNpdriAh+tId0QMa+TAGt3Rba2cooo7G8BvjnmCff9THGC/+sephrYjgN2AAAx+8/a8Yc8VUZx v7JW/kzX9z6FjCwjGgFkTm2Qgz2BOJPlvKBJtsIdMFdgPFkr5WRqJZ6c2cJkHE3b1z3r4TZrFd3 tKZy+gMJc9f40k7kvMJ5IVv1+6TwcijecgF+JEO9g5HB4sz8oC40SLnNewEDc05lXQCas5VD5on WClPsBdnBE7P/DDmPDNxbuYxygZm8cPyp5+utMdjOkUMOG0MdoyBbeABQUEit8SKC/YRzOI7aFU MxGqGB3M1xQL8F5fF7+gy0zdvrDjbyuaxFYnEI/YHi1y9UYiM1lOhsM6Pe+DrmzQvje+EtoRmGK dVp444SbltvmVJzWK9rUKz829kWERUnU+OQxi8dbBxAnZUVQlmWCpPQKwJ/B6c= X-Received: by 2002:a05:6000:18a8:b0:47d:fc23:abe8 with SMTP id ffacd0b85a97d-47fd2b2ee28mr4517785f8f.28.1785499954518; Fri, 31 Jul 2026 05:12:34 -0700 (PDT) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd42e42f8sm4017389f8f.16.2026.07.31.05.12.34 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 31 Jul 2026 05:12:34 -0700 (PDT) Message-ID: Date: Fri, 31 Jul 2026 14:12:33 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 5/5] readelf: move some code around From: Jan Beulich To: Binutils References: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <12e85879-b829-4652-9c87-473c0d8f296a@suse.com> X-Spam-Status: No, score=-3015.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org Avoid the need to forward-declare get_program_headers() and get_dynamic_section(); put them right after their bitness-dependent helpers (i.e. after the readelf-nn.c inclusion point). Then, to keep related things together, move get_section_headers() and get_elf_symbols() as well. Similarly get rid of the validate_section_info() forward decl again, putting the function definition (and its helper) there instead. --- One aspect I noticed: Instead of the trivial get_elf_symbols() wrapper we could use a function pointer. That, however, already wouldn't quite extend to get_section_headers() and get_dynamic_section(), let alone get_program_headers(), so would - overall - be of little help. --- v2: Re-do from scratch. --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3469,17 +3469,181 @@ get_dynamic_type (Filedata * filedata, u } } +/* Save the original section header values. */ + +static void +save_original_section_header_values (Elf_Internal_Shdr *internal, + Elf_Internal_Shdr **orig_internal) +{ + /* Nothing to do if they have already been saved. */ + if (*orig_internal != NULL) + return; + + *orig_internal = xmalloc (sizeof (**orig_internal)); + **orig_internal = *internal; +} + +/* Warn about and clear any invalid ELF section fields. */ + static void -validate_section_info (Elf_Internal_Shdr *, Elf_Internal_Shdr **, - unsigned int, Filedata *); +validate_section_info (Elf_Internal_Shdr *internal, + Elf_Internal_Shdr **orig_internal, + unsigned int i, Filedata *filedata) +{ + bool dynamic = orig_internal == NULL; + if (!dynamic) + { + if (internal->sh_link >= filedata->file_header.e_shnum + && !special_defined_section_index (filedata, + internal->sh_link)) + { + warn (_("out of range %s (%" PRIu64 ") for section %u\n"), + "sh_link", (uint64_t) internal->sh_link, i); + /* Save the original section header values before garbage + values are cleared. */ + save_original_section_header_values (internal, orig_internal); + internal->sh_link = 0; + } + + if ((internal->sh_flags & SHF_INFO_LINK) != 0 + && internal->sh_info > filedata->file_header.e_shnum) + { + warn (_("out of range %s (%" PRIu64 ") for section %u\n"), + "sh_info", (uint64_t) internal->sh_info, i); + save_original_section_header_values (internal, orig_internal); + internal->sh_info = 0; + } + } + + if (internal->sh_entsize > filedata->file_size) + { + if (dynamic) + warn (_("out of range %s (%" PRIu64 ")\n"), + "DT_RELRENT", (uint64_t) internal->sh_entsize); + else + { + warn (_("out of range %s (%" PRIu64 ") for section %u\n"), + "sh_entsize", (uint64_t) internal->sh_entsize, i); + save_original_section_header_values (internal, orig_internal); + } + internal->sh_entsize = 0; + } + + if (internal->sh_type != SHT_NOBITS) + { + uint64_t sh_offset = internal->sh_offset; + if (sh_offset > filedata->file_size) + { + if (dynamic) + warn (_("out of range %s (%" PRIu64 ")\n"), + "DT_RELR", sh_offset); + else + { + warn (_("out of range %s (%" PRIu64 ") for section %u\n"), + "sh_offset", sh_offset, i); + save_original_section_header_values (internal, orig_internal); + } + internal->sh_offset = 0; + internal->sh_size = 0; + } + else if (internal->sh_size > filedata->file_size - sh_offset) + { + if (dynamic) + warn (_("out of range %s (%" PRIu64 ")\n"), + "DT_RELRSZ", (uint64_t) internal->sh_size); + else + { + warn (_("out of range %s (%" PRIu64 ") for section %u\n"), + "sh_size", (uint64_t) internal->sh_size, i); + save_original_section_header_values (internal, orig_internal); + } + internal->sh_size = 0; + } + } +} #define ElfXX(n) Elf32 ## n #include "readelf-nn.c" #define ElfXX(n) Elf64 ## n #include "readelf-nn.c" -static bool get_program_headers (Filedata *); -static bool get_dynamic_section (Filedata *); +/* Returns TRUE if the program headers were read into `program_headers'. */ + +static bool +get_program_headers (Filedata * filedata) +{ + Elf_Internal_Phdr * phdrs; + + /* Check cache of prior read. */ + if (filedata->program_headers != NULL) + return true; + + /* Be kind to memory checkers by looking for + e_phnum values which we know must be invalid. */ + if (filedata->file_header.e_phnum + * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr)) + >= filedata->file_size) + { + error (_("Too many program headers - %#x - the file is not that big\n"), + filedata->file_header.e_phnum); + return false; + } + + phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum, + sizeof (Elf_Internal_Phdr)); + if (phdrs == NULL) + { + error (_("Out of memory reading %u program headers\n"), + filedata->file_header.e_phnum); + return false; + } + + if (is_32bit_elf + ? Elf32_get_program_headers (filedata, phdrs) + : Elf64_get_program_headers (filedata, phdrs)) + { + filedata->program_headers = phdrs; + return true; + } + + free (phdrs); + return false; +} + +static bool +get_section_headers (Filedata *filedata, bool probe) +{ + if (filedata->section_headers != NULL) + return true; + + if (is_32bit_elf) + return Elf32_get_section_headers (filedata, probe); + else + return Elf64_get_section_headers (filedata, probe); +} + +static Elf_Internal_Sym * +get_elf_symbols (Filedata *filedata, + Elf_Internal_Shdr *section, + uint64_t *num_syms_return) +{ + if (is_32bit_elf) + return Elf32_get_symbols (filedata, section, num_syms_return); + else + return Elf64_get_symbols (filedata, section, num_syms_return); +} + +static bool +get_dynamic_section (Filedata *filedata) +{ + if (filedata->dynamic_section) + return true; + + if (is_32bit_elf) + return Elf32_get_dynamic_section (filedata); + else + return Elf64_get_dynamic_section (filedata); +} static void locate_dynamic_section (Filedata *filedata) @@ -7375,49 +7539,6 @@ process_file_header (Filedata * filedata return true; } -/* Returns TRUE if the program headers were read into `program_headers'. */ - -static bool -get_program_headers (Filedata * filedata) -{ - Elf_Internal_Phdr * phdrs; - - /* Check cache of prior read. */ - if (filedata->program_headers != NULL) - return true; - - /* Be kind to memory checkers by looking for - e_phnum values which we know must be invalid. */ - if (filedata->file_header.e_phnum - * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr)) - >= filedata->file_size) - { - error (_("Too many program headers - %#x - the file is not that big\n"), - filedata->file_header.e_phnum); - return false; - } - - phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum, - sizeof (Elf_Internal_Phdr)); - if (phdrs == NULL) - { - error (_("Out of memory reading %u program headers\n"), - filedata->file_header.e_phnum); - return false; - } - - if (is_32bit_elf - ? Elf32_get_program_headers (filedata, phdrs) - : Elf64_get_program_headers (filedata, phdrs)) - { - filedata->program_headers = phdrs; - return true; - } - - free (phdrs); - return false; -} - /* Print program header info and locate dynamic section. */ static void @@ -7764,123 +7885,6 @@ offset_from_vma (Filedata * filedata, ui return vma; } -/* Save the original section header values. */ - -static void -save_original_section_header_values (Elf_Internal_Shdr *internal, - Elf_Internal_Shdr **orig_internal) -{ - /* Nothing to do if they have already been saved. */ - if (*orig_internal != NULL) - return; - - *orig_internal = xmalloc (sizeof (**orig_internal)); - **orig_internal = *internal; -} - - -/* Warn about and clear any invalid ELF section fields. */ - -static void -validate_section_info (Elf_Internal_Shdr *internal, - Elf_Internal_Shdr **orig_internal, - unsigned int i, Filedata *filedata) -{ - bool dynamic = orig_internal == NULL; - if (!dynamic) - { - if (internal->sh_link >= filedata->file_header.e_shnum - && !special_defined_section_index (filedata, - internal->sh_link)) - { - warn (_("out of range %s (%" PRIu64 ") for section %u\n"), - "sh_link", (uint64_t) internal->sh_link, i); - /* Save the original section header values before garbage - values are cleared. */ - save_original_section_header_values (internal, orig_internal); - internal->sh_link = 0; - } - - if ((internal->sh_flags & SHF_INFO_LINK) != 0 - && internal->sh_info > filedata->file_header.e_shnum) - { - warn (_("out of range %s (%" PRIu64 ") for section %u\n"), - "sh_info", (uint64_t) internal->sh_info, i); - save_original_section_header_values (internal, orig_internal); - internal->sh_info = 0; - } - } - - if (internal->sh_entsize > filedata->file_size) - { - if (dynamic) - warn (_("out of range %s (%" PRIu64 ")\n"), - "DT_RELRENT", (uint64_t) internal->sh_entsize); - else - { - warn (_("out of range %s (%" PRIu64 ") for section %u\n"), - "sh_entsize", (uint64_t) internal->sh_entsize, i); - save_original_section_header_values (internal, orig_internal); - } - internal->sh_entsize = 0; - } - - if (internal->sh_type != SHT_NOBITS) - { - uint64_t sh_offset = internal->sh_offset; - if (sh_offset > filedata->file_size) - { - if (dynamic) - warn (_("out of range %s (%" PRIu64 ")\n"), - "DT_RELR", sh_offset); - else - { - warn (_("out of range %s (%" PRIu64 ") for section %u\n"), - "sh_offset", sh_offset, i); - save_original_section_header_values (internal, orig_internal); - } - internal->sh_offset = 0; - internal->sh_size = 0; - } - else if (internal->sh_size > filedata->file_size - sh_offset) - { - if (dynamic) - warn (_("out of range %s (%" PRIu64 ")\n"), - "DT_RELRSZ", (uint64_t) internal->sh_size); - else - { - warn (_("out of range %s (%" PRIu64 ") for section %u\n"), - "sh_size", (uint64_t) internal->sh_size, i); - save_original_section_header_values (internal, orig_internal); - } - internal->sh_size = 0; - } - } -} - -static bool -get_section_headers (Filedata *filedata, bool probe) -{ - if (filedata->section_headers != NULL) - return true; - - if (is_32bit_elf) - return Elf32_get_section_headers (filedata, probe); - else - return Elf64_get_section_headers (filedata, probe); -} - -static Elf_Internal_Sym * -get_elf_symbols (Filedata *filedata, - Elf_Internal_Shdr *section, - uint64_t *num_syms_return) -{ - if (is_32bit_elf) - return Elf32_get_symbols (filedata, section, num_syms_return); - else - return Elf64_get_symbols (filedata, section, num_syms_return); -} - static const char * get_elf_section_flags (Filedata * filedata, uint64_t sh_flags) { @@ -12131,18 +12135,6 @@ dynamic_section_ia64_val (Elf_Internal_D putchar ('\n'); } -static bool -get_dynamic_section (Filedata *filedata) -{ - if (filedata->dynamic_section) - return true; - - if (is_32bit_elf) - return Elf32_get_dynamic_section (filedata); - else - return Elf64_get_dynamic_section (filedata); -} - static void print_dynamic_flags (uint64_t flags) {