+2020-12-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/obj-elf.c (SEC_ASSEMBLER_SHF_MASK): New.
+ (get_section_by_match): Also check if SEC_ASSEMBLER_SHF_MASK of
+ sh_flags matches. Rename info to sh_info.
+ (obj_elf_change_section): Don't check previous SHF_GNU_RETAIN.
+ Rename info to sh_info.
+ (obj_elf_section): Rename info to sh_info. Set sh_flags for
+ SHF_GNU_RETAIN.
+ * config/obj-elf.h (elf_section_match): Rename info to sh_info.
+ Add sh_flags.
+ * testsuite/gas/elf/elf.exp: Run section27.
+ * testsuite/gas/elf/section24b.d: Updated.
+ * testsuite/gas/elf/section27.d: New file.
+ * testsuite/gas/elf/section27.s: Likewise.
+
2020-12-04 Andreas Krebbel <krebbel@linux.ibm.com>
* testsuite/gas/s390/zarch-z10.s: Add tests for risbgz.
static struct section_stack *section_stack;
+/* ELF section flags for unique sections. */
+#define SEC_ASSEMBLER_SHF_MASK SHF_GNU_RETAIN
+
/* Return TRUE iff SEC matches the section info INF. */
static bfd_boolean
const char *group_name = elf_group_name (sec);
const char *linked_to_symbol_name
= sec->map_head.linked_to_symbol_name;
- unsigned int info = elf_section_data (sec)->this_hdr.sh_info;
+ unsigned int sh_info = elf_section_data (sec)->this_hdr.sh_info;
+ bfd_vma sh_flags = (elf_section_data (sec)->this_hdr.sh_flags
+ & SEC_ASSEMBLER_SHF_MASK);
- return (info == match->info
+ return (sh_info == match->sh_info
+ && sh_flags == match->sh_flags
&& ((bfd_section_flags (sec) & SEC_ASSEMBLER_SECTION_ID)
== (match->flags & SEC_ASSEMBLER_SECTION_ID))
&& sec->section_id == match->section_id
type = bfd_elf_get_default_section_type (flags);
elf_section_type (sec) = type;
elf_section_flags (sec) = attr;
- elf_section_data (sec)->this_hdr.sh_info = match_p->info;
+ elf_section_data (sec)->this_hdr.sh_info = match_p->sh_info;
/* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
if (type == SHT_NOBITS)
as_bad (_("changed section attributes for %s"), name);
}
else
- {
- /* Don't overwrite a previously set SHF_GNU_RETAIN flag for the
- section. The entire section must be marked retained. */
- if ((elf_tdata (stdoutput)->has_gnu_osabi & elf_gnu_osabi_retain)
- && ((elf_section_flags (old_sec) & SHF_GNU_RETAIN)))
- attr |= SHF_GNU_RETAIN;
-
- /* FIXME: Maybe we should consider removing a previously set
- processor or application specific attribute as suspicious ? */
- elf_section_flags (sec) = attr;
- }
+ /* FIXME: Maybe we should consider removing a previously set
+ processor or application specific attribute as suspicious? */
+ elf_section_flags (sec) = attr;
if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
as_bad (_("changed section entity size for %s"), name);
if (ISDIGIT (* input_line_pointer))
{
char *t = input_line_pointer;
- match.info = strtoul (input_line_pointer,
+ match.sh_info = strtoul (input_line_pointer,
&input_line_pointer, 0);
- if (match.info == (unsigned int) -1)
+ if (match.sh_info == (unsigned int) -1)
{
as_warn (_("unsupported mbind section info: %s"), t);
- match.info = 0;
+ match.sh_info = 0;
}
}
else
input_line_pointer = save;
}
+ if ((gnu_attr & SHF_GNU_RETAIN) != 0)
+ match.sh_flags |= SHF_GNU_RETAIN;
+
if (*input_line_pointer == ',')
{
char *save = input_line_pointer;
--- /dev/null
+#readelf: -h -S --wide
+#name: SHF_GNU_RETAIN sections 27
+#notarget: ![supports_gnu_osabi]
+
+#...
+ +OS/ABI: +UNIX - (GNU|FreeBSD)
+#...
+ \[..\] .text[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 AX.*
+#...
+ \[..\] .data[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WA.*
+#...
+ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WA.*
+#...
+ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WAR.*
+#...
+ \[..\] .data[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WAR.*
+#...
+ \[..\] .text[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 AXR.*
+#pass
--- /dev/null
+ .section .bss,"aw"
+ .global discard0
+ .type discard0, %object
+discard0:
+ .zero 2
+
+ .section .data,"aw"
+ .global discard1
+ .type discard1, %object
+discard1:
+ .word 1
+
+ .text
+ .global discard2
+ .type discard2, %function
+discard2:
+ .word 0
+
+ .section .bss,"awR",%nobits
+ .global retain0
+ .type retain0, %object
+retain0:
+ .zero 2
+
+ .section .data,"awR",%progbits
+ .type retain1, %object
+retain1:
+ .word 1
+
+ .section .text,"axR",%progbits
+ .global retain2
+ .type retain2, %function
+retain2:
+ .word 0