aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2023-06-26 17:11:31 +0200
committerMichael Matz <matz@suse.de>2023-06-28 18:08:54 +0200
commitedc1244e9b864daf7b3905fdcbe15407b6aa79e4 (patch)
tree788c34ef6780bafa1b8c0e4d64d2f5dee1439540
parent6e27b5eb0072902173305d0ce41c33b82f5b2bb3 (diff)
downloadbinutils-edc1244e9b864daf7b3905fdcbe15407b6aa79e4.zip
binutils-edc1244e9b864daf7b3905fdcbe15407b6aa79e4.tar.gz
binutils-edc1244e9b864daf7b3905fdcbe15407b6aa79e4.tar.bz2
section-match: Check parent archive name as well
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.
-rw-r--r--ld/ldlang.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 78716f1..e359a89 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -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;
}