section-match: Check parent archive name as well
authorMichael Matz <matz@suse.de>
Mon, 26 Jun 2023 15:11:31 +0000 (17:11 +0200)
committerMichael Matz <matz@suse.de>
Wed, 28 Jun 2023 16:08:54 +0000 (18:08 +0200)
rewriting the section matching routines lost a special case
of matching: section statements of the form

    NAME(section-glob)

normally match against NAME being an object file, but like in
the exclude list we happened to accept archive names as NAME
(undocumented).  The documented way to specify (all) archive members
is by using e.g.

    lib.a:(section-glob)

(that does work also with the prefix tree matcher).

But I intended to not actually change behaviour with the prefix
tree implementation.  So, let's also implement checking against
archive names with a similar FIXME comment we already have in
walk_wild_file_in_exclude_list.

PR 30590

ld/
* ldlang.c (walk_wild_section_match): Also look at archive
parents for a name match.

ld/ldlang.c

index 78716f17729103a4310207a2db6c236926ce6af4..e359a89fcc06526ac28da7dcc1b5ac95b7f69c2c 100644 (file)
@@ -445,8 +445,19 @@ walk_wild_section_match (lang_wild_statement_type *ptr,
         about unset local_sym_name (in which case lookup_name simply adds
         the input file again).  */
       const char *filename = file->local_sym_name;
-      if (filename == NULL
-         || filename_cmp (filename, file_spec) != 0)
+      lang_input_statement_type *arch_is;
+      if (filename && filename_cmp (filename, file_spec) == 0)
+       ;
+      /* FIXME: see also walk_wild_file_in_exclude_list for why we
+        also check parents BFD (local_sym_)name to match input statements
+        with unadorned archive names.  */
+      else if (file->the_bfd
+              && file->the_bfd->my_archive
+              && (arch_is = bfd_usrdata (file->the_bfd->my_archive))
+              && arch_is->local_sym_name
+              && filename_cmp (arch_is->local_sym_name, file_spec) == 0)
+       ;
+      else
        return;
     }