public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Tan Yuan <tanyuan@tinylab.org>
To: i@maskray.me
Cc: amodra@gmail.com, falcon@tinylab.org, binutils@sourceware.org
Subject: Re: [PATCH 0/1] gas: add new command line option --no-group-check
Date: Mon, 24 Jul 2023 17:28:02 +0800	[thread overview]
Message-ID: <20230724092802.110-1-tanyuan@tinylab.org> (raw)
In-Reply-To: <DS7PR12MB5765A326273E125586D742F7CB3CA@DS7PR12MB5765.namprd12.prod.outlook.com>

On Mon, Jul 24, 2023 at 1:15 AM Fangrui Song <i@maskray.me> wrote:
> On Sun, Jul 23, 2023 at 2:10 AM Tan Yuan <tanyuan@tinylab.org> wrote:
> >
> > Hi,
> >
> > Thanks for your reply and your advice inspired me a lot.
> >
> > On Sat, 22 Jul 2023 at 00:32 Song Fangrui <i@maskray.me> wrote:
> > > On Fri, Jul 21, 2023 at 8:14 AM Tan Yuan <tanyuan@tinylab.org> wrote:
> > > >
> > > > Hi, list
> > > >
> > > > This patch introduces a new option that allows suppressing the 
> > > > warning when attaching a group to a section that already belongs to a group.
> > > >
> > > > The kernel extensively uses the ".pushsection" directive, which 
> > > > poses issues with proper reference building and garbage 
> > > > collection. To address this problem, the kernel uses "KEEP" in the 
> > > > linker script to prevent certain sections from being garbage 
> > > > collected. Consequently, some sections that should have been 
> > > > garbage collected are retained. For instance, if the section 
> > > > pusher is being garbage collected, the pushed sections are also 
> > > > supposed to be collected, but the linker script retains them.
> > > >
> > > > To resolve this, we can utilize ".attach_to_group" alongside 
> > > > ".pushsection," which enables the section pusher and the pushed 
> > > > sections to be grouped together, making them either eligible for 
> > > > garbage collection or kept together.
> > > >
> > > > Currently, the kernel encapsulates the use of ".pushsection" 
> > > > within macros, leading to thousands of instances where these 
> > > > macros are expanded. Rather than adding ".attach_to_group" to a 
> > > > thousand functions, we can incorporate it into this macro. 
> > > > However, some functions expand this macro multiple times, 
> > > > resulting in multiple attachments to the group for those 
> > > > functions. Unfortunately, there is no alternative method to ensure 
> > > > a single expansion of ".attach_to_group" As a solution, we propose adding an option to address this issue.
> > > >
> > > > Thanks.
> > >
> > > I am curious whether the "kernel" in your message refers to the Linux kernel.
> > > .attach_to_group is a new directive from Oct 2020 and the Linux 
> > > kernel doesn't use it.
> >
> > The Linux kernel uses ".pushsection" and forcefully "KEEP" them. It 
> > unnecessarily retains some pushed sections, increasing the size of 
> > vmlinux. I came up with an idea that we can group section pushers and 
> > pushed sections and make them garbage collect together, as if there's 
> > no section pusher, there won't be a need for pushed sections anymore.
> >
> > > If you have plans to use .attach_to_group in the upstream kernel, 
> > > I'd like to hear more as LLVM integrated assembler doesn't support 
> > > .attach_to_group and I think it would be difficult to add the support.
> > > Some use cases of .attach_to_group (which doesn't intend to support 
> > > GRP_COMDAT groups) can be replaced with SHF_LINK_ORDER [1] (with 
> > > good support in newer binutils; I am unsure whether it's 2.35/2.36 
> > > that it looks stable):
> > >
> > > [1]: 
> > > https://maskray.me/blog/2021-01-31-metadata-sections-comdat-and-shf-
> > > link-order I shall revise the article, but it basically covers most 
> > > things I can think of.
> >
> > I had the pleasure of reading your article and was pleasantly 
> > surprised to discover the functionality of SHF_LINK_ORDER. After some 
> > experiments, the SHF_LINK_ORDER methods results same with the “.attach_to_group” methods.
> >
> > However, when it comes to .s file, SHF_LINK_ORDER methods cannot 
> > replace with ".attach_to_group" methods. It's seems to be hard to find 
> > a symbol name to refer when assembly macro expand.
> >
> > For example, if we modify the kernel code as follows, adding a label 
> > before the .pushsection to make the pushed section refer to the section pusher.
> >
> >     diff --git a/arch/riscv/include/asm/asm-extable.h b/arch/riscv/include/asm/asm-extable.h
> >     index 14be0673f5b5..1ade4f8fd79e 100644
> >     --- a/arch/riscv/include/asm/asm-extable.h
> >     +++ b/arch/riscv/include/asm/asm-extable.h
> >     @@ -7,10 +7,13 @@
> >     #define EX_TYPE_BPF                    2
> >     #define EX_TYPE_UACCESS_ERR_ZERO       3
> >
> >     +#define ___PASTE(a,b) a##b
> >     +#define __PASTE(a,b) ___PASTE(a,b)
> >     +
> >     #ifdef __ASSEMBLY__
> >
> >     #define __ASM_EXTABLE_RAW(insn, fixup, type, data)     \
> >     -       .pushsection    __ex_table, "a";                \
> >     +       __PASTE(__extable,__LINE__): .pushsection       __ex_table, "ao",__PASTE(__extable,__LINE__);           \
> >             .balign         4;                              \
> >             .long           ((insn) - .);                   \
> >             .long           ((fixup) - .);                  \
> >
> > __ASM_EXTABLE_RAW will expand to linux/arch/riscv/lib/uaccess.s:
> >
> >     .macro _asm_extable, insn, fixup
> >     __extable30: .pushsection __ex_table, "ao",__extable30; .balign 4; .long ((\insn) - .); .long ((\fixup) - .); .short (1); .short (0); .popsection;
> >     .endm
> >
> > The C macro expands to an assembly macro, which, in turn, is expanded 
> > multiple times, leading to error of multiple definition of symbols.  
> > This situation is similar to receiving a warning when attempting to 
> > attach to a group multiple times.
> >
> > And it seems that there is no way to set symbol only in section scope, 
> > and there is no fixed symbol in sections pusher that pushed section can refer to.
> > Is there any possible solution to such a situation?
> >
> > At last, thank you once again for suggesting the SHF_LINK_ORDER method.
> >
> > Tan Yuan


