Message ID | 20230920001728.1439947-1-maskray@google.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp3770682vqi; Tue, 19 Sep 2023 17:18:20 -0700 (PDT) X-Google-Smtp-Source: AGHT+IExgzfmTOyn3cLOEYeATCjUD3TFFc+gpnJxgFOjJVSyNuez3DOM8xZnwk4BW3cPeDoTaySt X-Received: by 2002:a05:6a00:1350:b0:68c:3f2:6000 with SMTP id k16-20020a056a00135000b0068c03f26000mr1477161pfu.6.1695169099866; Tue, 19 Sep 2023 17:18:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695169099; cv=none; d=google.com; s=arc-20160816; b=gJxIdwKca+26u95LZWyY062LXRoLHmR1ANyQe3lcUAdOU4Cm6vRkIdEb6kDjGA65vM h7L9NVdNdxmkIKItHI8N9REzZ921fB7XOJgO6rd+a1ZVhSfANr3IcNMi6cTqbs16W1K9 wd65r2fL6m8QRcWfAeVfr1cxur6R0+2FM5jU8vLnNjxgD+fWr1Ttxi1RWOl1GF2UBslz bLiQlvbxMdupMe+zCrRcBloRnC2z895sD13EMZJxXC81QP5hH51wifGZQDXaDeaZYm5Q IUcqHOigmGf3Fre5eC0Qi4G8+CtTftWDSgV0mL5hCs6Jn/DPVcwrYrAsgJpp4VKUKxjP epgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :dkim-signature; bh=tT8RTtiIvMH0jr3h5GfFxiVuJzDdiA1NvVC8sxpn06Q=; fh=HUopNoLedhxgTPuvZ027QMEQs8h8gc2lRNKHgZFk4aI=; b=dNJjI7ljUxDkdPcqCoHBrEH4G7zj60Z/W/pkMzHm31TJ4p1PHVbtgYnSFArzNf+OP0 y7kB9SJmhiLnA8EGw5zQ7FajcXzMpkPSX3NUupqjEA7R2u71hP5cFFue64bKBufGKRTF EwU/rXsuilKutEmAzmB4fzUUyQdjSYnE0gjkT8cTXn6PkMRZDMCsW8yirYtJJ1bLgEgd y2zo/PWnKdlm8l2yALurxvZyDZFI2YImjH/bW/2pZO1QKnoWxN4NODDRQdaLt7T4hRs9 I/yc1wuHh2ly+sEYRzs2CR4NTsArM74nxVqjWQkI725X2WFwhldQzmJVZKRV4Y2hzGJJ W/WQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=NnS8rvEj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id b9-20020a056a000cc900b00690158afc78si11092069pfv.284.2023.09.19.17.18.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Sep 2023 17:18:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=NnS8rvEj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 26BA48043009; Tue, 19 Sep 2023 17:17:49 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229935AbjITARi (ORCPT <rfc822;toshivichauhan@gmail.com> + 26 others); Tue, 19 Sep 2023 20:17:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51838 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229534AbjITARi (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 19 Sep 2023 20:17:38 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A25CEAB for <linux-kernel@vger.kernel.org>; Tue, 19 Sep 2023 17:17:32 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-59b6a51f360so70967917b3.1 for <linux-kernel@vger.kernel.org>; Tue, 19 Sep 2023 17:17:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1695169052; x=1695773852; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=tT8RTtiIvMH0jr3h5GfFxiVuJzDdiA1NvVC8sxpn06Q=; b=NnS8rvEjStTsox1SybNVAn5om+cHQtX9dZb8cenUc5AFD5/QjRWATh/3NWcDv3nMY6 9I/sGmwyTHp0VKD9+td4FJvO9W/ua6gOYfrAGx0EHfRuPSk5AB1yBcRuWDJJA86h3iUB DbbXGZivz0gb4mddw2TPNRzwOccLZdgPcRFlOoe5ZOWezoyjcDykoFkhnH3VhoDQ7usY S6wr48nwPcp854QNbMo++nAjONinYDSw/KigvEn52nU9fotX0vGB1NVH0tW0mlOY43rD FZyacfOw3VhzwRqfh0Hju3HLDJms54bnvJUKTFNpiKQ9R+kkzCRS4qpGZ77Vsemqmr5u SA1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695169052; x=1695773852; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=tT8RTtiIvMH0jr3h5GfFxiVuJzDdiA1NvVC8sxpn06Q=; b=TBf48LvSvU7L1X5xnKhEb2JwlsHCTr1hDO6GeB4gtC1QLDNOiGCnOEdCnpL/amLZxM rbhg8qOmOF1khyxKQQTn3zsPHh8J0iPy5fXVHgbzcyfXbC6eCNIw/IlASkAivhroBBqI k6pwTXyXLduQieaKeHhEBnYJGnw6qANDJb12PMB/PAr2654WO54tUFAlpIOrNc0lXE1G bVhpDfEBmbzFsPQJblrGoSNgNqfIOhfXqffxK4mfja/31EQrvq9JiRU86Hat3knYQlnn f36n93m3fs8Gw2hrwCCJ/OnTEBwhW05YcFyU5534rD9C9dj8gvYXbQNpjpOmsPkWtUp8 9GNQ== X-Gm-Message-State: AOJu0YzHRR1biMMBLDMPMaf6REMwDAiT89QY70rejMXSGw2wCrARpMTR ti3ojoN4TPJCdTyHBXq/ja/RQqtwGLsk X-Received: from maskray.svl.corp.google.com ([2620:15c:2d3:205:57db:b73a:fd87:4f18]) (user=maskray job=sendgmr) by 2002:a81:b1c8:0:b0:58c:7cb1:10f with SMTP id p191-20020a81b1c8000000b0058c7cb1010fmr15525ywh.9.1695169051817; Tue, 19 Sep 2023 17:17:31 -0700 (PDT) Date: Tue, 19 Sep 2023 17:17:28 -0700 Mime-Version: 1.0 Message-ID: <20230920001728.1439947-1-maskray@google.com> Subject: [PATCH] x86/speculation, objtool: Use absolute relocations for annotations From: Fangrui Song <maskray@google.com> To: x86@kernel.org, Josh Poimboeuf <jpoimboe@kernel.org>, Peter Zijlstra <peterz@infradead.org> Cc: linux-kernel@vger.kernel.org, llvm@lists.linux.dev, Nick Desaulniers <ndesaulniers@google.com>, Fangrui Song <maskray@google.com> Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Tue, 19 Sep 2023 17:17:49 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777513634464936459 X-GMAIL-MSGID: 1777513634464936459 |
Series |
x86/speculation, objtool: Use absolute relocations for annotations
|
|
Commit Message
Fangrui Song
Sept. 20, 2023, 12:17 a.m. UTC
.discard.retpoline_safe sections do not have the SHF_ALLOC flag. These
sections referencing text sections' STT_SECTION symbols with PC-relative
relocations like R_386_PC32 [0] is conceptually not suitable. Newer
LLD will report warnings for REL relocations even for relocatable links
[1].
ld.lld: warning: vmlinux.a(drivers/i2c/busses/i2c-i801.o):(.discard.retpoline_safe+0x120): has non-ABS relocation R_386_PC32 against symbol ''
Switch to absolute relocations instead, which indicate link-time
addresses. In a relocatable link, these addresses are also output
section offsets, used by checks in tools/objtool/check.c. When linking
vmlinux, these .discard.* sections will be discarded, therefore it is
not a problem that R_X86_64_32 cannot represent a kernel address.
Alternatively, we could set the SHF_ALLOC flag for .discard.* sections,
but I think non-SHF_ALLOC for sections to be discarded makes more sense.
Note: if we decide to never support REL architectures (e.g. arm, i386),
we can utilize R_*_NONE relocations (.reloc ., BFD_RELOC_NONE, sym),
making .discard.* sections zero-sized. That said, the section content
waste is 4 bytes per entry, much smaller than sizeof(Elf{32,64}_Rel).
[0] commit 1c0c1faf5692 ("objtool: Use relative pointers for annotations")
Link: https://github.com/ClangBuiltLinux/linux/issues/1937 [1]
Signed-off-by: Fangrui Song <maskray@google.com>
---
arch/x86/include/asm/alternative.h | 4 ++--
arch/x86/include/asm/nospec-branch.h | 4 ++--
include/linux/objtool.h | 10 +++++-----
3 files changed, 9 insertions(+), 9 deletions(-)
Comments
On Tue, Sep 19, 2023 at 05:17:28PM -0700, Fangrui Song wrote: > .discard.retpoline_safe sections do not have the SHF_ALLOC flag. These > sections referencing text sections' STT_SECTION symbols with PC-relative > relocations like R_386_PC32 [0] is conceptually not suitable. Newer > LLD will report warnings for REL relocations even for relocatable links > [1]. > > ld.lld: warning: vmlinux.a(drivers/i2c/busses/i2c-i801.o):(.discard.retpoline_safe+0x120): has non-ABS relocation R_386_PC32 against symbol '' What, why ?!? Please explain more. > Switch to absolute relocations instead, which indicate link-time > addresses. In a relocatable link, these addresses are also output > section offsets, used by checks in tools/objtool/check.c. When linking > vmlinux, these .discard.* sections will be discarded, therefore it is > not a problem that R_X86_64_32 cannot represent a kernel address. > > Alternatively, we could set the SHF_ALLOC flag for .discard.* sections, > but I think non-SHF_ALLOC for sections to be discarded makes more sense. > > Note: if we decide to never support REL architectures (e.g. arm, i386), We have explicit support for REL (as opposed to RELA) architectures, so I don't think we can do that.
On Thu, Sep 21, 2023 at 12:26 AM Peter Zijlstra <peterz@infradead.org> wrote: > > On Tue, Sep 19, 2023 at 05:17:28PM -0700, Fangrui Song wrote: > > .discard.retpoline_safe sections do not have the SHF_ALLOC flag. These > > sections referencing text sections' STT_SECTION symbols with PC-relative > > relocations like R_386_PC32 [0] is conceptually not suitable. Newer > > LLD will report warnings for REL relocations even for relocatable links > > [1]. > > > > ld.lld: warning: vmlinux.a(drivers/i2c/busses/i2c-i801.o):(.discard.retpoline_safe+0x120): has non-ABS relocation R_386_PC32 against symbol '' > > What, why ?!? Please explain more. This can be read as a pedantic warning from the linker. A location relocated by an R_386_PC32 relocation in .discard.retpoline_safe records an offset from the current location (non-allocable) to an text symbol. This offset is conceptually not suitable: in the ELF object file format's model, the non-SHF_ALLOC section is not part of the memory image, so we cannot say that the offset from the non-memory thing to a text symbol is a fixed value. > > Switch to absolute relocations instead, which indicate link-time > > addresses. In a relocatable link, these addresses are also output > > section offsets, used by checks in tools/objtool/check.c. When linking > > vmlinux, these .discard.* sections will be discarded, therefore it is > > not a problem that R_X86_64_32 cannot represent a kernel address. > > > > Alternatively, we could set the SHF_ALLOC flag for .discard.* sections, > > but I think non-SHF_ALLOC for sections to be discarded makes more sense. > > > > Note: if we decide to never support REL architectures (e.g. arm, i386), > > We have explicit support for REL (as opposed to RELA) architectures, so > I don't think we can do that. >
On Thu, Sep 21, 2023 at 12:58:13AM -0700, Fangrui Song wrote: > On Thu, Sep 21, 2023 at 12:26 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > On Tue, Sep 19, 2023 at 05:17:28PM -0700, Fangrui Song wrote: > > > .discard.retpoline_safe sections do not have the SHF_ALLOC flag. These > > > sections referencing text sections' STT_SECTION symbols with PC-relative > > > relocations like R_386_PC32 [0] is conceptually not suitable. Newer > > > LLD will report warnings for REL relocations even for relocatable links > > > [1]. > > > > > > ld.lld: warning: vmlinux.a(drivers/i2c/busses/i2c-i801.o):(.discard.retpoline_safe+0x120): has non-ABS relocation R_386_PC32 against symbol '' > > > > What, why ?!? Please explain more. > > This can be read as a pedantic warning from the linker. > > A location relocated by an R_386_PC32 relocation in > .discard.retpoline_safe records an offset from the current location > (non-allocable) to an text symbol. > This offset is conceptually not suitable: in the ELF object file > format's model, the non-SHF_ALLOC section is not part of the memory > image, so > we cannot say that the offset from the non-memory thing to a text > symbol is a fixed value. Bah, so why has this worked at all then? Clearly the linkers aren't very strict about things. Anyway, I think what we want is to just mark the section SHF_ALLOC. The reason is that one of the plans we have is to collapse all the different annotations into a single section and then have something like: struct objtoo_annotation { s32 location; u32 type; } So that we can easily extend the annotations and don't need to add yet-another-section-reader-function to objtool. This is just one of the things we've not gotten around to yet. But as is, we have: .discard.unreachable .discard.reachable .discard.func_stack_frame_non_standard .discard.ignore_alts .discard.unwind_hints .discard.noendbr .discard.retpoline_safe .discard.instr_end .discard.instr_begin .discard.validate_unret .discard.intra_function_calls And with the exception of unwind_hints, they're all just trivial location things. The very last thing we need is yet more of that. If we were to use absolute things, we get 12 byte entries and while that probably wouldn't spell the end of the world, why make thing larger than they have to be. After all, its not like any of this actually survives the final link.
On Thu, Sep 21, 2023 at 8:35 AM Peter Zijlstra <peterz@infradead.org> wrote: > > On Thu, Sep 21, 2023 at 12:58:13AM -0700, Fangrui Song wrote: > > On Thu, Sep 21, 2023 at 12:26 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > > > On Tue, Sep 19, 2023 at 05:17:28PM -0700, Fangrui Song wrote: > > > > .discard.retpoline_safe sections do not have the SHF_ALLOC flag. These > > > > sections referencing text sections' STT_SECTION symbols with PC-relative > > > > relocations like R_386_PC32 [0] is conceptually not suitable. Newer > > > > LLD will report warnings for REL relocations even for relocatable links > > > > [1]. > > > > > > > > ld.lld: warning: vmlinux.a(drivers/i2c/busses/i2c-i801.o):(.discard.retpoline_safe+0x120): has non-ABS relocation R_386_PC32 against symbol '' > > > > > > What, why ?!? Please explain more. > > > > This can be read as a pedantic warning from the linker. > > > > A location relocated by an R_386_PC32 relocation in > > .discard.retpoline_safe records an offset from the current location > > (non-allocable) to an text symbol. > > This offset is conceptually not suitable: in the ELF object file > > format's model, the non-SHF_ALLOC section is not part of the memory > > image, so > > we cannot say that the offset from the non-memory thing to a text > > symbol is a fixed value. > > Bah, so why has this worked at all then? Clearly the linkers aren't very > strict about things. GNU ld isn't very strict, but LLD has had a warning for non-relocatable links for a long time (https://github.com/llvm/llvm-project/blob/main/lld/test/ELF/non-abs-reloc.s). LLD just did not report warnings for relocatable links. > Anyway, I think what we want is to just mark the section SHF_ALLOC. The > reason is that one of the plans we have is to collapse all the different > annotations into a single section and then have something like: > > struct objtoo_annotation { > s32 location; > u32 type; > } > > So that we can easily extend the annotations and don't need to add > yet-another-section-reader-function to objtool. > > This is just one of the things we've not gotten around to yet. But as > is, we have: > > .discard.unreachable > .discard.reachable > .discard.func_stack_frame_non_standard > .discard.ignore_alts > .discard.unwind_hints > .discard.noendbr > .discard.retpoline_safe > .discard.instr_end > .discard.instr_begin > .discard.validate_unret > .discard.intra_function_calls > > And with the exception of unwind_hints, they're all just trivial > location things. > > The very last thing we need is yet more of that. If these sections are guaranteed to be discarded (*(.discard.*) in scripts/module.lds.S and include/asm-generic/vmlinux.lds.h), using non-SHF_ALLOC sections isn't a bad choice. The intention is actually clearer. > If we were to use absolute things, we get 12 byte entries and while that > probably wouldn't spell the end of the world, why make thing larger than > they have to be. > > After all, its not like any of this actually survives the final link. I do not see why absolute things need 12 byte entries. We can freely use `.long .text.foo` even in ELFCLASS64 object files. There is no risk of overflow (the ultimate link .text.foo may have an address of 0xffffffff........) since the section will be discarded. Referencing SHF_ALLOC sections with absolute relocations in non-SHF_ALLOC sections has well-defined semantics, as used by .debug_* sections.
On Thu, Sep 21, 2023 at 09:26:43AM -0700, Fangrui Song wrote: > I do not see why absolute things need 12 byte entries. > We can freely use `.long .text.foo` even in ELFCLASS64 object files. > There is no risk of overflow (the ultimate link .text.foo may have an > address of 0xffffffff........) since the section will be discarded. And you're sure no toolchain is going to be clever and tell me that the absolute relocation will want to be 8 bytes and does not fit in the 4 bytes allotted? Because clearly that is something some clever assembler is going to complain about any day now.
On Thu, Sep 21, 2023 at 10:19 AM Peter Zijlstra <peterz@infradead.org> wrote: > > On Thu, Sep 21, 2023 at 09:26:43AM -0700, Fangrui Song wrote: > > > I do not see why absolute things need 12 byte entries. > > We can freely use `.long .text.foo` even in ELFCLASS64 object files. > > There is no risk of overflow (the ultimate link .text.foo may have an > > address of 0xffffffff........) since the section will be discarded. > > And you're sure no toolchain is going to be clever and tell me that the > absolute relocation will want to be 8 bytes and does not fit in the 4 > bytes allotted? > Because clearly that is something some clever assembler is going to > complain about any day now. Well, only if the clever assembler doesn't support 32-bit absolute relocation for a 64-bit architecture. I don't know such an architecture. In addition, as long as the architecture intends to support DWARF32, it has to support 32-bit absolute relocations for a 64-bit architecture. Of course, I cannot predict new toolchains for new architectures from doing insensible thing, but DWARF32 support and other metadata section uses are pretty strong arguments for them to add a 32-bit absolute relocation type. Note: some .discard.* sections before commit 1c0c1faf5692 ("objtool: Use relative pointers for annotations") used absolute relocations.
On Thu, Sep 21, 2023 at 10:36:27AM -0700, Fangrui Song wrote: > Well, only if the clever assembler doesn't support 32-bit absolute > relocation for a 64-bit architecture. > I don't know such an architecture. In addition, as long as the > architecture intends to support DWARF32, it has to support 32-bit > absolute relocations for a 64-bit architecture. Ooh... my bad. For some reason I thought that absolute meant native word size. But you already mentioned R_X86_64_32 (and I failed to check) and that is indeed an absolute (S+A) relocation of 32bit (dword) size. And apparently we also have R_X64_64_16 and R_X86_64_8, which would even allow something like: #define OBJTOOL_ANNOTATE(type) \ "999:\n\t" \ ".pushsection .discard.objtool_annotate\n\t" \ ".byte 999b\n\t" \ ".byte " __stringify(type) "\n\t" \ ".popsection\n\t" And since we only read the relocation and don't care for the actual result that would actually work just fine. Anyway, thanks for bearing with me. Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
On Thu, Sep 21, 2023 at 09:22:53PM +0200, Peter Zijlstra wrote: > On Thu, Sep 21, 2023 at 10:36:27AM -0700, Fangrui Song wrote: > > > Well, only if the clever assembler doesn't support 32-bit absolute > > relocation for a 64-bit architecture. > > I don't know such an architecture. In addition, as long as the > > architecture intends to support DWARF32, it has to support 32-bit > > absolute relocations for a 64-bit architecture. > > Ooh... my bad. For some reason I thought that absolute meant native word > size. But you already mentioned R_X86_64_32 (and I failed to check) and > that is indeed an absolute (S+A) relocation of 32bit (dword) size. > > And apparently we also have R_X64_64_16 and R_X86_64_8, which would even > allow something like: Hurm, just checked PPC/PPC64 and ARM64 and they only do 16bit (and up) absolute relocations, not the single byte form. So if I want to keep this portable, I suppose I shouldn't go smaller.
On Thu, Sep 21, 2023 at 12:22 PM Peter Zijlstra <peterz@infradead.org> wrote: > > On Thu, Sep 21, 2023 at 10:36:27AM -0700, Fangrui Song wrote: > > > Well, only if the clever assembler doesn't support 32-bit absolute > > relocation for a 64-bit architecture. > > I don't know such an architecture. In addition, as long as the > > architecture intends to support DWARF32, it has to support 32-bit > > absolute relocations for a 64-bit architecture. > > Ooh... my bad. For some reason I thought that absolute meant native word > size. But you already mentioned R_X86_64_32 (and I failed to check) and > that is indeed an absolute (S+A) relocation of 32bit (dword) size. > > And apparently we also have R_X64_64_16 and R_X86_64_8, which would even > allow something like: > > #define OBJTOOL_ANNOTATE(type) \ > "999:\n\t" \ > ".pushsection .discard.objtool_annotate\n\t" \ > ".byte 999b\n\t" \ > ".byte " __stringify(type) "\n\t" \ > ".popsection\n\t" > > And since we only read the relocation and don't care for the actual > result that would actually work just fine. > > Anyway, thanks for bearing with me. > > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Thanks! I assume that the patch can be picked up without me doing anything :) Yes, x86 also supports 1-byte and 2-byte absolute relocation types, which are missing from some other architectures. If we want to optimize for RELA, we can use R_*_NONE by utilizing `.reloc ., BFD_RELOC_NONE, .text.foo` (as mentioned in the commit message). (binutils 2.26 https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=740bdc67c057ee8012327420848eb134e1db4211; I added the support to most LLVM targets in 2021). However, this is just 4 byte per entry difference compared with the large sizeof(Elf{32,64}_Rel), so not worth the trouble:)
On Thu, Sep 21, 2023 at 01:07:09PM -0700, Fangrui Song wrote: > On Thu, Sep 21, 2023 at 12:22 PM Peter Zijlstra <peterz@infradead.org> wrote: > > Anyway, thanks for bearing with me. > > > > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> > > Thanks! I assume that the patch can be picked up without me doing anything :) Yep, we'll get it sorted. Thanks!
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h index 9c4da699e11a..65f79092c9d9 100644 --- a/arch/x86/include/asm/alternative.h +++ b/arch/x86/include/asm/alternative.h @@ -58,7 +58,7 @@ #define ANNOTATE_IGNORE_ALTERNATIVE \ "999:\n\t" \ ".pushsection .discard.ignore_alts\n\t" \ - ".long 999b - .\n\t" \ + ".long 999b\n\t" \ ".popsection\n\t" /* @@ -352,7 +352,7 @@ static inline int alternatives_text_reserved(void *start, void *end) .macro ANNOTATE_IGNORE_ALTERNATIVE .Lannotate_\@: .pushsection .discard.ignore_alts - .long .Lannotate_\@ - . + .long .Lannotate_\@ .popsection .endm diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index c55cc243592e..4952b73d944e 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h @@ -196,7 +196,7 @@ .macro ANNOTATE_RETPOLINE_SAFE .Lhere_\@: .pushsection .discard.retpoline_safe - .long .Lhere_\@ - . + .long .Lhere_\@ .popsection .endm @@ -334,7 +334,7 @@ #define ANNOTATE_RETPOLINE_SAFE \ "999:\n\t" \ ".pushsection .discard.retpoline_safe\n\t" \ - ".long 999b - .\n\t" \ + ".long 999b\n\t" \ ".popsection\n\t" typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE]; diff --git a/include/linux/objtool.h b/include/linux/objtool.h index 03f82c2c2ebf..6f6da95fe7f9 100644 --- a/include/linux/objtool.h +++ b/include/linux/objtool.h @@ -48,13 +48,13 @@ #define ANNOTATE_NOENDBR \ "986: \n\t" \ ".pushsection .discard.noendbr\n\t" \ - ".long 986b - .\n\t" \ + ".long 986b\n\t" \ ".popsection\n\t" #define ASM_REACHABLE \ "998:\n\t" \ ".pushsection .discard.reachable\n\t" \ - ".long 998b - .\n\t" \ + ".long 998b\n\t" \ ".popsection\n\t" #else /* __ASSEMBLY__ */ @@ -66,7 +66,7 @@ #define ANNOTATE_INTRA_FUNCTION_CALL \ 999: \ .pushsection .discard.intra_function_calls; \ - .long 999b - .; \ + .long 999b; \ .popsection; /* @@ -118,7 +118,7 @@ .macro ANNOTATE_NOENDBR .Lhere_\@: .pushsection .discard.noendbr - .long .Lhere_\@ - . + .long .Lhere_\@ .popsection .endm @@ -141,7 +141,7 @@ .macro REACHABLE .Lhere_\@: .pushsection .discard.reachable - .long .Lhere_\@ - . + .long .Lhere_\@ .popsection .endm