From patchwork Mon May 25 09:36:55 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 135603 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 5101D4B9DB71 for ; Mon, 25 May 2026 09:38:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5101D4B9DB71 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=SyIaTPTS 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 E9AE14BA9012 for ; Mon, 25 May 2026 09:36:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E9AE14BA9012 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 E9AE14BA9012 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::429 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779701820; cv=none; b=qCET89kdmxG+wyIJG/8bEONO+lpN5iWyGte62xn1smcpsWBw+l3x0qwIAOW2emzxvE9sHlPpl5NnSvvWlRMlPGMKs3twXL5C5J5a7kGb1O8CGc8Nw1NSVKGvED3aCZLAxYY/ym1Z/gukZY5Q/FW9Cxd+dKif8kPMLre9fI5PcGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779701820; c=relaxed/simple; bh=+SbGz4+jdl85lpJoL7nobLes+cz89+0nqQ++CssHUFg=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=AVIn+V7cDKJLV+n+3pDBoeSMtzFocoReZ6jh/+UDDPFDfz4tL6yDDdZ3wqqHfgGo/yWimrrllibcxxkHYNQKaCAhwSx19jNYDFLuWAcJE5evX1Y639UfegH4TauyYgqxuHVB4acSzd5hdFslz/FzMix86W8hMAy78oiFPpOU7WY= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=SyIaTPTS DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E9AE14BA9012 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-838d0b7c950so6755914b3a.3 for ; Mon, 25 May 2026 02:36:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779701819; x=1780306619; darn=sourceware.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=+Qmf5HMnywgSwosfk/PGEFKv1oDE6Ud83YXl5baV57Y=; b=SyIaTPTSqXb8eCjg61f0aVPW1CRBznH76I7iFgp8lR2JmZKJBxeoLqh7jiqryjqoRH b0dbIV4Suz+gunxjCD/zZfzqjuKlJZsJu0YffVGYonJ+n33nLeBUnDVDhh2xtOzlXNL7 jnKy7CsLahbi9c3Mo6LDRch1VUSVp7Smc9Exvphn39g7TxsZMTKrFxQYiSZZNjEtVtPT oRy7geBga+X3Q5u2h7vSoCFOdUZp4kwCLxiP/un+UUgBfW1NjBrdGocZg0U1hND0ugdX suAuGajN9IrZXFkd18NjIn5Qy6V1KlY3FJvK8WF7kb4B1VcYsrRqK5P5j0Rcdp6qSCd/ B3cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779701819; x=1780306619; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+Qmf5HMnywgSwosfk/PGEFKv1oDE6Ud83YXl5baV57Y=; b=ESlnLZ/iTLFCmgCBzYyfGZVRIC+6vsS8R/3K2xbMPhgFT6ZTOdNezlJ/2pJ3ehuUVQ BrJTGcuJYBqu9qRtZ8HG1ylia1Ib9d7utJLIOXg+Je0dZfCoo6ImvJdKmdlKcioh3Ef8 WL0qXYauG7gpM6muQKBU8IWE+hB6VqipZhDDMltTQ8nXsOjeWZQghD+ZPJVj50NM+uMg 5SExcYa4EphlKD8IaayFQwL1r3SdMvg9TeUBnECWDDyc35/uyruxCZo/ZLVIrdsPcDrK LEb5yxDfQCZUXaVeq3KqwfLiRx/htbxSqEgFe1+LolUfpX40uOd9c83sZNYwI0hnV8yD zzXQ== X-Gm-Message-State: AOJu0Yy1QZiEQpAnB8+OPAw30VaZafU8rk5ey9BjfLetVitPlMM2VnT/ LJn5o2Ok6XrlgZkVXc3DA52mrenCkB9bR5Sb1rsrmkgrokbdRvKWp69nvMAbBQ== X-Gm-Gg: Acq92OGAqpWJm50O5c/UNnX8i/HdHJYES5YyQm3FPFoEIsjx69s7kMt2EMTvelMDVsM 9KJQEwlMQmLhCOlH2Bh1J8H5h1G896v5YZMxTkAM9wOyO78cIPE5r2AnuPFkag7zEBoYZIplFms vKYhGgLTsRtMbTsaQxUVgJOtpJ/lHWcZbbUB3mqksqwEzfHgsUNQka2xe5Ue2gX/axqDpWQC1RE BnUdWhhu3ANDbfaqMKz7Z0M+7IKocmSF9xyEwmRGtthcXSKkrU1Syj+55N0vZ4EfUa8sHslmjtp 9wYdxtko6LH375BKKdw3zPrx5thwVQ5PsjCTvfzAGzGYtaqOvTvmZeQWeUGqMr6EexgO7POy0K3 oCsB8OsJRW9P2G5NdgwQItcW2N+EajzvJTOx98OnVHldRC3r8TjXtIxf0uUfmtdJkzYAj+sLQSj S4Db7bh61s4HoTAXz44nqV4wnf+5IML0CH X-Received: by 2002:a05:6a00:3a05:b0:83b:aa29:3415 with SMTP id d2e1a72fcca58-8415f15a437mr12906250b3a.17.1779701818680; Mon, 25 May 2026 02:36:58 -0700 (PDT) Received: from squeak.grove.modra.org ([58.96.106.158]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164fe0bb8sm8302788b3a.51.2026.05.25.02.36.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 May 2026 02:36:58 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id 3EB711141A6F; Mon, 25 May 2026 19:06:55 +0930 (ACST) Date: Mon, 25 May 2026 19:06:55 +0930 From: Alan Modra To: binutils@sourceware.org Cc: Tristan Gingold , Iain Sandoe Subject: macho section symbol handling Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-3030.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE, SPF_PASS, 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 The macho gas support starts a new frag at non-local labels, identifying the frag with the label symbol as a "subsection". Relocs are needed when referencing labels in a different subsection, to support relaxation. There is a problem when reloc symbols are reduced to a section symbol plus offset (see write.c:adjust_reloc_syms), as this loses the subsection. Not reducing symbols like this is not a good option as it results in a large number of symbols, some with weird internal gas names. So instead this patch finds the original frag for any fx_addsy reduced to a section symbol. Test results are: +FAIL: .org test 1 -FAIL: i386 opcodes -FAIL: i386 opcodes (Intel disassembly) -FAIL: i386 opcodes (w/ suffix) -FAIL: i386 intel (AT&T disassembly) -FAIL: i386 intel -FAIL: Check -madd-bnd-prefix -FAIL: x86-64 RTM insns -FAIL: x86-64 RTM insns (Intel disassembly) -FAIL: Check -madd-bnd-prefix (x86-64) The reason ".org test 1" fails is the -gdwarf2 .debug_aranges generates two temp symbols and uses them for the start and size of each range, the size being calculated by "end" - "beg" (see out_debug_aranges). For the test, "beg" is before any source symbol is emitted so has subsection NULL. "end" has a subsection but lost that when the fixup was converted to a section symbol plus offset. So prior to this change obj_mach_o_in_different_subsection returned false. Now that the lost subsection is recovered for "end" it returns true, and results in "Error: can't resolve .text - L0^A$". * config/obj-macho.c (obj_mach_o_in_different_subsection): Add parameters. Get frag containing section sym plus offset. (obj_mach_o_force_reloc_sub_same): Adjust to suit obj_mach_o_in_different_subsection change. (obj_mach_o_force_reloc_sub_local): Likewise. (obj_mach_o_force_reloc): Likewise. * testsuite/gas/i386/insn-32.d: Don't xfail darwin. * write.c (get_frag_for_address): New function, extracted from.. (get_frag_for_reloc): ..here. * write.h (get_frag_for_address): Declare. diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index 6de2410e1a7..bf6f2758bc7 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -1864,7 +1864,8 @@ obj_mach_o_allow_local_subtract (expressionS * left ATTRIBUTE_UNUSED, } static bool -obj_mach_o_in_different_subsection (symbolS *a, symbolS *b) +obj_mach_o_in_different_subsection (symbolS *a, segT aseg, valueT offset, + symbolS *b) { fragS *fa; fragS *fb; @@ -1877,7 +1878,10 @@ obj_mach_o_in_different_subsection (symbolS *a, symbolS *b) return true; } - fa = symbol_get_frag (a); + if (symbol_section_p (a) && aseg != NULL) + fa = get_frag_for_address (NULL, seg_info (aseg), offset); + else + fa = symbol_get_frag (a); fb = symbol_get_frag (b); if (fa == NULL || fb == NULL) { @@ -1893,7 +1897,8 @@ obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg) { if (! SEG_NORMAL (seg)) return true; - return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy); + return obj_mach_o_in_different_subsection (fix->fx_addsy, seg, + fix->fx_offset, fix->fx_subsy); } bool @@ -1902,7 +1907,7 @@ obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED) symbolS *fragsym = fix->fx_frag->obj_frag_data.subsection; if (fragsym == NULL) return false; - return obj_mach_o_in_different_subsection (fix->fx_subsy, fragsym); + return obj_mach_o_in_different_subsection (fix->fx_subsy, NULL, 0, fragsym); } bool @@ -1916,16 +1921,18 @@ obj_mach_o_force_reloc (fixS *fix) if (fix->fx_addsy != NULL) { symbolS *subsec = fix->fx_frag->obj_frag_data.subsection; - symbolS *targ = fix->fx_addsy; /* There might be no subsections at all. */ if (subsec == NULL) return false; - if (S_GET_SEGMENT (targ) == absolute_section) + symbolS *targ = fix->fx_addsy; + segT targseg = S_GET_SEGMENT (targ); + if (targseg == absolute_section) return false; - return obj_mach_o_in_different_subsection (targ, subsec); + return obj_mach_o_in_different_subsection (targ, targseg, + fix->fx_offset, subsec); } return false; } diff --git a/gas/testsuite/gas/i386/insn-32.d b/gas/testsuite/gas/i386/insn-32.d index c2d8202bd2e..2649fdcf94e 100644 --- a/gas/testsuite/gas/i386/insn-32.d +++ b/gas/testsuite/gas/i386/insn-32.d @@ -1,7 +1,6 @@ #as: --divide #objdump: -dw #name: .insn (32-bit code) -#xfail: *-*-darwin* .*: +file format .* diff --git a/gas/write.c b/gas/write.c index 9bb47857936..9514c3df42e 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1228,33 +1228,41 @@ install_reloc (asection *sec, arelent *reloc, fragS *fragp, } } -static fragS * -get_frag_for_reloc (fragS *last_frag, - const segment_info_type *seginfo, - const struct reloc_list *r) +fragS * +get_frag_for_address (fragS *last_frag, + const segment_info_type *seginfo, + addressT addr) { fragS *f; for (f = last_frag; f != NULL; f = f->fr_next) - if (f->fr_address <= r->u.b.r.address - && r->u.b.r.address < f->fr_address + f->fr_fix) + if (f->fr_address <= addr && addr < f->fr_address + f->fr_fix) return f; for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next) - if (f->fr_address <= r->u.b.r.address - && r->u.b.r.address < f->fr_address + f->fr_fix) + if (f->fr_address <= addr && addr < f->fr_address + f->fr_fix) return f; for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next) - if (f->fr_address <= r->u.b.r.address - && r->u.b.r.address <= f->fr_address + f->fr_fix) + if (f->fr_address <= addr && addr <= f->fr_address + f->fr_fix) return f; - as_bad_where (r->file, r->line, - _("reloc not within (fixed part of) section")); return NULL; } +static fragS * +get_frag_for_reloc (fragS *last_frag, + const segment_info_type *seginfo, + const struct reloc_list *r) +{ + fragS *f = get_frag_for_address (last_frag, seginfo, r->u.b.r.address); + + if (f == NULL) + as_bad_where (r->file, r->line, + _("reloc not within (fixed part of) section")); + return f; +} + static void write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *xxx ATTRIBUTE_UNUSED) diff --git a/gas/write.h b/gas/write.h index 7281930c2d6..bc5260a2efd 100644 --- a/gas/write.h +++ b/gas/write.h @@ -188,5 +188,8 @@ extern fixS *fix_new_exp (fragS *, unsigned long, unsigned long, const expressionS *, int, bfd_reloc_code_real_type); extern void write_print_statistics (FILE *); extern void as_bad_subtract (fixS *); +struct segment_info_struct; +extern fragS *get_frag_for_address (fragS *, const struct segment_info_struct *, + addressT); #endif /* __write_h__ */