COFF: avoid modifications over C_FILE filename aux entries.
authorClément Chigot <clement.chigot@atos.net>
Mon, 15 Nov 2021 09:37:36 +0000 (10:37 +0100)
committerAlan Modra <amodra@gmail.com>
Mon, 15 Nov 2021 12:37:11 +0000 (23:07 +1030)
Commit e86fc4a5bc37 ("PR 28447: implement multiple parameters for .file
on XCOFF") introduces C_FILE entries which can store additional
information.
However, some modifications are needed by them but not by the original
C_FILE entries, usually representing the filename.
This patch ensures that filename entries are kept as is, in order to
protect targets not supporting the additional entries.

* coffgen.c (coff_write_symbol): Protect filename entries
(coff_write_symbols): Likewise.
(coff_print_symbol): Likewise.

bfd/coffgen.c

index 40f1ac718e48c74f1a95576a6ed9aa2c8a79f2af..5474f6c24d8d35d513ebb0fe36912aae236d649a 100644 (file)
@@ -1036,7 +1036,10 @@ coff_write_symbol (bfd *abfd,
        {
          BFD_ASSERT (! (native + j + 1)->is_sym);
 
-         if (native->u.syment.n_sclass == C_FILE && j > 0)
+         /* Adjust auxent only if this isn't the filename
+            auxiliary entry.  */
+         if (native->u.syment.n_sclass == C_FILE
+             && (native + j + 1)->u.auxent.x_file.x_ftype)
            coff_write_auxent_fname (abfd, (char *) (native + j + 1)->extrap,
                                     &(native + j + 1)->u.auxent, string_size_p);
 
@@ -1423,6 +1426,11 @@ coff_write_symbols (bfd *abfd)
                  char *str;
                  size_t str_length;
 
+                 /* Add strings from aux entries only if this isn't the
+                    filename auxiliary entry.  */
+                 if (!c_symbol->native[j + 1].u.auxent.x_file.x_ftype)
+                   continue;
+
                  if (c_symbol->native[j + 1].u.auxent.x_file.x_n.x_fname[0] != 0)
                    continue;
 
@@ -2207,7 +2215,7 @@ coff_print_symbol (bfd *abfd,
                  fprintf (file, "File ");
                  /* Add additional information if this isn't the filename
                     auxiliary entry.  */
-                 if (aux)
+                 if (auxp->u.auxent.x_file.x_ftype)
                    fprintf (file, "ftype %d fname \"%s\"",
                             auxp->u.auxent.x_file.x_ftype,
                             (char *) auxp->u.auxent.x_file.x_n.x_n.x_offset);