From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by sourceware.org (Postfix) with ESMTPS id 4B3CB3858D28 for ; Mon, 1 Apr 2024 22:44:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4B3CB3858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4B3CB3858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1033 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712011471; cv=none; b=fto0JJ1qB4S3LYRHSGUgDI/NurxZdydzUpHBKdRVManE68PD0S+L6b4OYfYnB7W1GasVIxV9jAifjPM4kL+0+71sjT0bOR2hBdmxDvKYLQMDlwZZBqjM0It9eAzYM5ZvsQ5Wq4bpsBnvdlITkuT1QRfzOO33kj5k5RPmniCqUlU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712011471; c=relaxed/simple; bh=8r82eyfHirgqElzuCvBdbzsSdhfkYvw/lYkSZWHQSyQ=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=Lyo464cpdFO0UXsuASxxijCFrZ3bPMX+QNmj9NDTBvJb8EAsZ7ew77FjGP7M4ffN1JAtZa7IF9bA5jt9RurFLGoVXTyuIzlnXNU1yHyCKCDhMDFUjS8Ukr4VPw1oZGTzYDVs2k8lPL3pnvQzwLomoSsHNcpBgIlJOzjVZLIq9ks= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pj1-x1033.google.com with SMTP id 98e67ed59e1d1-29c14800a7fso2948576a91.2 for ; Mon, 01 Apr 2024 15:44:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712011468; x=1712616268; darn=sourceware.org; h=content-disposition:mime-version:message-id:subject:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=CdcH2Un6vyYJvK4wH9VdSmoDPPAMHnS7Lu7cjuAwYMk=; b=Al2QsEn9kQ/oWHW1kdg+r2MHZZUloyCIkOS5jqZ3zUxqchu9pF5ORH5wXy+YXySB+E Z7xMKecafF5HRFZczb5sqN+50M7/G+tzeJPE/0d0nqjcbhWZu7MabGVJG0jUjomqvuwm bmM3lZB8WDeoy4+tq6v1HG0NdbOEjJpnz9YlKeGzNolG+U/AMngYnr4PUAP/xlEmY+D1 EWe2R9pcY0r/CA/20Ao3SAXqswY4c9ClMxbaNzMCJmH8btI89/hXk2ubaQItIKghlgRW ByQ/983I2N/T3FmprfdZjmbYtOjVZpbutrnDcCyh7RhRYTV+t3HNs9YP1DsznnrRHKIA rG9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712011468; x=1712616268; h=content-disposition:mime-version:message-id:subject:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CdcH2Un6vyYJvK4wH9VdSmoDPPAMHnS7Lu7cjuAwYMk=; b=F7SnkhoIUc51Es1MGfr6uzFvRSQJc5MrVsSk2/91/FO74xpBlDje8GgmJoLgagYLZA g69waM/82h9spy9XPYQamA/S0iF6SHNlz41otQO7sbNBvwqkTke968zjmCuACQIxEoij pNjHaGlEtZn4U6MrUz0ZFqSY3ZRm24CEDvE2SCDF3gzto/2E8XtckSxbcl4X30VQo9fA R/uQBsLa6+UrIp7ayLNrCvyKJQg+Y151i6mO+IIVTBP66ZYPzQ8rbk/Wqd/ZJ31GkUWz zyz/Ex+5LGIYe7UENCRm3OpTgIicy4c2CJycsajTHF3fxuJ8V1I0COkEjdRP4CdsjPav 2HeQ== X-Gm-Message-State: AOJu0Ywxk3uf9AYdpenCHmpT5ib81gdUuHIMpsjXQpMbFtxwOmHBNikF wvbOQSQcApQIam8dovSUeSwhwSSD/T3lw8rI9Qc/J+Pzjx4YJRVKMUUIwu9f X-Google-Smtp-Source: AGHT+IEx61cfqXDsAnTwhA/0d0eACFnNWFua1GZthBM1DIMTWyqhBJ1umlVIJ994QBF/RVC1bzYBKA== X-Received: by 2002:a17:90a:880f:b0:29c:7537:afbc with SMTP id s15-20020a17090a880f00b0029c7537afbcmr8820372pjn.31.1712011467804; Mon, 01 Apr 2024 15:44:27 -0700 (PDT) Received: from squeak.grove.modra.org (158.106.96.58.static.exetel.com.au. [58.96.106.158]) by smtp.gmail.com with ESMTPSA id gn11-20020a17090ac78b00b0029bce05b7dfsm10302368pjb.32.2024.04.01.15.44.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Apr 2024 15:44:27 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id 010991140B37; Tue, 2 Apr 2024 09:14:23 +1030 (ACDT) Date: Tue, 2 Apr 2024 09:14:23 +1030 From: Alan Modra To: binutils@sourceware.org Subject: objdump --disassemble=sym peculiarities Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3033.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: Given this testcase: .text mov $x1,%eax f1: mov $f1,%eax .type f1,@function .size f1,.-f1 mov $x2,%eax f2: mov $f2,%eax .type f2,@function .size f2,.-f2+0x1000 #bad size objdump --reloc --disassemble=f1 prints 00000000 : 0: b8 00 00 00 00 mov $0x0,%eax and objdump --reloc --disassemble=f2 prints 0000000f : f: b8 0f 00 00 00 mov $0xf,%eax 10: R_386_32 .text It seems for f1 we get the insn before f1 and no reloc whereas, post 159daa36fa, f2 is disassembled correctly. Some analysis says that find_symbol_for_address may return a symbol past the current address, and reloc skipping is broken. Fix both of these problems. * objdump.c (disassemble_jumps, disassemble_bytes): Replace relppp with relpp, ie. don't update caller's rel_pp. Adjust calls. (disassemble_section): Skip over relocs inside loop rather than before loop. Revert 7e538762c2c1. If given a symbol, don't start disassembling until its address is reached. Correct end of function calculation. diff --git a/binutils/objdump.c b/binutils/objdump.c index 8293387558f..68da543e905 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -2946,7 +2946,7 @@ disassemble_jumps (struct disassemble_info * inf, bfd_vma start_offset, bfd_vma stop_offset, bfd_vma rel_offset, - arelent *** relppp, + arelent ** relpp, arelent ** relppend) { struct objdump_disasm_info *aux; @@ -2988,11 +2988,11 @@ disassemble_jumps (struct disassemble_info * inf, if (inf->disassembler_needs_relocs && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0 - && *relppp < relppend) + && relpp < relppend) { bfd_signed_vma distance_to_rel; - distance_to_rel = (**relppp)->address - (rel_offset + addr_offset); + distance_to_rel = (*relpp)->address - (rel_offset + addr_offset); /* Check to see if the current reloc is associated with the instruction that we are about to disassemble. */ @@ -3205,7 +3205,7 @@ disassemble_bytes (struct disassemble_info *inf, bfd_vma start_offset, bfd_vma stop_offset, bfd_vma rel_offset, - arelent ***relppp, + arelent **relpp, arelent **relppend) { struct objdump_disasm_info *aux; @@ -3377,13 +3377,13 @@ disassemble_bytes (struct disassemble_info *inf, if (inf->disassembler_needs_relocs && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0 - && *relppp < relppend) + && relpp < relppend) { bfd_signed_vma distance_to_rel; int max_reloc_offset = aux->abfd->arch_info->max_reloc_offset_into_insn; - distance_to_rel = ((**relppp)->address - rel_offset + distance_to_rel = ((*relpp)->address - rel_offset - addr_offset); insn_size = 0; @@ -3427,7 +3427,7 @@ disassemble_bytes (struct disassemble_info *inf, && distance_to_rel < insn_size / (int) opb)) { inf->flags |= INSN_HAS_RELOC; - aux->reloc = **relppp; + aux->reloc = *relpp; } } @@ -3600,14 +3600,14 @@ disassemble_bytes (struct disassemble_info *inf, need_nl = true; } - while ((*relppp) < relppend - && (**relppp)->address < rel_offset + addr_offset + octets / opb) + while (relpp < relppend + && (*relpp)->address < rel_offset + addr_offset + octets / opb) { if (dump_reloc_info || dump_dynamic_reloc_info) { arelent *q; - q = **relppp; + q = *relpp; if (wide_output) putchar ('\t'); @@ -3665,7 +3665,7 @@ disassemble_bytes (struct disassemble_info *inf, printf ("\n"); need_nl = false; } - ++(*relppp); + ++relpp; } if (need_nl) @@ -3809,12 +3809,6 @@ disassemble_section (bfd *abfd, asection *section, void *inf) if (sorted_symcount > 1) qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols); - /* Skip over the relocs belonging to addresses below the - start address. */ - while (rel_pp < rel_ppend - && (*rel_pp)->address < rel_offset + addr_offset) - ++rel_pp; - printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name)); /* Find the nearest symbol forwards from our current position. */ @@ -3846,6 +3840,12 @@ disassemble_section (bfd *abfd, asection *section, void *inf) bfd_vma nextstop_offset; bool insns; + /* Skip over the relocs belonging to addresses below the + start address. */ + while (rel_pp < rel_ppend + && (*rel_pp)->address < rel_offset + addr_offset) + ++rel_pp; + addr = section->vma + addr_offset; addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust; @@ -3912,17 +3912,11 @@ disassemble_section (bfd *abfd, asection *section, void *inf) /* We are not currently printing. Check to see if the current symbol matches the requested symbol. */ - if (streq (name, paux->symbol)) + if (streq (name, paux->symbol) + && bfd_asymbol_value (sym) <= addr) { do_print = true; - /* Skip over the relocs belonging to addresses below the - symbol address. */ - const bfd_vma sym_offset = bfd_asymbol_value (sym) - section->vma; - while (rel_pp < rel_ppend && - (*rel_pp)->address - rel_offset < sym_offset) - ++rel_pp; - loop_until = next_sym; if (sym->flags & BSF_FUNCTION) { @@ -3932,13 +3926,14 @@ disassemble_section (bfd *abfd, asection *section, void *inf) { bfd_size_type fsize = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; - if (addr_offset + fsize > addr_offset - && addr_offset + fsize <= stop_offset) + bfd_vma fend = + bfd_asymbol_value (sym) - section->vma + fsize; + if (fend > addr_offset && fend <= stop_offset) { /* Sym is a function symbol with a valid size associated with it. Disassemble to the end of the function. */ - stop_offset = addr_offset + fsize; + stop_offset = fend; loop_until = stop_offset_reached; } } @@ -4046,11 +4041,9 @@ disassemble_section (bfd *abfd, asection *section, void *inf) objdump_print_symname (abfd, &di, sym); /* Fetch jump information. */ - detected_jumps = disassemble_jumps - (pinfo, paux->disassemble_fn, - addr_offset, nextstop_offset, - rel_offset, &rel_pp, rel_ppend); - + detected_jumps = disassemble_jumps (pinfo, paux->disassemble_fn, + addr_offset, nextstop_offset, + rel_offset, rel_pp, rel_ppend); /* Free symbol name. */ free (sf.buffer); } @@ -4058,7 +4051,7 @@ disassemble_section (bfd *abfd, asection *section, void *inf) /* Add jumps to output. */ disassemble_bytes (pinfo, paux->disassemble_fn, insns, data, addr_offset, nextstop_offset, - rel_offset, &rel_pp, rel_ppend); + rel_offset, rel_pp, rel_ppend); /* Free jumps. */ while (detected_jumps) -- Alan Modra Australia Development Lab, IBM