On Fri, Nov 6, 2020 at 3:37 PM Jeff Law <l...@redhat.com> wrote: > > > On 11/6/20 4:29 PM, H.J. Lu wrote: > > On Fri, Nov 6, 2020 at 3:22 PM Jeff Law <l...@redhat.com> wrote: > >> > >> On 11/5/20 7:34 AM, H.J. Lu via Gcc-patches wrote: > >>> On Thu, Nov 5, 2020 at 3:37 AM Jozef Lawrynowicz > >>> <joze...@mittosystems.com> wrote: > >>>> On Thu, Nov 05, 2020 at 06:21:21AM -0500, Hans-Peter Nilsson wrote: > >>>>> On Wed, 4 Nov 2020, H.J. Lu wrote: > >>>>>> .retain is ill-defined. For example, > >>>>>> > >>>>>> [hjl@gnu-cfl-2 gcc]$ cat /tmp/x.c > >>>>>> static int xyzzy __attribute__((__used__)); > >>>>>> [hjl@gnu-cfl-2 gcc]$ ./xgcc -B./ -S /tmp/x.c -fcommon > >>>>>> [hjl@gnu-cfl-2 gcc]$ cat x.s > >>>>>> .file "x.c" > >>>>>> .text > >>>>>> .retain xyzzy <<<<<<<<< What does it do? > >>>>>> .local xyzzy > >>>>>> .comm xyzzy,4,4 > >>>>>> .ident "GCC: (GNU) 11.0.0 20201103 (experimental)" > >>>>>> .section .note.GNU-stack,"",@progbits > >>>>>> [hjl@gnu-cfl-2 gcc]$ > >>>>> To answer that question: it's up to the assembler, but for ELF > >>>>> and SHF_GNU_RETAIN, it seems obvious it'd tell the assembler to > >>>>> set SHF_GNU_RETAIN for the section where the symbol ends up. > >>>>> We both know this isn't rocket science with binutils. > >>>> Indeed, and my patch handles it trivially: > >>>> https://sourceware.org/pipermail/binutils/2020-November/113993.html > >>>> > >>>> +void > >>>> +obj_elf_retain (int arg ATTRIBUTE_UNUSED) > >>>> .... snip .... > >>>> + sym = get_sym_from_input_line_and_check (); > >>>> + symbol_get_obj (sym)->retain = 1; > >>>> > >>>> @@ -2624,6 +2704,9 @@ elf_frob_symbol (symbolS *symp, int *puntp) > >>>> } > >>>> } > >>>> > >>>> + if (symbol_get_obj (symp)->retain) > >>>> + elf_section_flags (S_GET_SEGMENT (symp)) |= SHF_GNU_RETAIN; > >>>> + > >>>> /* Double check weak symbols. */ > >>>> if (S_IS_WEAK (symp)) > >>>> { > >>>> > >>>> We could check that the symbol named in the .retain directive has > >>>> already been defined, however this isn't compatible with GCC > >>>> mark_decl_preserved handling, since mark_decl_preserved is called > >>>> emitted before the local symbols are defined in the assembly output > >>>> file. > >>>> > >>>> GAS should at least validate that the symbol named in the .retain > >>>> directive does end up as a symbol though. > >>>> > >>> Don't add .retain. > >> Why? I don't see why you find it so objectionable. > >> > > An ELF symbol directive should operate on symbol table: > > > > http://www.sco.com/developers/gabi/latest/ch4.symtab.html > > > > not the section flags where the symbol is defined. > > I agree in general, but I think this is one of those cases where it's > not so clear. And what you're talking about is an implementation detail.
There is no need for such a hack. The proper thing to do in ELF is to place such a symbol in a section with SHF_GNU_RETAIN flag. This also avoids the question what to do with SHN_COMMON. -- H.J.