+
+#define WARN_UPPER 0
+#define WARN_LOWER 1
+#define WARN_TEXT 0
+#define WARN_DATA 1
+#define WARN_BSS 2
+#define WARN_RODATA 3
+
+/* Warn only once per output section.
+ * NAME starts with ".upper." or ".lower.". */
+static void
+warn_no_output_section (const char *name)
+{
+ static bfd_boolean warned[2][4] = {{FALSE, FALSE, FALSE, FALSE},
+ {FALSE, FALSE, FALSE, FALSE}};
+ int i = WARN_LOWER;
+
+ if (strncmp (name, ".upper.", 7) == 0)
+ i = WARN_UPPER;
+
+ if (!warned[i][WARN_TEXT] && strcmp (name + 6, ".text") == 0)
+ warned[i][WARN_TEXT] = TRUE;
+ else if (!warned[i][WARN_DATA] && strcmp (name + 6, ".data") == 0)
+ warned[i][WARN_DATA] = TRUE;
+ else if (!warned[i][WARN_BSS] && strcmp (name + 6, ".bss") == 0)
+ warned[i][WARN_BSS] = TRUE;
+ else if (!warned[i][WARN_RODATA] && strcmp (name + 6, ".rodata") == 0)
+ warned[i][WARN_RODATA] = TRUE;
+ else
+ return;
+ einfo ("%P: warning: no input section rule matches %s in linker script\n",
+ name);
+}
+
+