From patchwork Wed Jan 18 06:26:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 44995 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2172719wrn; Tue, 17 Jan 2023 22:27:22 -0800 (PST) X-Google-Smtp-Source: AMrXdXtXqXVuVOYJycJjyxbx/4vIcgGoybIfelZ4CX/xBdGPEJar0rqBlvo+365XKw7U+Jp8e9nZ X-Received: by 2002:a05:6402:d47:b0:499:376e:6b31 with SMTP id ec7-20020a0564020d4700b00499376e6b31mr5321109edb.29.1674023242312; Tue, 17 Jan 2023 22:27:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674023242; cv=none; d=google.com; s=arc-20160816; b=YxIFNGS/7vpQ8LQAsDiuyn/ZAcbi3rYHO04WDx1skRhskrsYnK+qQ3pgfKQC1bhWz7 BOFj5XlFh3eRUQ2j0Sadvq8SqZUzYaGiooLMfl3hoD0H6dzDUdlaQfmzmehC/GD8k6B0 ode2bZwAr46D3V5Ipyx9eH5YfVpIu+AYT53aqIZDN2SSW5Eiesf+z8gJ0+kedm9b6kTZ xFB6WPo15mWNlErOa6mqbgk8YBAYKndego8FuZZDQ4BMTpVdtw818sbp9wsaQYFFFkeB ULepd6LbQKkgHY4LAwn7GoyMvbIx8DOEtlWCfeEeR1xb6uvrsoaQ0RF8/bj6oXjQPk3j G/kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=NnRcPyQL6N4p2Unwtu0ZN2KH6hVZS4ZrUG6IGhqGED0=; b=0eYaSQpQackmu2rxnAf8OIJAbRvkDz4PCLrLO3wFeccJVCA2++kdswmeL3IX2xkuP0 0b+35UuszF9yXKvLtJFBW5ctDeX+M/f94BTlsFQ7Vmr8g3tVQ16o+zlNSCo/VTyo4fIC agg+BGPUf3EjO4l0pLGvIyX1SGGRaic/7teTN8iJqKCzskH+V68Bf9cA+VBV/L4IgjLh yxWoZ658VudjDcrTsPeluj3LjrdPSWYNOns9l2S3hXNfk3P6rFH1P+u6LlG2dYjEIOP8 XaHdFiUb1aXknIuhANDV7Fq3GUO6U9XNbZNoXcR2+aVbqUIZrf4Ui7WJVGPhjFixwfOZ 6uVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=sYq6C3Hv; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id qa16-20020a170907869000b0087760800a8dsi337714ejc.623.2023.01.17.22.27.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:22 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=sYq6C3Hv; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 75B84385802F for ; Wed, 18 Jan 2023 06:27:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 75B84385802F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1674023236; bh=NnRcPyQL6N4p2Unwtu0ZN2KH6hVZS4ZrUG6IGhqGED0=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=sYq6C3HvieHV4SeMPH4gu7NwKANra6/J5ml2JTvjX2NqfX/Xk4y1XJxZsazTYdwC3 R58iqPSXRQGBgwUUWu/y8xqX8P7UShH1DABryHdrsKdQBbBjiWsBUIdWy84xrUaJXm 4ERqC9sbr4emdIzuTP6wJF3t1c3kxJPq5QHcepkI= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by sourceware.org (Postfix) with ESMTPS id 36B803858D35 for ; Wed, 18 Jan 2023 06:27:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 36B803858D35 Received: by mail-pg1-x52e.google.com with SMTP id g68so22672744pgc.11 for ; Tue, 17 Jan 2023 22:27:05 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NnRcPyQL6N4p2Unwtu0ZN2KH6hVZS4ZrUG6IGhqGED0=; b=Bi1K/BOwuPwLtIZMqatxlyVXSqalX47rSV4c/SbYCCOnpVpVwqiQ3mxxpYjlukH787 AzfBbI1iqBKve/rs16cpd0ZqiOQalHbh/1r3h7XHQFw8dnaj/4VWNIKFmv0TRuwuDOyR TSUDIIOZl285Tw8Ez5O+bfATbkPFclWjtmCCBbYw5W8pKJNMcNeLUjQloogbQ2npfZ+S LCiRtUfZIKSRmYOazcRexgH0uL68FkF+FsQmURi4qdetHrWsR0djjjAzl81vj7jjpaOG F8ZFHD0d84WjODhOZ2EUvZCffA8PEj5nCiZZeeSYgr4WkEfnfw7VRj7fl7tHacPB1FN4 Oz5Q== X-Gm-Message-State: AFqh2kr1u9mlWjrh/SENCnmANIUGIWtxQH49JlyjCQrVQV7sZevdCvG2 0A5Bj3GF6d1R9cb+l1baeXcY1vn+3oo= X-Received: by 2002:a62:aa0c:0:b0:58d:af0c:92f with SMTP id e12-20020a62aa0c000000b0058daf0c092fmr6127908pff.27.1674023223826; Tue, 17 Jan 2023 22:27:03 -0800 (PST) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:195b:3277:b45:6442]) by smtp.gmail.com with ESMTPSA id i15-20020a62870f000000b005890c5ed925sm16645908pfe.198.2023.01.17.22.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:03 -0800 (PST) To: binutils@sourceware.org Cc: Mark Harmstone Subject: [PATCH 1/4] howto install_addend Date: Wed, 18 Jan 2023 16:56:54 +1030 Message-Id: <20230118062657.1125934-2-amodra@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230118062657.1125934-1-amodra@gmail.com> References: <20230118062657.1125934-1-amodra@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3034.4 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755340595752034994?= X-GMAIL-MSGID: =?utf-8?q?1755340595752034994?= This adds a new flag to the reloc howtos that can be used to incrementally change targets over to simple bfd_install_relocation that just installs the addend without any weird adjustments. I've made a few other changes to bfd_install_relocation, removing dead code and comments that are really only applicable to bfd_perform_relocation. There is also a reloc offset bounds check change. I've moved the check to where data is accessed, as it seems reasonable to me to not perform the check unless it is needed. There is precedence for this; Relocations against absolute symbols already avoided the check. I also tried always performing the reloc offset check, and ran into testsuite failures due to _NONE and _ALIGN relocs at the end of sections. These likely would be fixed if all such reloc howtos had size set to zero, but I would rather not edit lots of files when it involves checking that target code does not use the size. * reloc.c (struct reloc_howto_struct): Add install_addend. (HOWTO_INSTALL_ADDEND): Define. (HOWTO): Init new field with HOWTO_INSTALL_ADDEND. (bfd_install_relocation): Remove comments copied from bfd_perform_relocation that aren't applicable here. Remove code dealing with output_offset and output_section. Just set relocation to addend if install_addend. Move reloc offset bounds check to just before section data is accessed, avoiding the check when data is not accessed. * bfd-in2.h: Regenerate. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index a20678f7c18..7c5953442aa 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2063,6 +2063,11 @@ struct reloc_howto_struct empty (e.g., ELF); this flag signals the fact. */ unsigned int pcrel_offset:1; + /* Whether bfd_install_relocation should just install the addend, + or should follow the practice of some older object formats and + install a value including the symbol. */ + unsigned int install_addend:1; + /* src_mask selects the part of the instruction (or data) to be used in the relocation sum. If the target relocations don't have an addend in the reloc, eg. ELF USE_REL, src_mask will normally equal @@ -2088,11 +2093,13 @@ struct reloc_howto_struct const char *name; }; +#define HOWTO_INSTALL_ADDEND 0 #define HOWTO_RSIZE(sz) ((sz) < 0 ? -(sz) : (sz)) #define HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \ inplace, src_mask, dst_mask, pcrel_off) \ { (unsigned) type, HOWTO_RSIZE (size), bits, right, left, ovf, \ - size < 0, pcrel, inplace, pcrel_off, src_mask, dst_mask, func, name } + size < 0, pcrel, inplace, pcrel_off, HOWTO_INSTALL_ADDEND, \ + src_mask, dst_mask, func, name } #define EMPTY_HOWTO(C) \ HOWTO ((C), 0, 1, 0, false, 0, complain_overflow_dont, NULL, \ NULL, false, 0, 0, false) diff --git a/bfd/reloc.c b/bfd/reloc.c index c543097b4d7..346dd7638db 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -338,6 +338,11 @@ CODE_FRAGMENT . empty (e.g., ELF); this flag signals the fact. *} . unsigned int pcrel_offset:1; . +. {* Whether bfd_install_relocation should just install the addend, +. or should follow the practice of some older object formats and +. install a value including the symbol. *} +. unsigned int install_addend:1; +. . {* src_mask selects the part of the instruction (or data) to be used . in the relocation sum. If the target relocations don't have an . addend in the reloc, eg. ELF USE_REL, src_mask will normally equal @@ -373,11 +378,13 @@ DESCRIPTION The HOWTO macro fills in a reloc_howto_type (a typedef for const struct reloc_howto_struct). +.#define HOWTO_INSTALL_ADDEND 0 .#define HOWTO_RSIZE(sz) ((sz) < 0 ? -(sz) : (sz)) .#define HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \ . inplace, src_mask, dst_mask, pcrel_off) \ . { (unsigned) type, HOWTO_RSIZE (size), bits, right, left, ovf, \ -. size < 0, pcrel, inplace, pcrel_off, src_mask, dst_mask, func, name } +. size < 0, pcrel, inplace, pcrel_off, HOWTO_INSTALL_ADDEND, \ +. src_mask, dst_mask, func, name } DESCRIPTION This is used to fill in an empty howto entry in an array. @@ -1019,8 +1026,6 @@ bfd_install_relocation (bfd *abfd, reloc_entry->address field might actually be valid for the backend concerned. It is up to the special_function itself to call bfd_reloc_offset_in_range if needed. */ - /* XXX - The special_function calls haven't been fixed up to deal - with creating new relocations and section contents. */ cont = howto->special_function (abfd, reloc_entry, symbol, /* XXX - Non-portable! */ ((bfd_byte *) data_start @@ -1030,197 +1035,81 @@ bfd_install_relocation (bfd *abfd, return cont; } - if (bfd_is_abs_section (symbol->section)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* No need to check for howto != NULL if !bfd_is_abs_section as - it will have been checked in `bfd_perform_relocation already'. */ - - /* Is the address of the relocation really within the section? */ - octets = reloc_entry->address * bfd_octets_per_byte (abfd, input_section); - if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets)) - return bfd_reloc_outofrange; - - /* Work out which section the relocation is targeted at and the - initial relocation command value. */ - - /* Get symbol value. (Common symbols are special.) */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; + if (howto->install_addend) + relocation = reloc_entry->addend; else - relocation = symbol->value; - - reloc_target_output_section = symbol->section->output_section; - - /* Convert input-section-relative symbol value to absolute. */ - if (! howto->partial_inplace) - output_base = 0; - else - output_base = reloc_target_output_section->vma; - - output_base += symbol->section->output_offset; - - /* If symbol addresses are in octets, convert to bytes. */ - if (bfd_get_flavour (abfd) == bfd_target_elf_flavour - && (symbol->section->flags & SEC_ELF_OCTETS)) - output_base *= bfd_octets_per_byte (abfd, input_section); + { + if (bfd_is_abs_section (symbol->section)) + return bfd_reloc_ok; - relocation += output_base; + /* Work out which section the relocation is targeted at and the + initial relocation command value. */ - /* Add in supplied addend. */ - relocation += reloc_entry->addend; + /* Get symbol value. (Common symbols are special.) */ + if (bfd_is_com_section (symbol->section)) + relocation = 0; + else + relocation = symbol->value; - /* Here the variable relocation holds the final address of the - symbol we are relocating against, plus any addend. */ + reloc_target_output_section = symbol->section; - if (howto->pc_relative) - { - /* This is a PC relative relocation. We want to set RELOCATION - to the distance between the address of the symbol and the - location. RELOCATION is already the address of the symbol. + /* Convert input-section-relative symbol value to absolute. */ + if (! howto->partial_inplace) + output_base = 0; + else + output_base = reloc_target_output_section->vma; - We start by subtracting the address of the section containing - the location. + /* If symbol addresses are in octets, convert to bytes. */ + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour + && (symbol->section->flags & SEC_ELF_OCTETS)) + output_base *= bfd_octets_per_byte (abfd, input_section); - If pcrel_offset is set, we must further subtract the position - of the location within the section. Some targets arrange for - the addend to be the negative of the position of the location - within the section; for example, i386-aout does this. For - i386-aout, pcrel_offset is FALSE. Some other targets do not - include the position of the location; for example, ELF. - For those targets, pcrel_offset is TRUE. + relocation += output_base; - If we are producing relocatable output, then we must ensure - that this reloc will be correctly computed when the final - relocation is done. If pcrel_offset is FALSE we want to wind - up with the negative of the location within the section, - which means we must adjust the existing addend by the change - in the location within the section. If pcrel_offset is TRUE - we do not want to adjust the existing addend at all. + /* Add in supplied addend. */ + relocation += reloc_entry->addend; - FIXME: This seems logical to me, but for the case of - producing relocatable output it is not what the code - actually does. I don't want to change it, because it seems - far too likely that something will break. */ + /* Here the variable relocation holds the final address of the + symbol we are relocating against, plus any addend. */ - relocation -= - input_section->output_section->vma + input_section->output_offset; + if (howto->pc_relative) + { + relocation -= input_section->vma; - if (howto->pcrel_offset && howto->partial_inplace) - relocation -= reloc_entry->address; + if (howto->pcrel_offset && howto->partial_inplace) + relocation -= reloc_entry->address; + } } - if (! howto->partial_inplace) + if (!howto->partial_inplace) { - /* This is a partial relocation, and we want to apply the relocation - to the reloc entry rather than the raw data. Modify the reloc - inplace to reflect what we now know. */ reloc_entry->addend = relocation; - reloc_entry->address += input_section->output_offset; return flag; } - else - { - /* This is a partial relocation, but inplace, so modify the - reloc record a bit. - - If we've relocated with a symbol with a section, change - into a ref to the section belonging to the symbol. */ - reloc_entry->address += input_section->output_offset; - - /* WTF?? */ - if (abfd->xvec->flavour == bfd_target_coff_flavour) - { - - /* For m68k-coff, the addend was being subtracted twice during - relocation with -r. Removing the line below this comment - fixes that problem; see PR 2953. - -However, Ian wrote the following, regarding removing the line below, -which explains why it is still enabled: --djm - -If you put a patch like that into BFD you need to check all the COFF -linkers. I am fairly certain that patch will break coff-i386 (e.g., -SCO); see coff_i386_reloc in coff-i386.c where I worked around the -problem in a different way. There may very well be a reason that the -code works as it does. - -Hmmm. The first obvious point is that bfd_install_relocation should -not have any tests that depend upon the flavour. It's seem like -entirely the wrong place for such a thing. The second obvious point -is that the current code ignores the reloc addend when producing -relocatable output for COFF. That's peculiar. In fact, I really -have no idea what the point of the line you want to remove is. - -A typical COFF reloc subtracts the old value of the symbol and adds in -the new value to the location in the object file (if it's a pc -relative reloc it adds the difference between the symbol value and the -location). When relocating we need to preserve that property. - -BFD handles this by setting the addend to the negative of the old -value of the symbol. Unfortunately it handles common symbols in a -non-standard way (it doesn't subtract the old value) but that's a -different story (we can't change it without losing backward -compatibility with old object files) (coff-i386 does subtract the old -value, to be compatible with existing coff-i386 targets, like SCO). - -So everything works fine when not producing relocatable output. When -we are producing relocatable output, logically we should do exactly -what we do when not producing relocatable output. Therefore, your -patch is correct. In fact, it should probably always just set -reloc_entry->addend to 0 for all cases, since it is, in fact, going to -add the value into the object file. This won't hurt the COFF code, -which doesn't use the addend; I'm not sure what it will do to other -formats (the thing to check for would be whether any formats both use -the addend and set partial_inplace). -When I wanted to make coff-i386 produce relocatable output, I ran -into the problem that you are running into: I wanted to remove that -line. Rather than risk it, I made the coff-i386 relocs use a special -function; it's coff_i386_reloc in coff-i386.c. The function -specifically adds the addend field into the object file, knowing that -bfd_install_relocation is not going to. If you remove that line, then -coff-i386.c will wind up adding the addend field in twice. It's -trivial to fix; it just needs to be done. - -The problem with removing the line is just that it may break some -working code. With BFD it's hard to be sure of anything. The right -way to deal with this is simply to build and test at least all the -supported COFF targets. It should be straightforward if time and disk -space consuming. For each target: - 1) build the linker - 2) generate some executable, and link it using -r (I would - probably use paranoia.o and link against newlib/libc.a, which - for all the supported targets would be available in - /usr/cygnus/progressive/H-host/target/lib/libc.a). - 3) make the change to reloc.c - 4) rebuild the linker - 5) repeat step 2 - 6) if the resulting object files are the same, you have at least - made it no worse - 7) if they are different you have to figure out which version is - right. */ - relocation -= reloc_entry->addend; - /* FIXME: There should be no target specific code here... */ - if (strcmp (abfd->xvec->name, "coff-z8k") != 0) - reloc_entry->addend = 0; - } - else - { - reloc_entry->addend = relocation; - } + if (!howto->install_addend + && abfd->xvec->flavour == bfd_target_coff_flavour) + { + /* This is just weird. We're subtracting out the original + addend, so that for COFF the addend is ignored??? */ + relocation -= reloc_entry->addend; + /* FIXME: There should be no target specific code here... */ + if (strcmp (abfd->xvec->name, "coff-z8k") != 0) + reloc_entry->addend = 0; } + else + reloc_entry->addend = relocation; + + /* Is the address of the relocation really within the section? */ + octets = reloc_entry->address * bfd_octets_per_byte (abfd, input_section); + if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets)) + return bfd_reloc_outofrange; /* FIXME: This overflow checking is incomplete, because the value might have overflowed before we get here. For a correct check we need to compute the value in a size larger than bitsize, but we can't reasonably do that for a reloc the same size as a host - machine word. - FIXME: We should also do overflow checking on the result after - adding in the value contained in the object file. */ + machine word. */ if (howto->complain_on_overflow != complain_overflow_dont) flag = bfd_check_overflow (howto->complain_on_overflow, howto->bitsize, @@ -1228,71 +1117,11 @@ space consuming. For each target: bfd_arch_bits_per_address (abfd), relocation); - /* Either we are relocating all the way, or we don't want to apply - the relocation to the reloc entry (probably because there isn't - any room in the output format to describe addends to relocs). */ - - /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler - (OSF version 1.3, compiler version 3.11). It miscompiles the - following program: - - struct str - { - unsigned int i0; - } s = { 0 }; - - int - main () - { - unsigned long x; - - x = 0x100000000; - x <<= (unsigned long) s.i0; - if (x == 0) - printf ("failed\n"); - else - printf ("succeeded (%lx)\n", x); - } - */ - relocation >>= (bfd_vma) howto->rightshift; /* Shift everything up to where it's going to be used. */ relocation <<= (bfd_vma) howto->bitpos; - /* Wait for the day when all have the mask in them. */ - - /* What we do: - i instruction to be left alone - o offset within instruction - r relocation offset to apply - S src mask - D dst mask - N ~dst mask - A part 1 - B part 2 - R result - - Do this: - (( i i i i i o o o o o from bfd_get - and S S S S S) to get the size offset we want - + r r r r r r r r r r) to get the final value to place - and D D D D D to chop to right size - ----------------------- - = A A A A A - And this: - ( i i i i i o o o o o from bfd_get - and N N N N N ) get instruction - ----------------------- - = B B B B B - - And then: - ( B B B B B - or A A A A A) - ----------------------- - = R R R R R R R R R R put into bfd_put - */ - data = (bfd_byte *) data_start + (octets - data_start_offset); apply_reloc (abfd, data, howto, relocation); return flag; From patchwork Wed Jan 18 06:26:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 44994 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2172700wrn; Tue, 17 Jan 2023 22:27:19 -0800 (PST) X-Google-Smtp-Source: AMrXdXse1WdZp8lOPrHziE3MuwYb0IF+KvfXW/7sBMlg+CiC8Ui7KDOUBTiAsf3/ZtF6JJsCPbJE X-Received: by 2002:a17:907:6746:b0:871:b898:92fd with SMTP id qm6-20020a170907674600b00871b89892fdmr6088122ejc.6.1674023239512; Tue, 17 Jan 2023 22:27:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674023239; cv=none; d=google.com; s=arc-20160816; b=vMSKwyswnDZ5cKAHTwl4+uSdVELo70JJuQP04KtULMx3006mfNsX6c58j/2EGBNxw0 8pgwKLeF0dY+7uTBVuDEzu32SdXrcvzjkTydLJ1lbyNE1SMUsmVl/mi1tHp4ebB7v/GQ Z2PgYYkQHsTUUNkefbLfX/Q4J6qPmGodkh1lymJv4uaNnFdanIa3gI/ubMSsSwsWTZYj By6SRmi7EGvnstlQGcLYmoyudjgD9cAO+UKdJb6I8hoG81qhlelYenRuaIWtp3TfaW2Z KE+CBfsgRJ43Kq/9F3TxoGFHFA5VluAjsdybebiQRYj0mRprx9YzeR1EakOqNGGbNqVK 6HVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=2HqQ2dj2WZpHSgWm6zu4a2fDz3B8gCjdsu0KhtUo/d0=; b=OJThpad1MbqdFovZgXQPN3qaq3ZgY313n4sbVZ7X+qaAb/qNxx4w/GVv9s0v49yOWl Q9lqN+4vPEGr5xDoJCu88TgvoXKx5Aw9Amu9eGnpas3ufLqUMXehWznm+4o2RS1FsvDi FlcL/0PvA16xtdToQuL877wcmTSklP3W9QuRqcAIwZu3Aol0Ou6FE6TRp+1Ey5hcwq+K /fxTNgTplA2vwkZDQpbtpX6eZrq6Fh9/6tZPY+gUYSTZrnqgI6I2sm+5qO67ZC3uxxhh XIHtEv+9mM+jmtXjn86S4DT4JmrBWjla5VpMaMMciv+WvKS6I6Rsw0E+oDsGTHYlgnlK VNCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Rit1Ngeo; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id e5-20020a17090658c500b0087305ff8c42si3926828ejs.909.2023.01.17.22.27.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:19 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Rit1Ngeo; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 474413858430 for ; Wed, 18 Jan 2023 06:27:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 474413858430 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1674023235; bh=2HqQ2dj2WZpHSgWm6zu4a2fDz3B8gCjdsu0KhtUo/d0=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=Rit1Ngeo87GO3vqLLRr7MRitPMRjUtFveNRM7XN3E4OVS47woAgWn3DPtMBmL+utw EFlQ/PHL/iJ6cQiFOXKWoXKRcfJo9navJdrp1BpJFfASKDQBCO7LBm8dtUOkyUhDOW 83BLsH38uImA5HyZT19HQGRDiPWwYywV2+6WyFo4= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id 201DA3858C52 for ; Wed, 18 Jan 2023 06:27:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 201DA3858C52 Received: by mail-pf1-x434.google.com with SMTP id c85so22098374pfc.8 for ; Tue, 17 Jan 2023 22:27:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2HqQ2dj2WZpHSgWm6zu4a2fDz3B8gCjdsu0KhtUo/d0=; b=X6bfWWui9GPx+SE7uWltmXbW015DVrv9ykevIqt7eTVOFUABVKwDne8oCJapabgyLM X0PVXrwhdqwFCWovUTQyj/ANx+o6ZL0PQC56e4i4C/9OScXz+Whr2A8IAqz71R9HMxMU 6XxV8+JegfkatKcT5Tkd6r7TTFQYp+TKKhSdclxGTvFefCmiXqyZ2VF832rTCnmfpghX RwnF2B0Lvv3Nqko83VA0hQmUgBJhqXat3leJAZSS3rs3rqvkSjfyrbj55plKN+C0iYkc nWaG7VI1vhsPRoNOK/YV7j2NIdvnEOQrL0Um+YxnKL4l+AkAeNIFkNP47hM8peyRNGdl ONtw== X-Gm-Message-State: AFqh2kriDqPSUasOdOASP1p//xx0qs3+iU1Fo1nF2BqSNe0iRX0dQ14h 8mnv0ROu/b9pQhSOWHmvxJ+H/7mZeLM= X-Received: by 2002:aa7:9182:0:b0:58d:987b:2e9 with SMTP id x2-20020aa79182000000b0058d987b02e9mr5657951pfa.24.1674023225609; Tue, 17 Jan 2023 22:27:05 -0800 (PST) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:195b:3277:b45:6442]) by smtp.gmail.com with ESMTPSA id i15-20020a62870f000000b005890c5ed925sm16645908pfe.198.2023.01.17.22.27.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:05 -0800 (PST) To: binutils@sourceware.org Cc: Mark Harmstone Subject: [PATCH 2/4] coff-aarch64.c howtos Date: Wed, 18 Jan 2023 16:56:55 +1030 Message-Id: <20230118062657.1125934-3-amodra@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230118062657.1125934-1-amodra@gmail.com> References: <20230118062657.1125934-1-amodra@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3034.1 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755340592289587516?= X-GMAIL-MSGID: =?utf-8?q?1755340592289587516?= This is just a patch to fix overlong lines. Wrapping the HOWTO macro in a new HOW macro helps in this. No functional changes here. * coff-aarch64.c (HOW): Define and use for reloc howtos. diff --git a/bfd/coff-aarch64.c b/bfd/coff-aarch64.c index 8e9081a0e74..1360ae0ba73 100644 --- a/bfd/coff-aarch64.c +++ b/bfd/coff-aarch64.c @@ -281,73 +281,62 @@ coff_aarch64_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED, return bfd_reloc_ok; } -/* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */ -#define MINUS_ONE (~ (bfd_vma) 0) - -static const reloc_howto_type arm64_reloc_howto_abs = HOWTO(IMAGE_REL_ARM64_ABSOLUTE, 0, 1, 0, false, 0, - complain_overflow_dont, - NULL, "IMAGE_REL_ARM64_ABSOLUTE", - false, 0, 0, false); - -static const reloc_howto_type arm64_reloc_howto_64 = HOWTO(IMAGE_REL_ARM64_ADDR64, 0, 8, 64, false, 0, - complain_overflow_bitfield, - coff_aarch64_addr64_reloc, "IMAGE_REL_ARM64_ADDR64", - false, MINUS_ONE, MINUS_ONE, false); - -static const reloc_howto_type arm64_reloc_howto_32 = HOWTO (IMAGE_REL_ARM64_ADDR32, 0, 4, 32, false, 0, - complain_overflow_bitfield, - coff_aarch64_addr32_reloc, "IMAGE_REL_ARM64_ADDR32", - false, 0xffffffff, 0xffffffff, false); - -static const reloc_howto_type arm64_reloc_howto_32_pcrel = HOWTO (IMAGE_REL_ARM64_REL32, 0, 4, 32, true, 0, - complain_overflow_bitfield, - NULL, "IMAGE_REL_ARM64_REL32", - false, 0xffffffff, 0xffffffff, true); - -static const reloc_howto_type arm64_reloc_howto_branch26 = HOWTO (IMAGE_REL_ARM64_BRANCH26, 0, 4, 26, true, 0, - complain_overflow_bitfield, - coff_aarch64_branch26_reloc, "IMAGE_REL_ARM64_BRANCH26", - false, 0x03ffffff, 0x03ffffff, true); - -static const reloc_howto_type arm64_reloc_howto_page21 = HOWTO (IMAGE_REL_ARM64_PAGEBASE_REL21, 12, 4, 21, true, 0, - complain_overflow_signed, - coff_aarch64_rel21_reloc, "IMAGE_REL_ARM64_PAGEBASE_REL21", - false, 0x1fffff, 0x1fffff, false); - -static const reloc_howto_type arm64_reloc_howto_lo21 = HOWTO (IMAGE_REL_ARM64_REL21, 0, 4, 21, true, 0, - complain_overflow_signed, - coff_aarch64_rel21_reloc, "IMAGE_REL_ARM64_REL21", - false, 0x1fffff, 0x1fffff, true); - -static const reloc_howto_type arm64_reloc_howto_pgoff12l = HOWTO (IMAGE_REL_ARM64_PAGEOFFSET_12L, 1, 4, 12, true, 0, - complain_overflow_signed, - coff_aarch64_po12l_reloc, "IMAGE_REL_ARM64_PAGEOFFSET_12L", - false, 0xffe, 0xffe, true); - -static const reloc_howto_type arm64_reloc_howto_branch19 = HOWTO (IMAGE_REL_ARM64_BRANCH19, 2, 4, 19, true, 0, - complain_overflow_signed, - coff_aarch64_branch19_reloc, "IMAGE_REL_ARM64_BRANCH19", - false, 0x7ffff, 0x7ffff, true); - -static const reloc_howto_type arm64_reloc_howto_branch14 = HOWTO (IMAGE_REL_ARM64_BRANCH14, 2, 4, 14, true, 0, - complain_overflow_signed, - coff_aarch64_branch14_reloc, "IMAGE_REL_ARM64_BRANCH14", - false, 0x3fff, 0x3fff, true); - -static const reloc_howto_type arm64_reloc_howto_pgoff12a = HOWTO (IMAGE_REL_ARM64_PAGEOFFSET_12A, 2, 4, 12, true, 10, - complain_overflow_dont, - coff_aarch64_po12a_reloc, "IMAGE_REL_ARM64_PAGEOFFSET_12A", - false, 0x3ffc00, 0x3ffc00, false); - -static const reloc_howto_type arm64_reloc_howto_32nb = HOWTO (IMAGE_REL_ARM64_ADDR32NB, 0, 4, 32, false, 0, - complain_overflow_bitfield, - coff_aarch64_addr32nb_reloc, "IMAGE_REL_ARM64_ADDR32NB", - false, 0xffffffff, 0xffffffff, false); - -static const reloc_howto_type arm64_reloc_howto_secrel = HOWTO (IMAGE_REL_ARM64_SECREL, 0, 4, 32, false, 0, - complain_overflow_bitfield, - coff_aarch64_secrel_reloc, "IMAGE_REL_ARM64_SECREL", - false, 0xffffffff, 0xffffffff, false); +#define coff_aarch64_NULL NULL +#define HOW(type, right, size, bits, pcrel, left, ovf, func, mask, pcrel_off) \ + HOWTO (type, right, size, bits, pcrel, left, complain_overflow_##ovf, \ + coff_aarch64_##func, #type, false, mask, mask, pcrel_off) + +static const reloc_howto_type arm64_reloc_howto_abs += HOW (IMAGE_REL_ARM64_ABSOLUTE, + 0, 1, 0, false, 0, dont, NULL, 0, false); + +static const reloc_howto_type arm64_reloc_howto_64 += HOW (IMAGE_REL_ARM64_ADDR64, + 0, 8, 64, false, 0, bitfield, addr64_reloc, UINT64_C (-1), false); + +static const reloc_howto_type arm64_reloc_howto_32 += HOW (IMAGE_REL_ARM64_ADDR32, + 0, 4, 32, false, 0, bitfield, addr32_reloc, 0xffffffff, false); + +static const reloc_howto_type arm64_reloc_howto_32_pcrel += HOW (IMAGE_REL_ARM64_REL32, + 0, 4, 32, true, 0, bitfield, NULL, 0xffffffff, true); + +static const reloc_howto_type arm64_reloc_howto_branch26 += HOW (IMAGE_REL_ARM64_BRANCH26, + 0, 4, 26, true, 0, bitfield, branch26_reloc, 0x03ffffff, true); + +static const reloc_howto_type arm64_reloc_howto_page21 += HOW (IMAGE_REL_ARM64_PAGEBASE_REL21, + 12, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff, false); + +static const reloc_howto_type arm64_reloc_howto_lo21 += HOW (IMAGE_REL_ARM64_REL21, + 0, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff, true); + +static const reloc_howto_type arm64_reloc_howto_pgoff12l += HOW (IMAGE_REL_ARM64_PAGEOFFSET_12L, + 1, 4, 12, true, 0, signed, po12l_reloc, 0xffe, true); + +static const reloc_howto_type arm64_reloc_howto_branch19 += HOW (IMAGE_REL_ARM64_BRANCH19, + 2, 4, 19, true, 0, signed, branch19_reloc, 0x7ffff, true); + +static const reloc_howto_type arm64_reloc_howto_branch14 += HOW (IMAGE_REL_ARM64_BRANCH14, + 2, 4, 14, true, 0, signed, branch14_reloc, 0x3fff, true); + +static const reloc_howto_type arm64_reloc_howto_pgoff12a += HOW (IMAGE_REL_ARM64_PAGEOFFSET_12A, + 2, 4, 12, true, 10, dont, po12a_reloc, 0x3ffc00, false); + +static const reloc_howto_type arm64_reloc_howto_32nb += HOW (IMAGE_REL_ARM64_ADDR32NB, + 0, 4, 32, false, 0, bitfield, addr32nb_reloc, 0xffffffff, false); + +static const reloc_howto_type arm64_reloc_howto_secrel += HOW (IMAGE_REL_ARM64_SECREL, + 0, 4, 32, false, 0, bitfield, secrel_reloc, 0xffffffff, false); static const reloc_howto_type* const arm64_howto_table[] = { &arm64_reloc_howto_abs, From patchwork Wed Jan 18 06:26:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 44999 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2173245wrn; Tue, 17 Jan 2023 22:29:19 -0800 (PST) X-Google-Smtp-Source: AMrXdXsPUf7ZtJSTTVx0RxL1kKWeWj/uo4YJICTPvOKMdSaL/ShfCV4OohPvFo2OlL4z1OeJHgcI X-Received: by 2002:a05:6402:b:b0:496:f517:d30d with SMTP id d11-20020a056402000b00b00496f517d30dmr6124450edu.38.1674023359871; Tue, 17 Jan 2023 22:29:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674023359; cv=none; d=google.com; s=arc-20160816; b=CSFTxetWIqzIkbWWaGdsqaeDsptvjzWBfFI03MACYYIvtpcBlRXmc/BrzrYLfWqonv pyUldmB2mvjrTA2OCxS99SU7yXJsW0yfNC4b7/xGF+NJQP698pt+IIGkeK1d2jDlOm03 VEfGH0NdeF+2GDouKpghujeO1jP48Q1taqy1O7ky81Ln0Qf1Wy6LfsP/bnuJve3i78gm W8xtaDXZk6hrYFYO30waddfE2qaShPmWlEsl6nrX4qyjKqr4YhnfXpq/UJcjrs+Yp1DN EVq96TkPQgSO8KGSGmAiSAOygza3ohv/JgyQYzrSjG12tBq3uq3O+6IFuBFk7OVy/+Lx SsIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=eVY5h7dQ0KHYh/5t2e17Azexr9tRF3W3ptvHoiQWVA8=; b=FI7d0H9nIwY6pFaSxOFfyMoC9qQ1SyBuslH3MgBj4+FqBhGnk0I/Rxw00n8LRLsTwI M9n42U+VhpTBS0SvF0obW9ht4vxf2lT2R8QGXhPImGrM/vN/DuAcdRWrmxbjcTz6h7DB uoUHRY8Fr55qGJrV/XgbNGwNlg6FduzsLz9pphbchL2E+hrUwB0Tz3NLJfuWvLJQMGZ5 GdIMUp4RkMuBikR5gpnI0ahXQH2yRA4N5gJoIXdxY/wtSF/MGde2NX1vtuSUEOhpQk5w 6PTHHSJnYwZHl+7pT+50leuGEGIAis1YV7S7AhlE9krGNaCa84lW2FZEvey8nps4jZel 9bOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FYKiTIQw; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id dt4-20020a170907728400b00871dfbabf41si7205760ejc.272.2023.01.17.22.29.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:29:19 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FYKiTIQw; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D7BDB385B525 for ; Wed, 18 Jan 2023 06:28:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D7BDB385B525 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1674023300; bh=eVY5h7dQ0KHYh/5t2e17Azexr9tRF3W3ptvHoiQWVA8=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=FYKiTIQwnI/Rx5oO+L/GvG4FmqWQ6J8Gj87hDtCjiH2WhHym3t0o3rZCwm+E8YWXP FN9wj9FlgXCk2w45ax6nE+u5G358VYmUCI0Uc5N0/RCGpD9MUJz3x55AntKwc03PlE SsZClWIGTbiFroiXov9y7IbU/oFovymd2/tduGfw= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id 87F443858413 for ; Wed, 18 Jan 2023 06:27:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 87F443858413 Received: by mail-pf1-x429.google.com with SMTP id i1so10342986pfk.3 for ; Tue, 17 Jan 2023 22:27:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eVY5h7dQ0KHYh/5t2e17Azexr9tRF3W3ptvHoiQWVA8=; b=v2bBtQmKt0fs1GQjTEgzU4+Td/QnpulJS3BNUWYd47fKTJvg/g8F9SQ0EflQDatxt+ BFXhOngDmOjcsjBNAvaQTkjT30FQzUKIicrlA/dAfsFWyTRYJNRvlon8OcedGLhDjY6L mTg5rBZFH0EXEsTW/h4MLK0vAQBA9Sf8YUSbvf+Sr4ShPVQk8AvuTTGUvVk5FqyZBQGa ng7J9EOi07HA/947B7lFQATxGxuhD2DKHoSE9/UCoAJHsqbajFlfWhGIP1BC47sN4N5K t4lRMurOeNGjsS5UwyJyaIbGg5MqHLpqn3seVHHtxLmOSvDuPA14OoE0NmQyZq9lqTmN NQHQ== X-Gm-Message-State: AFqh2koOnm6g2g8opoYe6hZToKm7USnjQDE2vClERxu4ourtkAMrGost iO+X+tEvJXI0f6leISnnlCmunroh/aE= X-Received: by 2002:a05:6a00:2a04:b0:582:26bc:a75b with SMTP id ce4-20020a056a002a0400b0058226bca75bmr6970759pfb.9.1674023227349; Tue, 17 Jan 2023 22:27:07 -0800 (PST) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:195b:3277:b45:6442]) by smtp.gmail.com with ESMTPSA id i15-20020a62870f000000b005890c5ed925sm16645908pfe.198.2023.01.17.22.27.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:07 -0800 (PST) To: binutils@sourceware.org Cc: Mark Harmstone Subject: [PATCH 3/4] Correct coff-aarch64 howtos and delete unnecessary special functions Date: Wed, 18 Jan 2023 16:56:56 +1030 Message-Id: <20230118062657.1125934-4-amodra@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230118062657.1125934-1-amodra@gmail.com> References: <20230118062657.1125934-1-amodra@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3034.5 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755340718465896094?= X-GMAIL-MSGID: =?utf-8?q?1755340718465896094?= The remaining special functions are still broken except when called by gas bfd_install_relocation. * coff-aarch64.c (coff_aarch64_addr64_reloc), (coff_aarch64_addr32_reloc, coff_aarch64_branch26_reloc), (coff_aarch64_branch19_reloc, coff_aarch64_branch14_reloc), (coff_aarch64_po12a_reloc): Delete. (HOWTO_INSTALL_ADDEND): Define as 1. (HOW): Remove pcrel_off. Correct all the howtos. (CALC_ADDEND): Define. (coff_aarch64_rtype_to_howto): New function. (coff_rtype_to_howto): Define. diff --git a/bfd/coff-aarch64.c b/bfd/coff-aarch64.c index 1360ae0ba73..7057396f6dd 100644 --- a/bfd/coff-aarch64.c +++ b/bfd/coff-aarch64.c @@ -39,70 +39,6 @@ #include "libcoff.h" -static bfd_reloc_status_type -coff_aarch64_addr64_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint64_t val = reloc_entry->addend; - - bfd_putl64 (val, data + reloc_entry->address); - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -coff_aarch64_addr32_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint64_t val; - - if ((int64_t) reloc_entry->addend > 0x7fffffff - || (int64_t) reloc_entry->addend < -0x7fffffff) - return bfd_reloc_overflow; - - val = reloc_entry->addend; - - bfd_putl32 ((uint32_t) val, data + reloc_entry->address); - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -coff_aarch64_branch26_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint32_t op; - int32_t param; - - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend; - - if (param > 0x7ffffff || param < -0x8000000) - return bfd_reloc_overflow; - - op &= 0xfc000000; - op |= (param >> 2) & 0x3ffffff; - - bfd_putl32 (op, data + reloc_entry->address); - - return bfd_reloc_ok; -} - static bfd_reloc_status_type coff_aarch64_rel21_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, @@ -170,81 +106,6 @@ coff_aarch64_po12l_reloc (bfd *abfd ATTRIBUTE_UNUSED, return bfd_reloc_ok; } -static bfd_reloc_status_type -coff_aarch64_branch19_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint32_t op; - int32_t param; - - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend; - - if (param > 0xfffff || param < -0x100000) - return bfd_reloc_overflow; - - op &= 0xff00001f; - op |= ((param >> 2) & 0x7ffff) << 5; - - bfd_putl32 (op, data + reloc_entry->address); - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -coff_aarch64_branch14_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint32_t op; - int32_t param; - - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend; - - if (param > 0x7fff || param < -0x8000) - return bfd_reloc_overflow; - - op &= 0xfff8001f; - op |= ((param >> 2) & 0x3fff) << 5; - - bfd_putl32 (op, data + reloc_entry->address); - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -coff_aarch64_po12a_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - uint32_t op; - int32_t param; - - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend; - - op &= 0xffc003ff; - op |= (param & 0xfff) << 10; - - bfd_putl32 (op, data + reloc_entry->address); - - return bfd_reloc_ok; -} - static bfd_reloc_status_type coff_aarch64_addr32nb_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, @@ -282,61 +143,63 @@ coff_aarch64_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED, } #define coff_aarch64_NULL NULL -#define HOW(type, right, size, bits, pcrel, left, ovf, func, mask, pcrel_off) \ +#undef HOWTO_INSTALL_ADDEND +#define HOWTO_INSTALL_ADDEND 1 +#define HOW(type, right, size, bits, pcrel, left, ovf, func, mask) \ HOWTO (type, right, size, bits, pcrel, left, complain_overflow_##ovf, \ - coff_aarch64_##func, #type, false, mask, mask, pcrel_off) + coff_aarch64_##func, #type, true, mask, mask, false) static const reloc_howto_type arm64_reloc_howto_abs = HOW (IMAGE_REL_ARM64_ABSOLUTE, - 0, 1, 0, false, 0, dont, NULL, 0, false); + 0, 0, 0, false, 0, dont, NULL, 0); static const reloc_howto_type arm64_reloc_howto_64 = HOW (IMAGE_REL_ARM64_ADDR64, - 0, 8, 64, false, 0, bitfield, addr64_reloc, UINT64_C (-1), false); + 0, 8, 64, false, 0, dont, NULL, UINT64_C (-1)); static const reloc_howto_type arm64_reloc_howto_32 = HOW (IMAGE_REL_ARM64_ADDR32, - 0, 4, 32, false, 0, bitfield, addr32_reloc, 0xffffffff, false); + 0, 4, 32, false, 0, signed, NULL, 0xffffffff); static const reloc_howto_type arm64_reloc_howto_32_pcrel = HOW (IMAGE_REL_ARM64_REL32, - 0, 4, 32, true, 0, bitfield, NULL, 0xffffffff, true); + 0, 4, 32, true, 0, signed, NULL, 0xffffffff); static const reloc_howto_type arm64_reloc_howto_branch26 = HOW (IMAGE_REL_ARM64_BRANCH26, - 0, 4, 26, true, 0, bitfield, branch26_reloc, 0x03ffffff, true); + 2, 4, 26, true, 0, signed, NULL, 0x3ffffff); static const reloc_howto_type arm64_reloc_howto_page21 = HOW (IMAGE_REL_ARM64_PAGEBASE_REL21, - 12, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff, false); + 12, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff); static const reloc_howto_type arm64_reloc_howto_lo21 = HOW (IMAGE_REL_ARM64_REL21, - 0, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff, true); + 0, 4, 21, true, 0, signed, rel21_reloc, 0x1fffff); static const reloc_howto_type arm64_reloc_howto_pgoff12l = HOW (IMAGE_REL_ARM64_PAGEOFFSET_12L, - 1, 4, 12, true, 0, signed, po12l_reloc, 0xffe, true); + 0, 4, 12, true, 10, signed, po12l_reloc, 0x3ffc00); static const reloc_howto_type arm64_reloc_howto_branch19 = HOW (IMAGE_REL_ARM64_BRANCH19, - 2, 4, 19, true, 0, signed, branch19_reloc, 0x7ffff, true); + 2, 4, 19, true, 5, signed, NULL, 0xffffe0); static const reloc_howto_type arm64_reloc_howto_branch14 = HOW (IMAGE_REL_ARM64_BRANCH14, - 2, 4, 14, true, 0, signed, branch14_reloc, 0x3fff, true); + 2, 4, 14, true, 5, signed, NULL, 0x7ffe0); static const reloc_howto_type arm64_reloc_howto_pgoff12a = HOW (IMAGE_REL_ARM64_PAGEOFFSET_12A, - 2, 4, 12, true, 10, dont, po12a_reloc, 0x3ffc00, false); + 0, 4, 12, true, 10, dont, NULL, 0x3ffc00); static const reloc_howto_type arm64_reloc_howto_32nb = HOW (IMAGE_REL_ARM64_ADDR32NB, - 0, 4, 32, false, 0, bitfield, addr32nb_reloc, 0xffffffff, false); + 0, 4, 32, false, 0, signed, addr32nb_reloc, 0xffffffff); static const reloc_howto_type arm64_reloc_howto_secrel = HOW (IMAGE_REL_ARM64_SECREL, - 0, 4, 32, false, 0, bitfield, secrel_reloc, 0xffffffff, false); + 0, 4, 32, false, 0, dont, secrel_reloc, 0xffffffff); static const reloc_howto_type* const arm64_howto_table[] = { &arm64_reloc_howto_abs, @@ -354,6 +217,13 @@ static const reloc_howto_type* const arm64_howto_table[] = { &arm64_reloc_howto_secrel }; +/* No adjustment to addends should be needed. The actual relocation + addend is in the section contents. Unfortunately this means actual + addends are not shown by objdump -r, but that's true for most + COFF/PE targets where arelent.addend is an adjustment. */ +#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ + cache_ptr->addend = 0; + #ifndef NUM_ELEM #define NUM_ELEM(a) ((sizeof (a)) / sizeof ((a)[0])) #endif @@ -455,15 +325,32 @@ coff_aarch64_rtype_lookup (unsigned int code) case IMAGE_REL_ARM64_SECREL: return &arm64_reloc_howto_secrel; default: - BFD_FAIL (); return NULL; } return NULL; } -#define RTYPE2HOWTO(cache_ptr, dst) \ - ((cache_ptr)->howto = coff_aarch64_rtype_lookup((dst)->r_type)) +#define RTYPE2HOWTO(cache_ptr, dst) \ + ((cache_ptr)->howto = coff_aarch64_rtype_lookup((dst)->r_type)) + +static reloc_howto_type * +coff_aarch64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, + asection *sec ATTRIBUTE_UNUSED, + struct internal_reloc *rel, + struct coff_link_hash_entry *h ATTRIBUTE_UNUSED, + struct internal_syment *sym ATTRIBUTE_UNUSED, + bfd_vma *addendp) +{ + reloc_howto_type *howto = coff_aarch64_rtype_lookup (rel->r_type); + + /* Cancel out code in _bfd_coff_generic_relocate_section. */ + *addendp = 0; + + return howto; +} + +#define coff_rtype_to_howto coff_aarch64_rtype_to_howto #define SELECT_RELOC(x,howto) { (x).r_type = (howto)->type; } From patchwork Wed Jan 18 06:26:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 44998 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2173230wrn; Tue, 17 Jan 2023 22:29:16 -0800 (PST) X-Google-Smtp-Source: AMrXdXtdh9qaWkEPBnzCP8b4F5IoGNr2II3Ge/pttmTPdIMtxG0lZfeZe7hbCkW7CjSCHY8q7ujW X-Received: by 2002:a05:6402:60b:b0:470:25cf:99d1 with SMTP id n11-20020a056402060b00b0047025cf99d1mr6000145edv.31.1674023356541; Tue, 17 Jan 2023 22:29:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674023356; cv=none; d=google.com; s=arc-20160816; b=kElPfPm2yHzMJ8Vmei1PEyozGXeQ5eNOIcz4bJ1oFoyjCtOvelaS4Cw8oqL7ZqdKkp goHpW2ieQ7/bfDNm7D9lcZ4WI8SEd8Rbmk8Q3nB5+XW2PSlykQxz2Xl8pYfbqISTSr2K 0U3U9Q/87IoO8vVER65xPnzaxM/G2D2kBkFnRkyYsn84RMuFaG4KCekmk2s5o7jEXI7k nlLfpy9Zil8Esxtzs2FOyqFCRNn0iiFJJGvivC9bAhUF/tnFb0Sv51YeJilT6FH7ppi1 qxEJwyrcvjqa8B+gltHnPAvbdwZLE3r4CnlW4w/EnZPXq35Fa62pMTIJp9UpsX8eMgYe 1wbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=UsKJSz+WFACq8AxeSkssyOpY7Fs6EeOs9sH5/Jwm6B8=; b=j76OF1YnpKjkzn+kopxajq2BXUGGsGGVoZo661vJ+kG9ajBCzvA4qonUz5JP43m9s1 EBnnK7BeknbM6idjJ7adOO+xP9W8SbGNYVL5ArgWi3UXXutfIlAkTQd40l3m1UyKpDer 4BhiO9WdWXGTaO2Ff2Jravz2pR+9YxnN1AaSHM9f1YBmsrV/ej8MfDJPJr8wvYSY2aPa cGkLs04MMCH+ZfPY0moC81QL4bhrvHTmOpJ7z3KXX6XBEpc78mLa4B2QHLw7pv4XDRkz Xn4oZ/MIPIBGWo2j3MDEcekBZPwlnI1oKp7pWc5990MwNWNR6MzdRlGwHYsG8U6kH6Vd m7Dw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=HrNE7qZa; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id he14-20020a1709073d8e00b0085d6d5c0de2si27515325ejc.593.2023.01.17.22.29.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:29:16 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=HrNE7qZa; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E5FFD385021B for ; Wed, 18 Jan 2023 06:28:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E5FFD385021B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1674023298; bh=UsKJSz+WFACq8AxeSkssyOpY7Fs6EeOs9sH5/Jwm6B8=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=HrNE7qZaYSzqR6kbudsEA9Qr77tyv4anhKBr+wSOQr09u2Ki3hQMNWNwTC3hKJw2o MLXy8+RfIhpQSy3Qsi9PIGlIXX3fIoRNUgoUHJJKo6uYnFAUOeZbvDxecA3OxM13N1 /sFC25BnPrUp+Q2ZeDJ3ehhy+x2q1aviNlOiTA3w= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by sourceware.org (Postfix) with ESMTPS id 0D6233858434 for ; Wed, 18 Jan 2023 06:27:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0D6233858434 Received: by mail-pj1-x102a.google.com with SMTP id y3-20020a17090a390300b00229add7bb36so1181688pjb.4 for ; Tue, 17 Jan 2023 22:27:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UsKJSz+WFACq8AxeSkssyOpY7Fs6EeOs9sH5/Jwm6B8=; b=cfpluzU8G7fb6xKkttc3IyGjQgeRpN98rVW+VTtqsvLXC1byh65DutkpN0e1JDK7FO 1czZCgoW0XpM/c/Nn2P5CmHKHx4I37d/ockJuKpVx1xgoAejMwZzW5pf1f7lyaDOGoUI wU5uPjMLKczKokefhGpGs3UpQQZw/az6+XnhQWsWOzSI92Gsgxz77VBEhSYuAdRFQBTW A8uvUOPbNmWW+Wsuumovri7h7ursoHXqn9baoVlfKv25Yw7CiEFG55QsMh1G9gnnMvi1 YZ84rMs6zGVRCTeKI+t2D5KsCc4vSLS/wT95nMMp1ATU9J7iiELJL45FWBCzc4uoLeq8 KrFg== X-Gm-Message-State: AFqh2krane3SrMyIGcHvFvTTsiadNNAl/vKs6brUkp7LG6oUbQgNkPYn cAnU20wZprSF3aMZocMFdUzeyKQD1wQ= X-Received: by 2002:a05:6a20:491a:b0:b5:df4f:6731 with SMTP id ft26-20020a056a20491a00b000b5df4f6731mr6378337pzb.17.1674023229076; Tue, 17 Jan 2023 22:27:09 -0800 (PST) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:195b:3277:b45:6442]) by smtp.gmail.com with ESMTPSA id i15-20020a62870f000000b005890c5ed925sm16645908pfe.198.2023.01.17.22.27.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jan 2023 22:27:08 -0800 (PST) To: binutils@sourceware.org Cc: Mark Harmstone Subject: [PATCH 4/4] The fuzzers have found the reloc special functions in coff-aarch64.c Date: Wed, 18 Jan 2023 16:56:57 +1030 Message-Id: <20230118062657.1125934-5-amodra@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230118062657.1125934-1-amodra@gmail.com> References: <20230118062657.1125934-1-amodra@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3034.6 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755340715286979520?= X-GMAIL-MSGID: =?utf-8?q?1755340715286979520?= All of them need a bfd_reloc_offset_in_range check before accessing data + reloc_entry->address. This patch adds the missing checks and sanity checks reloc offsets in coff_pe_aarch64_relocate_section too. All of them also need changing to support objdump -W calls to bfd_simple_get_relocated_section_contents. At least, secrel_reloc needs the support, the others might not be present in dwarf debug sections. * coff-aarch64.c (coff_aarch64_rel21_reloc): Range check reloc offset. Support final-linking. (coff_aarch64_po12l_reloc): Likewise. (coff_aarch64_addr32nb_reloc): Likewise. (coff_aarch64_secrel_reloc): Likewise. (coff_pe_aarch64_relocate_section): Range check reloc offset. diff --git a/bfd/coff-aarch64.c b/bfd/coff-aarch64.c index 7057396f6dd..73fa2442dfe 100644 --- a/bfd/coff-aarch64.c +++ b/bfd/coff-aarch64.c @@ -39,48 +39,85 @@ #include "libcoff.h" +/* For these howto special functions, + output_bfd == NULL => final link, or objdump -W and other calls to + bfd_simple_get_relocated_section_contents + output_bfd != NULL && output_bfd != abfd => ld -r + output_bfd != NULL && output_bfd == abfd => gas. + FIXME: ld -r is punted to bfd_perform_relocation. This won't be + correct for cases where the addend needs to be adjusted, eg. for + relocations against section symbols, and the field is split because + bfd_perform_relocation can't write addends to split relocation fields. */ + static bfd_reloc_status_type -coff_aarch64_rel21_reloc (bfd *abfd ATTRIBUTE_UNUSED, +coff_aarch64_rel21_reloc (bfd *abfd, arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, + asymbol *symbol, void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, + asection *input_section, + bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) { - uint32_t op; - int32_t param; + if (output_bfd != NULL && output_bfd != abfd) + return bfd_reloc_continue; - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend; + if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, + input_section, reloc_entry->address)) + return bfd_reloc_outofrange; - if (param > 0xfffff || param < -0x100000) - return bfd_reloc_overflow; + uint32_t op = bfd_getl32 (data + reloc_entry->address); + bfd_vma relocation = reloc_entry->addend; + bfd_reloc_status_type ret = bfd_reloc_ok; + if (output_bfd == NULL) + { + if (bfd_is_und_section (symbol->section)) + { + if ((symbol->flags & BSF_WEAK) == 0) + ret = bfd_reloc_undefined; + } + else if (!bfd_is_com_section (symbol->section)) + relocation += (symbol->value + + symbol->section->output_offset + + symbol->section->output_section->vma); + bfd_vma addend = ((op >> 3) & 0x1ffffc) | ((op >> 29) & 0x3); + addend = (addend ^ 0x100000) - 0x100000; + relocation += addend; + relocation -= (reloc_entry->address + + input_section->output_offset + + input_section->output_section->vma); + relocation = (bfd_signed_vma) relocation >> reloc_entry->howto->rightshift; + } + if (relocation + 0x100000 > 0x1fffff) + ret = bfd_reloc_overflow; op &= 0x9f00001f; - op |= (param & 0x1ffffc) << 3; - op |= (param & 0x3) << 29; + op |= (relocation & 0x1ffffc) << 3; + op |= (relocation & 0x3) << 29; bfd_putl32 (op, data + reloc_entry->address); - return bfd_reloc_ok; + return ret; } static bfd_reloc_status_type -coff_aarch64_po12l_reloc (bfd *abfd ATTRIBUTE_UNUSED, +coff_aarch64_po12l_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol ATTRIBUTE_UNUSED, void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, + asection *input_section, + bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) { - uint32_t op; - int32_t param; - uint8_t shift; + if (output_bfd != NULL && output_bfd != abfd) + return bfd_reloc_continue; - op = bfd_getl32 (data + reloc_entry->address); - param = reloc_entry->addend & 0xfff; + if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, + input_section, reloc_entry->address)) + return bfd_reloc_outofrange; + + uint32_t op = bfd_getl32 (data + reloc_entry->address); + bfd_vma relocation = reloc_entry->addend & 0xfff; + int shift; if ((op & 0xff800000) == 0x3d800000) { @@ -93,53 +130,120 @@ coff_aarch64_po12l_reloc (bfd *abfd ATTRIBUTE_UNUSED, shift = op >> 30; } - if (param & ((1 << shift) - 1)) - return bfd_reloc_overflow; + bfd_reloc_status_type ret = bfd_reloc_ok; + if (output_bfd == NULL) + { + if (bfd_is_und_section (symbol->section)) + { + if ((symbol->flags & BSF_WEAK) == 0) + ret = bfd_reloc_undefined; + } + else if (!bfd_is_com_section (symbol->section)) + relocation += (symbol->value + + symbol->section->output_offset + + symbol->section->output_section->vma); + bfd_vma addend = (op >> 10) & 0xfff; + addend <<= shift; + relocation += addend; + } - param >>= shift; + if (relocation & ((1 << shift) - 1)) + ret = bfd_reloc_overflow; op &= 0xffc003ff; - op |= param << 10; + op |= (relocation >> shift << 10) & 0x3ffc00; bfd_putl32 (op, data + reloc_entry->address); - return bfd_reloc_ok; + return ret; } static bfd_reloc_status_type -coff_aarch64_addr32nb_reloc (bfd *abfd ATTRIBUTE_UNUSED, +coff_aarch64_addr32nb_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol ATTRIBUTE_UNUSED, void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) + asection *input_section, + bfd *output_bfd, + char **error_message) { - uint64_t val; + if (output_bfd != NULL && output_bfd != abfd) + return bfd_reloc_continue; - if ((int64_t) reloc_entry->addend > 0x7fffffff - || (int64_t) reloc_entry->addend < -0x7fffffff) - return bfd_reloc_overflow; + if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, + input_section, reloc_entry->address)) + return bfd_reloc_outofrange; - val = reloc_entry->addend; + bfd_vma relocation = reloc_entry->addend; + bfd_reloc_status_type ret = bfd_reloc_ok; + if (output_bfd == NULL) + { + if (bfd_is_und_section (symbol->section)) + { + if ((symbol->flags & BSF_WEAK) == 0) + ret = bfd_reloc_undefined; + } + else if (!bfd_is_com_section (symbol->section)) + relocation += (symbol->value + + symbol->section->output_offset + + symbol->section->output_section->vma); + bfd_vma addend = bfd_getl_signed_32 (data + reloc_entry->address); + relocation += addend; + if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour + && obj_pe (output_bfd)) + relocation -= pe_data (output_bfd)->pe_opthdr.ImageBase; + else + { + *error_message = "unsupported"; + return bfd_reloc_dangerous; + } + } + + if (relocation + 0x80000000 > 0xffffffff) + ret = bfd_reloc_overflow; - bfd_putl32 ((uint32_t) val, data + reloc_entry->address); + bfd_putl32 (relocation, data + reloc_entry->address); - return bfd_reloc_ok; + return ret; } static bfd_reloc_status_type -coff_aarch64_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED, +coff_aarch64_secrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol ATTRIBUTE_UNUSED, void *data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, + asection *input_section, + bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) { - bfd_putl32 (reloc_entry->addend, data + reloc_entry->address); + if (output_bfd != NULL && output_bfd != abfd) + return bfd_reloc_continue; + + if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, + input_section, reloc_entry->address)) + return bfd_reloc_outofrange; + + bfd_vma relocation = reloc_entry->addend; + bfd_reloc_status_type ret = bfd_reloc_ok; + if (output_bfd == NULL) + { + if (bfd_is_und_section (symbol->section)) + { + if ((symbol->flags & BSF_WEAK) == 0) + ret = bfd_reloc_undefined; + } + else if (!bfd_is_com_section (symbol->section)) + relocation += (symbol->value + + symbol->section->output_offset); + bfd_vma addend = bfd_getl_signed_32 (data + reloc_entry->address); + relocation += addend; + } + if (relocation > 0xffffffff) + ret = bfd_reloc_overflow; + + bfd_putl32 (relocation, data + reloc_entry->address); - return bfd_reloc_ok; + return ret; } #define coff_aarch64_NULL NULL @@ -438,6 +542,17 @@ coff_pe_aarch64_relocate_section (bfd *output_bfd, || (unsigned long) symndx >= obj_raw_syment_count (input_bfd)) continue; + /* All the relocs handled below operate on 4 bytes. */ + if (input_section->size < rel->r_vaddr + || input_section->size - rel->r_vaddr < 4) + { + _bfd_error_handler + /* xgettext: c-format */ + (_("%pB: bad reloc address %#" PRIx64 " in section `%pA'"), + input_bfd, (uint64_t) rel->r_vaddr, input_section); + continue; + } + switch (rel->r_type) { case IMAGE_REL_ARM64_ADDR32NB: