aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-elf.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2021-05-07 17:07:41 +0100
committerNick Clifton <nickc@redhat.com>2021-05-07 17:08:48 +0100
commit476654beaead1ac1b4322c01722ace865e4adee4 (patch)
tree0cff4b8486bf8727bef5c7a135d0d169ba2cce45 /gas/config/obj-elf.c
parent8a82de5884386be4c10f16eb55a94993ac6ea858 (diff)
downloadfsf-binutils-gdb-476654beaead1ac1b4322c01722ace865e4adee4.zip
fsf-binutils-gdb-476654beaead1ac1b4322c01722ace865e4adee4.tar.gz
fsf-binutils-gdb-476654beaead1ac1b4322c01722ace865e4adee4.tar.bz2
Add a generic .bss directive for ELF based targets.
PR 3136 * config/obj-elf.c (elf_pseudo_table): Add entry for .bss. (obj_elf_bss): New function. Change to the .bss section. Support an optional subsection number. (obj_elf_change_section): Call obj_elf_section_change_hook. (obj_elf_section): Likewise. (obj_elf_data): Likewise. (obj_elf_text): Likewise. (obj_elf_struct): Likewise. (obj_elf_subsection): Likewise. (obj_elf_previous): Likewise. * config/obj-elf.h (obj_elf_bss): Prototype. * doc/as.texi (Bss): New node.
Diffstat (limited to 'gas/config/obj-elf.c')
-rw-r--r--gas/config/obj-elf.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 9f85c57..e93d59c 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -131,6 +131,7 @@ static const pseudo_typeS elf_pseudo_table[] =
{"offset", obj_elf_struct, 0},
{"struct", obj_elf_struct, 0},
{"text", obj_elf_text, 0},
+ {"bss", obj_elf_bss, 0},
{"tls_common", obj_elf_tls_common, 0},
@@ -603,8 +604,8 @@ obj_elf_change_section (const char *name,
elt->prev_subseg = previous_subsection;
section_stack = elt;
}
- previous_section = now_seg;
- previous_subsection = now_subseg;
+
+ obj_elf_section_change_hook ();
old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section_by_match,
(void *) match_p);
@@ -1125,8 +1126,7 @@ obj_elf_section (int push)
md_flush_pending_output ();
#endif
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
s_mri_sect (&mri_type);
@@ -1467,6 +1467,28 @@ obj_elf_section (int push)
subseg_set (now_seg, new_subsection);
}
+/* Change to the .bss section. */
+
+void
+obj_elf_bss (int i ATTRIBUTE_UNUSED)
+{
+ int temp;
+
+#ifdef md_flush_pending_output
+ md_flush_pending_output ();
+#endif
+
+ obj_elf_section_change_hook ();
+
+ temp = get_absolute_expression ();
+ subseg_set (bss_section, (subsegT) temp);
+ demand_empty_rest_of_line ();
+
+#ifdef md_elf_section_change_hook
+ md_elf_section_change_hook ();
+#endif
+}
+
/* Change to the .data section. */
void
@@ -1476,8 +1498,8 @@ obj_elf_data (int i)
md_flush_pending_output ();
#endif
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
+
s_data (i);
#ifdef md_elf_section_change_hook
@@ -1494,8 +1516,8 @@ obj_elf_text (int i)
md_flush_pending_output ();
#endif
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
+
s_text (i);
#ifdef md_elf_section_change_hook
@@ -1512,8 +1534,8 @@ obj_elf_struct (int i)
md_flush_pending_output ();
#endif
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
+
s_struct (i);
#ifdef md_elf_section_change_hook
@@ -1530,8 +1552,7 @@ obj_elf_subsection (int ignore ATTRIBUTE_UNUSED)
md_flush_pending_output ();
#endif
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
temp = get_absolute_expression ();
subseg_set (now_seg, (subsegT) temp);
@@ -1570,8 +1591,8 @@ obj_elf_previous (int ignore ATTRIBUTE_UNUSED)
new_section = previous_section;
new_subsection = previous_subsection;
- previous_section = now_seg;
- previous_subsection = now_subseg;
+ obj_elf_section_change_hook ();
+
subseg_set (new_section, new_subsection);
#ifdef md_elf_section_change_hook