[PATCH] "used" attribute saves decl from linker garbage collection

Jeff Law law@redhat.com
Fri Nov 6 23:37:42 GMT 2020


On 11/6/20 4:29 PM, H.J. Lu wrote:
> On Fri, Nov 6, 2020 at 3:22 PM Jeff Law <law@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
>>> <jozef.l@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



More information about the Gcc-patches mailing list