diff -rupN gcc/gcc/config/arm/aout.h gcc.patched/gcc/config/arm/aout.h
--- gcc/gcc/config/arm/aout.h	2021-11-01 18:01:55.032705893 +0000
+++ gcc.patched/gcc/config/arm/aout.h	2021-11-01 18:02:25.941113559 +0000
@@ -31,9 +31,13 @@
 #endif
 
 /* Switch to the text or data segment.  */
-#define TEXT_SECTION_ASM_OP  	"\t.text"
-#define DATA_SECTION_ASM_OP  	"\t.data"
-#define BSS_SECTION_ASM_OP   	"\t.bss"
+#define TEXT_SECTION_ASM_OP arm_text_section
+#define DATA_SECTION_ASM_OP arm_data_section
+#undef READONLY_DATA_SECTION_ASM_OP
+#define READONLY_DATA_SECTION_ASM_OP arm_readonly_data_section
+#define BSS_SECTION_ASM_OP arm_bss_section
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION arm_asm_named_section
 
 /* Note: If USER_LABEL_PREFIX or LOCAL_LABEL_PREFIX are changed,
    make sure that this change is reflected in the function
diff -rupN gcc/gcc/config/arm/arm.c gcc.patched/gcc/config/arm/arm.c
--- gcc/gcc/config/arm/arm.c	2021-11-01 18:01:55.048706104 +0000
+++ gcc.patched/gcc/config/arm/arm.c	2021-11-01 18:02:25.953113717 +0000
@@ -2415,6 +2415,11 @@ arm_constant_limit (bool size_p)
   return size_p ? 1 : current_tune->constant_limit;
 }
 
+const char *arm_text_section = "\t" ARM_DEFAULT_TEXT_SECTION_NAME;
+const char *arm_data_section = "\t" ARM_DEFAULT_DATA_SECTION_NAME;
+const char *arm_readonly_data_section = "\t.section " ARM_DEFAULT_READONLY_DATA_SECTION_NAME;
+const char *arm_bss_section = "\t" ARM_DEFAULT_BSS_SECTION_NAME;
+
 /* Emit an insn that's a simple single-set.  Both the operands must be known
    to be valid.  */
 inline static rtx_insn *
@@ -3631,6 +3636,35 @@ arm_option_override (void)
       flag_reorder_blocks = 1;
     }
 
+  if (strcmp(arm_text_string, ARM_DEFAULT_TEXT_SECTION_NAME))
+    {
+      #define ARM_TEXT_SECTION_FORMAT "\t.section\t%s,\"ax\",%%progbits\n"
+      char *tmp = XNEWVEC (char, strlen (arm_text_string) + sizeof (ARM_TEXT_SECTION_FORMAT) + 1);
+      sprintf (tmp, ARM_TEXT_SECTION_FORMAT, arm_text_string);
+      arm_text_section = tmp;
+    }
+  if (strcmp(arm_data_string, ARM_DEFAULT_DATA_SECTION_NAME))
+    {
+      #define ARM_DATA_SECTION_FORMAT "\t.section\t%s,\"aw\",%%progbits\n"
+      char *tmp = XNEWVEC (char, strlen (arm_data_string) + sizeof (ARM_DATA_SECTION_FORMAT) + 1);
+      sprintf (tmp, ARM_DATA_SECTION_FORMAT, arm_data_string);
+      arm_data_section = tmp;
+    }
+  if (strcmp(arm_readonly_data_string, ARM_DEFAULT_READONLY_DATA_SECTION_NAME))
+    {
+      #define ARM_READONLY_DATA_SECTION_FORMAT "\t.section\t%s,\"a\",%%progbits\n"
+      char *tmp = XNEWVEC (char, strlen (arm_readonly_data_string) + sizeof (ARM_READONLY_DATA_SECTION_FORMAT) + 1);
+      sprintf (tmp, ARM_READONLY_DATA_SECTION_FORMAT, arm_readonly_data_string);
+      arm_readonly_data_section = tmp;
+    }
+  if (strcmp(arm_bss_string, ARM_DEFAULT_BSS_SECTION_NAME))
+    {
+      #define ARM_BSS_SECTION_FORMAT "\t.section\t%s,\"aw\",%%nobits\n"
+      char *tmp = XNEWVEC (char, strlen (arm_bss_string) + sizeof (ARM_BSS_SECTION_FORMAT) + 1);
+      sprintf (tmp, ARM_BSS_SECTION_FORMAT, arm_bss_string);
+      arm_bss_section = tmp;
+    }
+
   if (flag_pic)
     /* Hoisting PIC address calculations more aggressively provides a small,
        but measurable, size reduction for PIC code.  Therefore, we decrease
@@ -3926,6 +3960,32 @@ arm_fdpic_local_funcdesc_p (rtx fnx)
   return ret;
 }
 
+void arm_asm_named_section (const char *name, unsigned int flags, tree t)
+{
+  char local[1024 * 16];
+  if (strstr(name, ARM_DEFAULT_TEXT_SECTION_NAME ".")==name)
+    {
+      sprintf(local, "%s%s", arm_text_string, name+sizeof(ARM_DEFAULT_TEXT_SECTION_NAME)-1);
+      name = local;
+    }
+  else if (strstr(name, ARM_DEFAULT_DATA_SECTION_NAME ".")==name)
+    {
+      sprintf(local, "%s%s", arm_data_string, name+sizeof(ARM_DEFAULT_DATA_SECTION_NAME)-1);
+      name = local;
+    }
+  else if (strstr(name, ARM_DEFAULT_BSS_SECTION_NAME ".")==name)
+    {
+      sprintf(local, "%s%s", arm_bss_string, name+sizeof(ARM_DEFAULT_BSS_SECTION_NAME)-1);
+      name = local;
+    }
+  else if (strstr(name, ARM_DEFAULT_READONLY_DATA_SECTION_NAME ".")==name)
+    {
+      sprintf(local, "%s%s", arm_readonly_data_string, name+sizeof(ARM_DEFAULT_READONLY_DATA_SECTION_NAME)-1);
+      name = local;
+    }
+  default_elf_asm_named_section(name, flags, t);
+}
+
 static void
 arm_add_gc_roots (void)
 {
diff -rupN gcc/gcc/config/arm/arm.h gcc.patched/gcc/config/arm/arm.h
--- gcc/gcc/config/arm/arm.h	2021-11-01 18:01:55.044706052 +0000
+++ gcc.patched/gcc/config/arm/arm.h	2021-11-01 18:02:25.953113717 +0000
@@ -1836,6 +1836,17 @@ enum arm_auto_incmodes
   if (TARGET_THUMB2)			\
     thumb2_asm_output_opcode (STREAM);
 
+#define ARM_DEFAULT_TEXT_SECTION_NAME  ".text"
+#define ARM_DEFAULT_DATA_SECTION_NAME  ".data"
+#define ARM_DEFAULT_READONLY_DATA_SECTION_NAME  ".rodata"
+#define ARM_DEFAULT_BSS_SECTION_NAME ".bss"
+
+extern const char *arm_text_section;
+extern const char *arm_data_section;
+extern const char *arm_readonly_data_section;
+extern const char *arm_bss_section;
+void arm_asm_named_section (const char *name, unsigned int flags, tree t);
+
 /* The EABI specifies that constructors should go in .init_array.
    Other targets use .ctors for compatibility.  */
 #ifndef ARM_EABI_CTORS_SECTION_OP
