mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-26 02:33:31 +08:00
gas: Generate a new section for SHF_GNU_RETAIN
For .globl foo2 .section .data.foo,"aR" .align 4 .type foo2, @object .size foo2, 4 foo2: .long 2 .globl foo1 .section .data.foo .align 4 .type foo1, @object .size foo1, 4 foo1: .long 1 generate a new section if the SHF_GNU_RETAIN bit doesn't match. * 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.
This commit is contained in:
parent
dd235d453e
commit
037311d1df
@ -1,3 +1,19 @@
|
||||
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.
|
||||
|
@ -519,6 +519,9 @@ struct section_stack
|
||||
|
||||
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
|
||||
@ -529,9 +532,12 @@ get_section_by_match (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
|
||||
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
|
||||
@ -740,7 +746,7 @@ obj_elf_change_section (const char *name,
|
||||
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)
|
||||
@ -806,17 +812,9 @@ obj_elf_change_section (const char *name,
|
||||
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);
|
||||
@ -1322,18 +1320,21 @@ obj_elf_section (int push)
|
||||
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;
|
||||
|
@ -106,8 +106,9 @@ struct elf_section_match
|
||||
{
|
||||
const char * group_name;
|
||||
const char * linked_to_symbol_name;
|
||||
unsigned int info;
|
||||
unsigned int section_id;
|
||||
unsigned int sh_info; /* ELF section information. */
|
||||
bfd_vma sh_flags; /* ELF section flags. */
|
||||
flagword flags;
|
||||
};
|
||||
|
||||
|
@ -268,6 +268,7 @@ if { [is_elf_format] } then {
|
||||
run_dump_test "section24b"
|
||||
run_dump_test "section25"
|
||||
run_dump_test "section26"
|
||||
run_dump_test "section27"
|
||||
run_dump_test "sh-link-zero"
|
||||
run_dump_test "dwarf2-1" $dump_opts
|
||||
run_dump_test "dwarf2-2" $dump_opts
|
||||
|
@ -3,8 +3,12 @@
|
||||
#source: section24.s
|
||||
#readelf: -S --wide
|
||||
|
||||
#failif
|
||||
#...
|
||||
\[..\] .(text|data|bss|rodata)[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 [^R] .*
|
||||
\[..\] .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 .*
|
||||
#...
|
||||
\[..\] .rodata[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A .*
|
||||
#pass
|
||||
|
||||
|
19
gas/testsuite/gas/elf/section27.d
Normal file
19
gas/testsuite/gas/elf/section27.d
Normal file
@ -0,0 +1,19 @@
|
||||
#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
|
34
gas/testsuite/gas/elf/section27.s
Normal file
34
gas/testsuite/gas/elf/section27.s
Normal file
@ -0,0 +1,34 @@
|
||||
.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
|
Loading…
Reference in New Issue
Block a user