diff --git a/gas/NEWS b/gas/NEWS index 7ae58506ec..0ef33ab60e 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -1,4 +1,7 @@ -*- text -*- +* Add a .attach-to_group directive which allows a section to added to a group + even after the section has been created. + * Add support for Intel TDX instructions. * Add support for Intel Key Locker instructions. diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index b1c99020a3..5f61204bce 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -78,9 +78,11 @@ static void obj_elf_gnu_attribute (int); static void obj_elf_tls_common (int); static void obj_elf_lcomm (int); static void obj_elf_struct (int); +static void obj_elf_attach_to_group (int); static const pseudo_typeS elf_pseudo_table[] = { + {"attach_to_group", obj_elf_attach_to_group, 0}, {"comm", obj_elf_common, 0}, {"common", obj_elf_common, 1}, {"ident", obj_elf_ident, 0}, @@ -1040,6 +1042,28 @@ obj_elf_section_name (void) return name; } +static void +obj_elf_attach_to_group (int dummy ATTRIBUTE_UNUSED) +{ + const char * gname = obj_elf_section_name (); + + if (gname == NULL) + { + as_warn (_("group name not parseable")); + return; + } + + if (elf_group_name (now_seg)) + { + as_warn (_("section %s already has a group (%s)"), + bfd_section_name (now_seg), elf_group_name (now_seg)); + return; + } + + elf_group_name (now_seg) = xstrdup (gname); + elf_section_flags (now_seg) |= SHF_GROUP; +} + void obj_elf_section (int push) { diff --git a/gas/doc/as.texi b/gas/doc/as.texi index b88c1f9997..c0baa94536 100644 --- a/gas/doc/as.texi +++ b/gas/doc/as.texi @@ -4362,6 +4362,7 @@ Some machine configurations provide additional directives. * Altmacro:: @code{.altmacro} * Ascii:: @code{.ascii "@var{string}"}@dots{} * Asciz:: @code{.asciz "@var{string}"}@dots{} +* Attach_to_group:: @code{.attach_to_group @var{name}} * Balign:: @code{.balign [@var{abs-expr}[, @var{abs-expr}]]} * Bundle directives:: @code{.bundle_align_mode @var{abs-expr}}, etc * Byte:: @code{.byte @var{expressions}} @@ -4663,6 +4664,13 @@ trailing zero byte) into consecutive addresses. @code{.asciz} is just like @code{.ascii}, but each string is followed by a zero byte. The ``z'' in @samp{.asciz} stands for ``zero''. +@node Attach_to_group +@section @code{.attach_to_group @var{name}} +Attaches the current section to the named group. This is like declaring +the section with the @code{G} attribute, but can be done after the section +has been created. Note if the group section does not exist at the point that +this directive is used then it will be created. + @node Balign @section @code{.balign[wl] [@var{abs-expr}[, @var{abs-expr}[, @var{abs-expr}]]]} @@ -6663,7 +6671,9 @@ a few exceptions to this rule however. Processor and application specific flags can be added to an already defined section. The @code{.interp}, @code{.strtab} and @code{.symtab} sections can have the allocate flag (@code{a}) set after they are initially defined, and the @code{.note-GNU-stack} -section may have the executable (@code{x}) flag added. +section may have the executable (@code{x}) flag added. Also note that the +@code{.attach_to_group} directive can be used to add a section to a group even +if the section was not originally declared to be part of that group. The optional @var{type} argument may contain one of the following constants: diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 135ade24ec..5ce9691b38 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -139,6 +139,10 @@ if { [is_elf_format] } then { run_dump_test "group1b" run_dump_test "group2" run_dump_test "group3" + + run_dump_test "attach-1" + run_dump_test "attach-err" + switch -glob $target_triplet { hppa64*-*-hpux* { } riscv*-*-* { } --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-1.s 2020-09-29 14:30:06.242727518 +0100 @@ -0,0 +1,11 @@ + .text + .nop + + .section foo, "G", %progbits , foo.group + .word 0 + + .text + /* This is the intended use of the .attach_to_group directive. + It attaches a previously defined section (.text) to a + previously defined group (foo.group). */ + .attach_to_group foo.group --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-1.d 2020-09-29 15:53:50.914680109 +0100 @@ -0,0 +1,11 @@ +#readelf: --section-groups +#name: Attaching a section to a group +#source: attach-1.s + +#... +group section \[ 1\] `\.group' \[foo\.group\] contains . sections: + \[Index\] Name + \[ .\] [P|\.text] + \[ .\] foo +#pass + --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-2.d 2020-09-29 14:56:01.546024741 +0100 @@ -0,0 +1,11 @@ +#readelf: --section-groups +#name: Attaching a section to a non-existant group +#source: attach-2.s + +#... +group section \[ 1\] `\.group' \[foo\.group\] contains 2 sections: + \[Index\] Name + \[ .\] bar + \[ .\] foo +#pass + --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-2.s 2020-09-29 14:53:25.041006132 +0100 @@ -0,0 +1,9 @@ + .section bar + .nop + .attach_to_group foo.group + + .section foo, "G", %note , foo.group + .word 0 + + .section bar + .nop --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-err.d 2020-09-29 14:48:14.501953361 +0100 @@ -0,0 +1,3 @@ +#name: Errors generated by .attach_to_group +#source: attach-err.s +#error_output: attach-err.err --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-err.err 2020-09-29 15:54:35.415401125 +0100 @@ -0,0 +1,4 @@ +.*: Assembler messages: +.*:4: Warning: section [P|\.text] already has a group \(does\.not\.exist\) +.*:5: Error: missing name +.*:5: Warning: group name not parseable --- /dev/null 2020-09-29 09:19:37.528268715 +0100 +++ current/gas/testsuite/gas/elf/attach-err.s 2020-09-29 14:45:34.540949111 +0100 @@ -0,0 +1,5 @@ + + /* Test the error messages that should be generated. */ + .attach_to_group does.not.exist /* This is OK, the group does not have to exist. */ + .attach_to_group foo.group /* Already attached. */ + .attach_to_group /* Missing group name. */