diff -rupN gcc/gcc/config/arm/arm.opt gcc.patched/gcc/config/arm/arm.opt
--- gcc/gcc/config/arm/arm.opt	2021-11-01 18:01:55.044706052 +0000
+++ gcc.patched/gcc/config/arm/arm.opt	2021-11-01 18:02:25.953113717 +0000
@@ -285,6 +285,22 @@ munaligned-access
 Target Report Var(unaligned_access) Init(2) Save
 Enable unaligned word and halfword accesses to packed data.
 
+mtext=
+Target RejectNegative Joined Var(arm_text_string) Init(ARM_DEFAULT_TEXT_SECTION_NAME)
+-mtext=SECTION Put functions in SECTION
+
+mdata=
+Target RejectNegative Joined Var(arm_data_string) Init(ARM_DEFAULT_DATA_SECTION_NAME)
+-mdata=SECTION Put data in SECTION
+
+mrodata=
+Target RejectNegative Joined Var(arm_readonly_data_string) Init(ARM_DEFAULT_READONLY_DATA_SECTION_NAME)
+-mrodata=SECTION Put read-only data in SECTION
+
+mbss=
+Target RejectNegative Joined Var(arm_bss_string) Init(ARM_DEFAULT_BSS_SECTION_NAME)
+-mbss=SECTION Put zeroed data in SECTION
+
 mneon-for-64bits
 Target WarnRemoved
 This option is deprecated and has no effect.
diff -rupN gcc/gcc/config.host gcc.patched/gcc/config.host
--- gcc/gcc/config.host	2021-11-01 18:01:54.412697714 +0000
+++ gcc.patched/gcc/config.host	2021-11-01 18:02:25.953113717 +0000
@@ -251,7 +251,7 @@ case ${host} in
     host_extra_gcc_objs="${host_extra_gcc_objs} driver-mingw32.o"
     host_lto_plugin_soname=liblto_plugin-0.dll
     ;;
-  i[34567]86-*-darwin* | x86_64-*-darwin*)
+  i[34567]86-*-darwin* | x86_64-*-darwin* | arm-*-darwin*)
     out_host_hook_obj="${out_host_hook_obj} host-i386-darwin.o"
     host_xmake_file="${host_xmake_file} i386/x-darwin"
     ;;
diff -rupN gcc/gcc/dwarf2out.c gcc.patched/gcc/dwarf2out.c
--- gcc/gcc/dwarf2out.c	2021-11-01 18:01:47.868611384 +0000
+++ gcc.patched/gcc/dwarf2out.c	2021-11-01 18:02:25.965113875 +0000
@@ -27891,7 +27891,7 @@ dwarf2out_source_line (unsigned int line
   dw_line_info_table *table;
   static var_loc_view lvugid;
 
-  if (debug_info_level < DINFO_LEVEL_TERSE)
+  if (debug_info_level < DINFO_LEVEL_NORMAL)
     return;
 
   table = cur_line_info_table;
@@ -31511,7 +31511,7 @@ dwarf2out_finish (const char *filename)
   if (XCOFF_DEBUGGING_INFO)
     strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
 
-  if (debug_info_level >= DINFO_LEVEL_TERSE)
+  if (debug_info_level >= DINFO_LEVEL_NORMAL)
     add_AT_lineptr (main_comp_unit_die, DW_AT_stmt_list,
 		    dl_section_ref);
 