Hi,

We just found an alternative way to solve this problem. As the perfect
functionality of SHF_LINK_ORDER, it can replace .attach_to_group completely in
our working patch to Linux kernel.

Very grateful for your advice.


> Hi Tan, is the following your intended use case?
> 
> cat > a.s <<eof
> .macro _asm_extable, insn, fixup
>   .pushsection __ex_table, "a"
>   .attach_to_group .text
>   .byte 0
>   .popsection
> .endm
> 
> .globl __asm_copy_to_user
> __asm_copy_to_user:
> 100:
>   _asm_extable 100b, 10f
>   addi a1, a1, 1
>   _asm_extable 100b, 10f
>   addi a0, a0, 1
> 10:
> eof
> riscv64-linux-gnu-gcc -c a.s
> 
> % readelf -g a.o
> 
> group section [    1] `.group' [.text] contains 2 sections:
>    [Index]    Name
>    [    5]   __ex_table
>    [    6]   __ex_table
> 
> There are two __ex_table sections in the section group. This is a bit wasteful due to excess section headers, but the linker will combine them.
> 
> If you switch to SHF_LINK_ORDER, you can use the section symbol .text:
> .pushsection __ex_table, "ao", @progbits, .text This is well supported in gas from 2.35 onwards and LLVM integrated assembler.

It is a lot complicated, as -ffunction-sections should be enable so the .text
become something else like .text.function_name. But it won’t be a problem
anymore. We use some macro magic to solve it.

I just check GCC 7.3 with binutils 2.30 works well with our SHF_LINK_ORDER
patch when compiling kernel. By the way, do you know when LLVM integrated
assembler supports SHF_LINK_ORDER?

> > > > Tan Yuan (1): gas: add new command line option --no-group-check
> > > >
> > > >  gas/as.c             | 10 +++++++++- gas/as.h             |  3 +++
> > > >  gas/config/obj-elf.c |  2 +- gas/doc/as.texi      |  4 ++++ 4 files
> > > >  changed, 17 insertions(+), 2 deletions(-)
> > > >
> > > > -- 2.41.0
> > > >
> 
> 

  parent reply	other threads:[~2023-07-24  9:28 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <DS7PR12MB5765A326273E125586D742F7CB3CA@DS7PR12MB5765.namprd12.prod.outlook.com>
2023-07-23  9:10 ` Tan Yuan
2023-07-23 17:15   ` Fangrui Song
2023-07-24  9:28 ` Tan Yuan [this message]
2023-07-21 15:14 Tan Yuan
2023-07-21 22:55 ` Alan Modra
2023-07-22  3:47   ` Tan Yuan
2023-07-22  3:56     ` Xi Ruoyao
2023-07-23  9:31       ` Tan Yuan
2023-07-22  0:32 ` Song Fangrui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230724092802.110-1-tanyuan@tinylab.org \
    --to=tanyuan@tinylab.org \
    --cc=amodra@gmail.com \
    --cc=binutils@sourceware.org \
    --cc=falcon@tinylab.org \
    --cc=i@maskray.me \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).