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. jeff