+2016-07-14 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * objcopy.c (find_section_list): Handle section patterns starting
+ with '!' being a non-matching pattern.
+ * doc/binutils.texi (objcopy): Give example of using '!' with
+ --remove-section and --only-section.
+ (strip): Give example of using '!' with --remove-section.
+ * testsuite/binutils-all/data-sections.s: New file.
+ * testsuite/binutils-all/only-section-01.d: New file.
+ * testsuite/binutils-all/remove-section-01.d: New file.
+ * testsuite/binutils-all/objcopy.exp: Run new tests.
+ * NEWS: Mention new feature.
+
2016-07-09 Alan Modra <amodra@gmail.com>
PR binutils/20337
-*- text -*-
+* The --remove-section option for objcopy and strip now accepts section
+ patterns starting with an exclamation point to indicate a non-matching
+ section. A non-matching section is removed from the set of sections
+ matched by an earlier --remove-section pattern.
+
+* The --only-section option for objcopy now accepts section patterns
+ starting with an exclamation point to indicate a non-matching section.
+ A non-matching section is removed from the set of sections matched by
+ an earlier --only-section pattern.
+
Changes in 2.27:
* Add a configure option, --enable-64-bit-archive, to force use of a
inappropriately may make the output file unusable. Wildcard
characters are accepted in @var{sectionpattern}.
+If the first character of @var{sectionpattern} is the exclamation
+point (!) then matching sections will not be copied, even if earlier
+use of @option{--only-section} on the same command line would
+otherwise copy it. For example:
+
+@smallexample
+ --only-section=.text.* --only-section=!.text.foo
+@end smallexample
+
+will copy all sectinos maching '.text.*' but not the section
+'.text.foo'.
+
@item -R @var{sectionpattern}
@itemx --remove-section=@var{sectionpattern}
Remove any section matching @var{sectionpattern} from the output file.
@option{-j} and @option{-R} options together results in undefined
behaviour.
+If the first character of @var{sectionpattern} is the exclamation
+point (!) then matching sections will not be removed even if an
+earlier use of @option{--remove-section} on the same command line
+would otherwise remove it. For example:
+
+@smallexample
+ --remove-section=.text.* --remove-section=!.text.foo
+@end smallexample
+
+will remove all sections matching the pattern '.text.*', but will not
+remove the section '.text.foo'.
+
@item -S
@itemx --strip-all
Do not copy relocation and symbol information from the source file.
character @samp{*} may be given at the end of @var{sectionname}. If
so, then any section starting with @var{sectionname} will be removed.
+If the first character of @var{sectionpattern} is the exclamation
+point (!) then matching sections will not be removed even if an
+earlier use of @option{--remove-section} on the same command line
+would otherwise remove it. For example:
+
+@smallexample
+ --remove-section=.text.* --remove-section=!.text.foo
+@end smallexample
+
+will remove all sections matching the pattern '.text.*', but will not
+remove the section '.text.foo'.
+
@item -s
@itemx --strip-all
Remove all symbols.
static struct section_list *
find_section_list (const char *name, bfd_boolean add, unsigned int context)
{
- struct section_list *p;
+ struct section_list *p, *match = NULL;
/* assert ((context & ((1 << 7) - 1)) != 0); */
}
/* If we are not adding a new name/pattern then
only check for a match if the context applies. */
- else if ((p->context & context)
- /* We could check for the presence of wildchar characters
- first and choose between calling strcmp and fnmatch,
- but is that really worth it ? */
- && fnmatch (p->pattern, name, 0) == 0)
- {
- p->used = TRUE;
- return p;
- }
+ else if (p->context & context)
+ {
+ /* We could check for the presence of wildchar characters
+ first and choose between calling strcmp and fnmatch,
+ but is that really worth it ? */
+ if (p->pattern [0] == '!')
+ {
+ if (fnmatch (p->pattern + 1, name, 0) == 0)
+ {
+ p->used = TRUE;
+ return NULL;
+ }
+ }
+ else
+ {
+ if (fnmatch (p->pattern, name, 0) == 0)
+ {
+ if (match == NULL)
+ match = p;
+ }
+ }
+ }
}
if (! add)
- return NULL;
+ {
+ if (match != NULL)
+ match->used = TRUE;
+ return match;
+ }
p = (struct section_list *) xmalloc (sizeof (struct section_list));
p->pattern = name;
--- /dev/null
+ .section ".data.aa.01", "aw"
+ .word 0x1
+
+ .section ".data.aa.02", "aw"
+ .word 0x2
+
+ .section ".data.aa.03", "aw"
+ .word 0x3
+
+ .section ".data.bb.01", "aw"
+ .word 0x4
+
+ .section ".data.bb.02", "aw"
+ .word 0x5
+
+ .section ".data.bb.03", "aw"
+ .word 0x6
run_dump_test "exclude-1a"
run_dump_test "exclude-1b"
+
+ run_dump_test "only-section-01"
+ run_dump_test "remove-section-01"
}
run_dump_test "localize-hidden-2"
--- /dev/null
+#PROG: objcopy
+#source: data-sections.s
+#objcopy: --only-section=.data.aa.* --only-section=!.data.aa.02
+#readelf: -WS
+
+#...
+ \[ [0-9]+\] .data.aa.01.*
+ \[ [0-9]+\] .data.aa.03.*
+#...
--- /dev/null
+#PROG: objcopy
+#source: data-sections.s
+#objcopy: --remove-section=.data.aa.* --remove-section=!.data.aa.02
+#readelf: -WS
+
+#...
+ \[ [0-9]+\] \.data\.aa\.02.*
+#...