From: Alon Bar-Lev Date: Wed, 29 Oct 2025 10:54:40 +0000 (+0200) Subject: objcopy: add option to specify custom prefix for symbol of binary input X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6fa97b38ffcf73403a6b231f7199e570f282b773;p=thirdparty%2Fbinutils-gdb.git objcopy: add option to specify custom prefix for symbol of binary input When using --input-target=binary, objcopy currently derives symbol names from a mangled version of the input file name. This approach can lead to unpredictable results, as the generated symbols depend on the file path and working directory. This patch introduces a new option: --binary-symbol-prefix Use as the base symbol name for the input file (default: derived from file name) It allows specifying an explicit symbol prefix, while preserving the existing behavior as a fallback. Signed-off-by: Alon Bar-Lev --- diff --git a/bfd/binary.c b/bfd/binary.c index eb5f3b1371e..2818566c908 100644 --- a/bfd/binary.c +++ b/bfd/binary.c @@ -41,6 +41,8 @@ a start symbol, an end symbol, and an absolute length symbol. */ #define BIN_SYMS 3 +char *bfd_binary_symbol_prefix = NULL; + /* Create a binary object. Invoked via bfd_set_format. */ static bool @@ -122,18 +124,25 @@ static char * mangle_name (bfd *abfd, char *suffix) { bfd_size_type size; + const char *prefix; + const char *prefix_amend = ""; char *buf; char *p; - size = (strlen (bfd_get_filename (abfd)) - + strlen (suffix) - + sizeof "_binary__"); + prefix = bfd_binary_symbol_prefix; + if (prefix == NULL) + { + prefix = "_binary_"; + prefix_amend = bfd_get_filename (abfd); + } + + size = strlen (prefix) + strlen (prefix_amend) + strlen (suffix) + 2; buf = (char *) bfd_alloc (abfd, size); if (buf == NULL) return ""; - sprintf (buf, "_binary_%s_%s", bfd_get_filename (abfd), suffix); + sprintf (buf, "%s%s_%s", prefix, prefix_amend, suffix); /* Change any non-alphanumeric characters to underscores. */ for (p = buf; *p; p++) diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 89425b8a15b..c0a09a373f9 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1315,6 +1315,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}] [@option{--keep-global-symbols=}@var{filename}] [@option{--localize-symbols=}@var{filename}] [@option{--weaken-symbols=}@var{filename}] + [@option{--binary-symbol-prefix}@var{string}] [@option{--add-symbol} @var{name}=[@var{section}:]@var{value}[,@var{flags}]] [@option{--alt-machine-code=}@var{index}] [@option{--prefix-symbols=}@var{string}] @@ -1554,6 +1555,20 @@ given more than once. Note - unique symbols are not converted. @itemx --weaken-symbol=@var{symbolname} Make symbol @var{symbolname} weak. This option may be given more than once. +@item --binary-symbol-prefix=@var{string} +When used with @option{--input-target=binary}, sets @var{string} as the +base name for the symbols generated for the input file. These symbols are: + +@example +@var{string}_start +@var{string}_end +@var{string}_size +@end example + +By default, the binary input handler derives the prefix symbol name from a +mangled version of the input file name and _binary prefix. This option +allows specifying it explicitly. + @item --globalize-symbol=@var{symbolname} Give symbol @var{symbolname} global scoping so that it is visible outside of the file in which it is defined. This option may be given diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 9373b75d6ed..4e1db46faaa 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -334,6 +334,7 @@ enum command_line_switch OPTION_HEAP, OPTION_IMAGE_BASE, OPTION_IMPURE, + OPTION_BINARY_SYMBOL_PREFIX, OPTION_INTERLEAVE_WIDTH, OPTION_KEEPGLOBAL_SYMBOLS, OPTION_KEEP_FILE_SYMBOLS, @@ -465,6 +466,7 @@ static struct option copy_options[] = {"info", no_argument, 0, OPTION_FORMATS_INFO}, {"input-format", required_argument, 0, 'I'}, /* Obsolete */ {"input-target", required_argument, 0, 'I'}, + {"binary-symbol-prefix", required_argument, 0, OPTION_BINARY_SYMBOL_PREFIX}, {"interleave", optional_argument, 0, 'i'}, {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH}, {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS}, @@ -540,6 +542,11 @@ extern char *program_name; extern int is_strip; #endif +/* The symbol prefix of a binary input blob. + *

_start,

_end,

_size + */ +extern char *bfd_binary_symbol_prefix; + /* The maximum length of an S record. This variable is defined in srec.c and can be modified by the --srec-len parameter. */ extern unsigned int _bfd_srec_len; @@ -678,6 +685,9 @@ copy_usage (FILE *stream, int exit_status) --globalize-symbols --globalize-symbol for all in \n\ --keep-global-symbols -G for all symbols listed in \n\ --weaken-symbols -W for all symbols listed in \n\ + --binary-symbol-prefix \n\ + Use as the base symbol name for the input file\n\ + (default: derived from file name)\n\ --add-symbol =[

:][,] Add a symbol\n\ --alt-machine-code Use the target's 'th alternative machine\n\ --writable-text Mark the output text as writable\n\ @@ -5395,6 +5405,10 @@ copy_main (int argc, char *argv[]) input_target = optarg; break; + case OPTION_BINARY_SYMBOL_PREFIX: + bfd_binary_symbol_prefix = optarg; + break; + case 'O': case 'd': /* "destination" - 'O' is preferred */ output_target = optarg; diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index b11b17e012c..fe915187f0e 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -1602,3 +1602,40 @@ proc objcopy_tek2bin {} { } objcopy_tek2bin + +# Test objcopy -I binary and --binary-symbol-prefix + +proc binary_symbol {name file args symbol} { + global OBJCOPY + global NM + global NMFLAGS + + set test "binary symbol ($name)" + + # detect a valid target, take the first supported + set target [lindex [split [binutils_run $OBJCOPY "--info"] \n] 1] + + set out tmpdir/binary_symbol.o + set got [binutils_run $OBJCOPY "-I binary -O $target $args $file $out"] + + set expected [list "${symbol}_end" "${symbol}_size" "${symbol}_start"] + + set exec_output [binutils_run $NM "-a $NMFLAGS $out"] + set exec_output [prune_warnings $exec_output] + set actual {} + while {[regexp {^[0-9a-fA-F]+?[ ]+[TtDdA] ([0-9a-zA-Z_]+)[\r\n]+(.*)$} ${exec_output} all s rest]} { + set actual [concat $actual $s] + set exec_output $rest + } + + if {[lsort $expected] ne [lsort $actual]} { + send_log "expected: $expected, actual: $actual\n" + fail $test + return + } + + pass $test +} + +binary_symbol implicit $srcdir/$subdir/version.s "" _binary_[regsub -all {[^0-9a-zA-Z]} $srcdir/$subdir/version.s _] +binary_symbol explicit $srcdir/$subdir/version.s "--binary-symbol-prefix symbol1" symbol1