https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98121
--- Comment #8 from Jozef Lawrynowicz <jozefl at gcc dot gnu.org> --- (In reply to Jozef Lawrynowicz from comment #7) > (In reply to Florian Weimer from comment #6) > > (In reply to Jozef Lawrynowicz from comment #4) > > > GAS merges the "R" flag state in .section declarations, silently, and with > > > logical OR, and GCC should do the same. So if you have: > > > > > > int __attribute__((section(".data.foo"))) foo1 = 1; > > > int __attribute__((used,section(".data.foo"))) foo2 = 2; > > > > > > .data.foo should have SECTION_RETAIN set within GCC. The addition of the > > > "used" attribute to the second declaration of section(".data.foo") should > > > not cause any warning/error messages to be emitted either. So option 3 > > > from > > > above. > > > > > > Just need to do something similar to what is already done for > > > SECTION_NOTYPE > > > in varasm.c:get_section. > > > > I don't now the details, but I think foo1 should not implicitly be marked as > > “used”. The difference matters for static functions, for example. GCC should > > still drop them if they are not referenced, even if they are located in a > > retained section. So free_slotinfo in comment 5. > > With the suggested approach, GCC would still drop foo1 if it is not used, > since it is only the section being marked with SECTION_RETAIN, and this only > affects whether the "R" flag is output in the .section directive for the > decl. > > GCC will only keep an unreferenced decl if it has DECL_PRESERVE_P and we > haven't changed that with the "used" applies SHF_GNU_RETAIN functionality. > > If foo1 somehow makes it into the assembler code, it will be kept, even if > it is not used, since we lose the ability to remove individual decls once > they are put in sections. Sorry, in my foo1/foo2 example they are not static so will not be dropped by GCC. For the free_slotinfo example, it would be dropped by GCC if unused, even though another function with the same section was marked "used" and has SECTION_RETAIN.