From 5ce61cd09392030fe6f09955b4563104e48e8fea Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Dec 07 2021 19:11:32 +0000 Subject: import binutils-2.35.2-10.el9 --- diff --git a/SOURCES/binutils-dwarf-5-dir0.patch b/SOURCES/binutils-dwarf-5-dir0.patch index 72c7592..482c5d5 100644 --- a/SOURCES/binutils-dwarf-5-dir0.patch +++ b/SOURCES/binutils-dwarf-5-dir0.patch @@ -178,8 +178,8 @@ diff -rup binutils.orig/gas/testsuite/gas/i386/dwarf5-line-2.d binutils-2.35.2/g + + The File Name Table \(offset 0x.*, lines 3, columns 3\): + Entry Dir MD5 Name -+ 0 1 0x0 \(indirect line string, offset: 0x.*\): master-source-file.c -+ 1 2 0x0 \(indirect line string, offset: 0x.*\): secondary source file ++ 0 1 0x0+ \(indirect line string, offset: 0x.*\): master-source-file.c ++ 1 2 0x0+ \(indirect line string, offset: 0x.*\): secondary source file + 2 3 0x95828e8bc4f7404dbf7526fb7bd0f192 \(indirect line string, offset: 0x.*\): foo.c +#pass + diff --git a/SOURCES/binutils.unicode.patch b/SOURCES/binutils.unicode.patch new file mode 100644 index 0000000..02b1784 --- /dev/null +++ b/SOURCES/binutils.unicode.patch @@ -0,0 +1,2694 @@ +Only in binutils-2.35.2/binutils/: Makefile +diff -rup binutils.orig/binutils/NEWS binutils-2.35.2/binutils/NEWS +--- binutils.orig/binutils/NEWS 2021-08-16 13:07:33.383206365 +0100 ++++ binutils-2.35.2/binutils/NEWS 2021-10-25 12:12:22.311951242 +0100 +@@ -122,6 +122,15 @@ Changes in 2.32: + + Changes in 2.31: + ++* Tools which display names or strings (readelf, strings, nm, objdump) ++ have a new command line option which controls how unicode characters are ++ handled. By default they are treated as normal for the tool. Using ++ --unicode=locale will display them according to the current locale. ++ Using --unicode=hex will display them as hex byte values, whilst ++ --unicode=escape will display them as escape sequences. In addition ++ using --unicode=highlight will display them as unicode escape sequences ++ highlighted in red (if supported by the output device). ++ + * Add support for disassembling netronome Flow Processor (NFP) firmware files. + + * The AArch64 port now supports showing disassembly notes which are emitted +Only in binutils-2.35.2/binutils/: bucomm.o +Only in binutils-2.35.2/binutils/: config.cache +Only in binutils-2.35.2/binutils/: config.h +Only in binutils-2.35.2/binutils/: config.log +Only in binutils-2.35.2/binutils/: config.status +diff -rup binutils.orig/binutils/configure binutils-2.35.2/binutils/configure +--- binutils.orig/binutils/configure 2021-08-16 13:07:33.383206365 +0100 ++++ binutils-2.35.2/binutils/configure 2021-10-25 12:12:24.344944672 +0100 +@@ -1911,7 +1911,7 @@ else + #ifdef __cplusplus + extern "C" + #endif +-char $2 (); ++__attribute__ ((used)) char $2 (); + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +@@ -16118,7 +16118,7 @@ CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_ + compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' + GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' + lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' ++lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' + lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' + objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +Only in binutils-2.35.2/binutils/: configure.backup +Only in binutils-2.35.2/binutils/doc: Makefile +diff -rup binutils.orig/binutils/doc/addr2line.1 binutils-2.35.2/binutils/doc/addr2line.1 +--- binutils.orig/binutils/doc/addr2line.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/addr2line.1 2021-10-25 12:13:31.293728313 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "ADDR2LINE 1" +-.TH ADDR2LINE 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH ADDR2LINE 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/ar.1 binutils-2.35.2/binutils/doc/ar.1 +--- binutils.orig/binutils/doc/ar.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/ar.1 2021-10-25 12:13:31.317728235 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "AR 1" +-.TH AR 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH AR 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/binutils.info binutils-2.35.2/binutils/doc/binutils.info +--- binutils.orig/binutils/doc/binutils.info 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/binutils.info 2021-10-25 12:13:32.884723171 +0100 +@@ -601,6 +601,7 @@ File: binutils.info, Node: nm, Next: o + [-D|--dynamic] [-fFORMAT|--format=FORMAT] + [-g|--extern-only] [-h|--help] + [-l|--line-numbers] [--inlines] ++ [-U METHOD] [--unicode=METHOD] + [-n|-v|--numeric-sort] + [-P|--portability] [-p|--no-sort] + [-r|--reverse-sort] [-S|--print-size] +@@ -867,6 +868,22 @@ equivalent. + Display only undefined symbols (those external to each object + file). + ++'-U [D|I|L|E|X|H]' ++'--unicode=[DEFAULT|INVALID|LOCALE|ESCAPE|HEX|HIGHLIGHT]' ++ Controls the display of UTF-8 encoded mulibyte characters in ++ strings. The default ('--unicode=default') is to give them no ++ special treatment. The '--unicode=locale' option displays the ++ sequence in the current locale, which may or may not support them. ++ The options '--unicode=hex' and '--unicode=invalid' display them as ++ hex byte sequences enclosed by either angle brackets or curly ++ braces. ++ ++ The '--unicode=escape' option displays them as escape sequences ++ (\UXXXX) and the '--unicode=highlight' option displays them as ++ escape sequences highlighted in red (if supported by the output ++ device). The colouring is intended to draw attention to the ++ presence of unicode sequences where they might not be expected. ++ + '-V' + '--version' + Show the version number of 'nm' and exit. +@@ -1890,6 +1907,7 @@ File: binutils.info, Node: objdump, Ne + [--prefix-strip=LEVEL] + [--insn-width=WIDTH] + [--visualize-jumps[=color|=extended-color|=off] ++ [-U METHOD] [--unicode=METHOD] + [-V|--version] + [-H|--help] + OBJFILE... +@@ -2648,6 +2666,22 @@ given. + be special in some way and which would not normally be of interest + to the user. + ++'-U [D|I|L|E|X|H]' ++'--unicode=[DEFAULT|INVALID|LOCALE|ESCAPE|HEX|HIGHLIGHT]' ++ Controls the display of UTF-8 encoded mulibyte characters in ++ strings. The default ('--unicode=default') is to give them no ++ special treatment. The '--unicode=locale' option displays the ++ sequence in the current locale, which may or may not support them. ++ The options '--unicode=hex' and '--unicode=invalid' display them as ++ hex byte sequences enclosed by either angle brackets or curly ++ braces. ++ ++ The '--unicode=escape' option displays them as escape sequences ++ (\UXXXX) and the '--unicode=highlight' option displays them as ++ escape sequences highlighted in red (if supported by the output ++ device). The colouring is intended to draw attention to the ++ presence of unicode sequences where they might not be expected. ++ + '-V' + '--version' + Print the version number of 'objdump' and exit. +@@ -2842,6 +2876,7 @@ File: binutils.info, Node: strings, Ne + [-n MIN-LEN] [--bytes=MIN-LEN] + [-t RADIX] [--radix=RADIX] + [-e ENCODING] [--encoding=ENCODING] ++ [-U METHOD] [--unicode=METHOD] + [-] [--all] [--print-file-name] + [-T BFDNAME] [--target=BFDNAME] + [-w] [--include-all-whitespace] +@@ -2924,6 +2959,27 @@ files. + Useful for finding wide character strings. ('l' and 'b' apply to, + for example, Unicode UTF-16/UCS-2 encodings). + ++'-U [D|I|L|E|X|H]' ++'--unicode=[DEFAULT|INVALID|LOCALE|ESCAPE|HEX|HIGHLIGHT]' ++ Controls the display of UTF-8 encoded mulibyte characters in ++ strings. The default ('--unicode=default') is to give them no ++ special treatment, and instead rely upon the setting of the ++ '--encoding' option. The other values for this option ++ automatically enable '--encoding=S'. ++ ++ The '--unicode=invalid' option treats them as non-graphic ++ characters and hence not part of a valid string. All the remaining ++ options treat them as valid string characters. ++ ++ The '--unicode=locale' option displays them in the current locale, ++ which may or may not support UTF-8 encoding. The '--unicode=hex' ++ option displays them as hex byte sequences enclosed between <> ++ characters. The '--unicode=escape' option displays them as escape ++ sequences (\UXXXX) and the '--unicode=highlight' option displays ++ them as escape sequences highlighted in red (if supported by the ++ output device). The colouring is intended to draw attention to the ++ presence of unicode sequences where they might not be expected. ++ + '-T BFDNAME' + '--target=BFDNAME' + Specify an object code format other than your system's default +@@ -4241,6 +4297,7 @@ File: binutils.info, Node: readelf, Ne + [-W|--wide] + [-T|--silent-truncation] + [-H|--help] ++ [-U METHOD|--unicode=METHOD] + ELFFILE... + + 'readelf' displays information about one or more ELF format object +@@ -4310,6 +4367,28 @@ equivalent. At least one option besides + if it has one. The output format is the same as the format used by + the '--syms' option. + ++'-U [D|I|L|E|X|H]' ++'--unicode=[default|invalid|locale|escape|hex|highlight]' ++ Controls the display of non-ASCII characters in identifier names. ++ The default ('--unicode=locale' or '--unicode=default') is to treat ++ them as multibyte characters and display them in the current ++ locale. All other versions of this option treat the bytes as UTF-8 ++ encoded values and attempt to interpret them. If they cannot be ++ interpreted or if the '--unicode=invalid' option is used then they ++ are displayed as a sequence of hex bytes, encloses in curly ++ parethesis characters. ++ ++ Using the '--unicode=escape' option will display the characters as ++ as unicode escape sequences (\UXXXX). Using the '--unicode=hex' ++ will display the characters as hex byte sequences enclosed between ++ angle brackets. ++ ++ Using the '--unicode=highlight' will display the characters as ++ unicode escape sequences but it will also highlighted them in red, ++ assuming that colouring is supported by the output device. The ++ colouring is intended to draw attention to the presence of unicode ++ sequences when they might not be expected. ++ + '-e' + '--headers' + Display all the headers in the file. Equivalent to '-h -l -S'. +@@ -5549,18 +5628,18 @@ Binutils Index + * -enable-deterministic-archives <5>: ranlib. (line 44) + * -enable-deterministic-archives <6>: strip. (line 155) + * -enable-deterministic-archives <7>: strip. (line 165) +-* .stab: objdump. (line 696) +-* Add prefix to absolute paths: objdump. (line 505) ++* .stab: objdump. (line 697) ++* Add prefix to absolute paths: objdump. (line 506) + * addr2line: addr2line. (line 6) + * address to file name and line number: addr2line. (line 6) +-* all header information, object file: objdump. (line 818) ++* all header information, object file: objdump. (line 835) + * ar: ar. (line 6) + * ar compatibility: ar. (line 60) +-* architecture: objdump. (line 257) +-* architectures available: objdump. (line 242) ++* architecture: objdump. (line 258) ++* architectures available: objdump. (line 243) + * archive contents: ranlib. (line 6) +-* Archive file symbol index information: readelf. (line 194) +-* archive headers: objdump. (line 75) ++* Archive file symbol index information: readelf. (line 217) ++* archive headers: objdump. (line 76) + * archives: ar. (line 6) + * base files: dlltool. (line 124) + * bug criteria: Bug Criteria. (line 6) +@@ -5574,23 +5653,23 @@ Binutils Index + * changing section VMA: objcopy. (line 434) + * changing start address: objcopy. (line 396) + * collections of files: ar. (line 6) +-* Compact Type Format: objdump. (line 682) +-* Compact Type Format <1>: readelf. (line 342) ++* Compact Type Format: objdump. (line 683) ++* Compact Type Format <1>: readelf. (line 365) + * compatibility, ar: ar. (line 60) + * contents of archive: ar cmdline. (line 97) + * crash: Bug Criteria. (line 9) + * creating archives: ar cmdline. (line 144) + * creating thin archive: ar cmdline. (line 219) +-* CTF: objdump. (line 682) +-* CTF <1>: readelf. (line 342) ++* CTF: objdump. (line 683) ++* CTF <1>: readelf. (line 365) + * cxxfilt: c++filt. (line 16) + * dates in archive: ar cmdline. (line 183) +-* debug symbols: objdump. (line 696) +-* debugging symbols: nm. (line 160) ++* debug symbols: objdump. (line 697) ++* debugging symbols: nm. (line 161) + * deleting from archive: ar cmdline. (line 26) + * demangling C++ symbols: c++filt. (line 6) +-* demangling in nm: nm. (line 168) +-* demangling in objdump: objdump. (line 103) ++* demangling in nm: nm. (line 169) ++* demangling in objdump: objdump. (line 104) + * demangling in objdump <1>: addr2line. (line 86) + * deterministic archives: ar cmdline. (line 150) + * deterministic archives <1>: ar cmdline. (line 233) +@@ -5600,73 +5679,73 @@ Binutils Index + * deterministic archives <5>: ranlib. (line 44) + * deterministic archives <6>: strip. (line 155) + * deterministic archives <7>: strip. (line 165) +-* disassembling object code: objdump. (line 144) +-* disassembly architecture: objdump. (line 257) +-* disassembly endianness: objdump. (line 192) +-* disassembly, with source: objdump. (line 494) +-* disassembly, with source <1>: objdump. (line 498) ++* disassembling object code: objdump. (line 145) ++* disassembly architecture: objdump. (line 258) ++* disassembly endianness: objdump. (line 193) ++* disassembly, with source: objdump. (line 495) ++* disassembly, with source <1>: objdump. (line 499) + * discarding symbols: strip. (line 6) + * DLL: dlltool. (line 6) + * dlltool: dlltool. (line 6) +-* dynamic relocation entries, in object file: objdump. (line 482) +-* dynamic symbol table entries, printing: objdump. (line 795) +-* dynamic symbols: nm. (line 198) +-* ELF dynamic section information: readelf. (line 134) +-* ELF dynamic symbol table information: readelf. (line 106) +-* ELF file header information: readelf. (line 69) ++* dynamic relocation entries, in object file: objdump. (line 483) ++* dynamic symbol table entries, printing: objdump. (line 796) ++* dynamic symbols: nm. (line 199) ++* ELF dynamic section information: readelf. (line 157) ++* ELF dynamic symbol table information: readelf. (line 107) ++* ELF file header information: readelf. (line 70) + * ELF file information: readelf. (line 6) +-* ELF notes: readelf. (line 116) +-* ELF object file format: objdump. (line 696) +-* ELF program header information: readelf. (line 75) +-* ELF reloc information: readelf. (line 120) +-* ELF section group information: readelf. (line 86) +-* ELF section information: readelf. (line 81) +-* ELF section information <1>: readelf. (line 91) +-* ELF segment information: readelf. (line 75) +-* ELF symbol table information: readelf. (line 96) +-* ELF version sections information: readelf. (line 138) ++* ELF notes: readelf. (line 139) ++* ELF object file format: objdump. (line 697) ++* ELF program header information: readelf. (line 76) ++* ELF reloc information: readelf. (line 143) ++* ELF section group information: readelf. (line 87) ++* ELF section information: readelf. (line 82) ++* ELF section information <1>: readelf. (line 92) ++* ELF segment information: readelf. (line 76) ++* ELF symbol table information: readelf. (line 97) ++* ELF version sections information: readelf. (line 161) + * elfedit: elfedit. (line 6) +-* endianness: objdump. (line 192) ++* endianness: objdump. (line 193) + * error on valid input: Bug Criteria. (line 12) +-* external symbols: nm. (line 210) +-* external symbols <1>: nm. (line 274) +-* external symbols <2>: nm. (line 288) ++* external symbols: nm. (line 211) ++* external symbols <1>: nm. (line 275) ++* external symbols <2>: nm. (line 305) + * extract from archive: ar cmdline. (line 114) + * fatal signal: Bug Criteria. (line 9) +-* file name: nm. (line 154) +-* header information, all: objdump. (line 818) ++* file name: nm. (line 155) ++* header information, all: objdump. (line 835) + * input .def file: dlltool. (line 120) +-* input file name: nm. (line 154) +-* Instruction width: objdump. (line 522) ++* input file name: nm. (line 155) ++* Instruction width: objdump. (line 523) + * libraries: ar. (line 25) + * listings strings: strings. (line 6) +-* machine instructions: objdump. (line 144) ++* machine instructions: objdump. (line 145) + * moving in archive: ar cmdline. (line 34) + * MRI compatibility, ar: ar scripts. (line 8) + * name duplication in archive: ar cmdline. (line 108) + * name length: ar. (line 18) + * nm: nm. (line 6) +-* nm compatibility: nm. (line 164) +-* nm compatibility <1>: nm. (line 204) +-* nm format: nm. (line 164) +-* nm format <1>: nm. (line 204) ++* nm compatibility: nm. (line 165) ++* nm compatibility <1>: nm. (line 205) ++* nm format: nm. (line 165) ++* nm format <1>: nm. (line 205) + * not writing archive index: ar cmdline. (line 212) + * objdump: objdump. (line 6) +-* objdump inlines: nm. (line 226) +-* object code format: nm. (line 332) +-* object code format <1>: objdump. (line 89) ++* objdump inlines: nm. (line 227) ++* object code format: nm. (line 349) ++* object code format <1>: objdump. (line 90) + * object code format <2>: size. (line 103) +-* object code format <3>: strings. (line 94) ++* object code format <3>: strings. (line 116) + * object code format <4>: addr2line. (line 81) +-* object file header: objdump. (line 198) ++* object file header: objdump. (line 199) + * object file information: objdump. (line 6) +-* object file offsets: objdump. (line 203) +-* object file sections: objdump. (line 489) +-* object formats available: objdump. (line 242) ++* object file offsets: objdump. (line 204) ++* object file sections: objdump. (line 490) ++* object formats available: objdump. (line 243) + * offsets of files: ar cmdline. (line 188) + * operations on archive: ar cmdline. (line 22) + * plugins: ar cmdline. (line 267) +-* plugins <1>: nm. (line 291) ++* plugins <1>: nm. (line 308) + * printing from archive: ar cmdline. (line 46) + * printing strings: strings. (line 6) + * quick append to archive: ar cmdline. (line 54) +@@ -5675,51 +5754,51 @@ Binutils Index + * ranlib <1>: ar cmdline. (line 91) + * readelf: readelf. (line 6) + * relative placement in archive: ar cmdline. (line 132) +-* relocation entries, in object file: objdump. (line 476) ++* relocation entries, in object file: objdump. (line 477) + * removing symbols: strip. (line 6) + * repeated names in archive: ar cmdline. (line 108) + * replacement in archive: ar cmdline. (line 73) + * reporting bugs: Reporting Bugs. (line 6) + * scripts, ar: ar scripts. (line 8) +-* section addresses in objdump: objdump. (line 81) +-* section headers: objdump. (line 219) +-* section information: objdump. (line 247) ++* section addresses in objdump: objdump. (line 82) ++* section headers: objdump. (line 220) ++* section information: objdump. (line 248) + * section sizes: size. (line 6) +-* sections, full contents: objdump. (line 489) ++* sections, full contents: objdump. (line 490) + * separate debug files: debuginfod. (line 6) + * size: size. (line 6) + * size display format: size. (line 28) + * size number format: size. (line 85) +-* sorting symbols: nm. (line 241) +-* source code context: objdump. (line 212) +-* source disassembly: objdump. (line 494) +-* source disassembly <1>: objdump. (line 498) +-* source file name: nm. (line 154) +-* source filenames for object files: objdump. (line 251) +-* stab: objdump. (line 696) +-* start-address: objdump. (line 705) +-* stop-address: objdump. (line 709) ++* sorting symbols: nm. (line 242) ++* source code context: objdump. (line 213) ++* source disassembly: objdump. (line 495) ++* source disassembly <1>: objdump. (line 499) ++* source file name: nm. (line 155) ++* source filenames for object files: objdump. (line 252) ++* stab: objdump. (line 697) ++* start-address: objdump. (line 706) ++* stop-address: objdump. (line 710) + * strings: strings. (line 6) + * strings, printing: strings. (line 6) + * strip: strip. (line 6) +-* Strip absolute paths: objdump. (line 508) ++* Strip absolute paths: objdump. (line 509) + * symbol index: ar. (line 28) + * symbol index <1>: ranlib. (line 6) +-* symbol index, listing: nm. (line 263) +-* symbol line numbers: nm. (line 218) +-* symbol table entries, printing: objdump. (line 714) ++* symbol index, listing: nm. (line 264) ++* symbol line numbers: nm. (line 219) ++* symbol table entries, printing: objdump. (line 715) + * symbols: nm. (line 6) + * symbols, discarding: strip. (line 6) + * thin archives: ar. (line 40) +-* undefined symbols: nm. (line 274) +-* undefined symbols <1>: nm. (line 288) ++* undefined symbols: nm. (line 275) ++* undefined symbols <1>: nm. (line 305) + * Unix compatibility, ar: ar cmdline. (line 8) +-* unwind information: readelf. (line 125) ++* unwind information: readelf. (line 148) + * Update ELF header: elfedit. (line 6) + * updating an archive: ar cmdline. (line 224) + * version: Top. (line 6) +-* VMA in objdump: objdump. (line 81) +-* wide output, printing: objdump. (line 824) ++* VMA in objdump: objdump. (line 82) ++* wide output, printing: objdump. (line 841) + * writing archive index: ar cmdline. (line 206) + + +@@ -5730,31 +5809,31 @@ Node: ar3553 + Node: ar cmdline6706 + Node: ar scripts19332 + Node: nm25018 +-Node: objcopy37699 +-Node: objdump78192 +-Node: ranlib111217 +-Node: size112816 +-Node: strings116785 +-Node: strip121157 +-Node: c++filt130682 +-Ref: c++filt-Footnote-1136544 +-Node: addr2line136650 +-Node: windmc142329 +-Node: windres145988 +-Node: dlltool152347 +-Node: def file format165344 +-Node: readelf167874 +-Node: elfedit181388 +-Node: Common Options184344 +-Node: Selecting the Target System185378 +-Node: Target Selection186306 +-Node: Architecture Selection188287 +-Node: debuginfod189115 +-Node: Reporting Bugs189874 +-Node: Bug Criteria190636 +-Node: Bug Reporting191189 +-Node: GNU Free Documentation License198059 +-Node: Binutils Index223219 ++Node: objcopy38585 ++Node: objdump79078 ++Node: ranlib112994 ++Node: size114593 ++Node: strings118562 ++Node: strip124112 ++Node: c++filt133637 ++Ref: c++filt-Footnote-1139499 ++Node: addr2line139605 ++Node: windmc145284 ++Node: windres148943 ++Node: dlltool155302 ++Node: def file format168299 ++Node: readelf170829 ++Node: elfedit185547 ++Node: Common Options188503 ++Node: Selecting the Target System189537 ++Node: Target Selection190465 ++Node: Architecture Selection192446 ++Node: debuginfod193274 ++Node: Reporting Bugs194033 ++Node: Bug Criteria194795 ++Node: Bug Reporting195348 ++Node: GNU Free Documentation License202218 ++Node: Binutils Index227378 +  + End Tag Table + +diff -rup binutils.orig/binutils/doc/binutils.texi binutils-2.35.2/binutils/doc/binutils.texi +--- binutils.orig/binutils/doc/binutils.texi 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/binutils.texi 2021-10-25 12:12:22.312951239 +0100 +@@ -787,6 +787,7 @@ nm [@option{-A}|@option{-o}|@option{--pr + [@option{-D}|@option{--dynamic}] [@option{-f}@var{format}|@option{--format=}@var{format}] + [@option{-g}|@option{--extern-only}] [@option{-h}|@option{--help}] + [@option{-l}|@option{--line-numbers}] [@option{--inlines}] ++ [@option{-U} @var{method}] [@option{--unicode=}@var{method}] + [@option{-n}|@option{-v}|@option{--numeric-sort}] + [@option{-P}|@option{--portability}] [@option{-p}|@option{--no-sort}] + [@option{-r}|@option{--reverse-sort}] [@option{-S}|@option{--print-size}] +@@ -1081,6 +1082,21 @@ Use @var{radix} as the radix for printin + @cindex undefined symbols + Display only undefined symbols (those external to each object file). + ++@item -U @var{[d|i|l|e|x|h]} ++@itemx --unicode=@var{[default|invalid|locale|escape|hex|highlight]} ++Controls the display of UTF-8 encoded mulibyte characters in strings. ++The default (@option{--unicode=default}) is to give them no special ++treatment. The @option{--unicode=locale} option displays the sequence ++in the current locale, which may or may not support them. The options ++@option{--unicode=hex} and @option{--unicode=invalid} display them as ++hex byte sequences enclosed by either angle brackets or curly braces. ++ ++The @option{--unicode=escape} option displays them as escape sequences ++(@var{\uxxxx}) and the @option{--unicode=highlight} option displays ++them as escape sequences highlighted in red (if supported by the ++output device). The colouring is intended to draw attention to the ++presence of unicode sequences where they might not be expected. ++ + @item -V + @itemx --version + Show the version number of @command{nm} and exit. +@@ -2174,6 +2190,7 @@ objdump [@option{-a}|@option{--archive-h + [@option{--prefix-strip=}@var{level}] + [@option{--insn-width=}@var{width}] + [@option{--visualize-jumps[=color|=extended-color|=off]} ++ [@option{-U} @var{method}] [@option{--unicode=}@var{method}] + [@option{-V}|@option{--version}] + [@option{-H}|@option{--help}] + @var{objfile}@dots{} +@@ -2841,6 +2858,21 @@ When displaying symbols include those wh + special in some way and which would not normally be of interest to the + user. + ++@item -U @var{[d|i|l|e|x|h]} ++@itemx --unicode=@var{[default|invalid|locale|escape|hex|highlight]} ++Controls the display of UTF-8 encoded mulibyte characters in strings. ++The default (@option{--unicode=default}) is to give them no special ++treatment. The @option{--unicode=locale} option displays the sequence ++in the current locale, which may or may not support them. The options ++@option{--unicode=hex} and @option{--unicode=invalid} display them as ++hex byte sequences enclosed by either angle brackets or curly braces. ++ ++The @option{--unicode=escape} option displays them as escape sequences ++(@var{\uxxxx}) and the @option{--unicode=highlight} option displays ++them as escape sequences highlighted in red (if supported by the ++output device). The colouring is intended to draw attention to the ++presence of unicode sequences where they might not be expected. ++ + @item -V + @itemx --version + Print the version number of @command{objdump} and exit. +@@ -3117,6 +3149,7 @@ strings [@option{-afovV}] [@option{-}@va + [@option{-n} @var{min-len}] [@option{--bytes=}@var{min-len}] + [@option{-t} @var{radix}] [@option{--radix=}@var{radix}] + [@option{-e} @var{encoding}] [@option{--encoding=}@var{encoding}] ++ [@option{-U} @var{method}] [@option{--unicode=}@var{method}] + [@option{-}] [@option{--all}] [@option{--print-file-name}] + [@option{-T} @var{bfdname}] [@option{--target=}@var{bfdname}] + [@option{-w}] [@option{--include-all-whitespace}] +@@ -3208,6 +3241,28 @@ single-8-bit-byte characters, @samp{b} = + littleendian. Useful for finding wide character strings. (@samp{l} + and @samp{b} apply to, for example, Unicode UTF-16/UCS-2 encodings). + ++@item -U @var{[d|i|l|e|x|h]} ++@itemx --unicode=@var{[default|invalid|locale|escape|hex|highlight]} ++Controls the display of UTF-8 encoded mulibyte characters in strings. ++The default (@option{--unicode=default}) is to give them no special ++treatment, and instead rely upon the setting of the ++@option{--encoding} option. The other values for this option ++automatically enable @option{--encoding=S}. ++ ++The @option{--unicode=invalid} option treats them as non-graphic ++characters and hence not part of a valid string. All the remaining ++options treat them as valid string characters. ++ ++The @option{--unicode=locale} option displays them in the current ++locale, which may or may not support UTF-8 encoding. The ++@option{--unicode=hex} option displays them as hex byte sequences ++enclosed between @var{<>} characters. The @option{--unicode=escape} ++option displays them as escape sequences (@var{\uxxxx}) and the ++@option{--unicode=highlight} option displays them as escape sequences ++highlighted in red (if supported by the output device). The colouring ++is intended to draw attention to the presence of unicode sequences ++where they might not be expected. ++ + @item -T @var{bfdname} + @itemx --target=@var{bfdname} + @cindex object code format +@@ -4726,6 +4781,7 @@ readelf [@option{-a}|@option{--all}] + [@option{-W}|@option{--wide}] + [@option{-T}|@option{--silent-truncation}] + [@option{-H}|@option{--help}] ++ [@option{-U} @var{method}|@option{--unicode=}@var{method}] + @var{elffile}@dots{} + @c man end + @end smallexample +@@ -4815,6 +4871,28 @@ Displays the entries in dynamic symbol t + has one. The output format is the same as the format used by the + @option{--syms} option. + ++@item -U @var{[d|i|l|e|x|h]} ++@itemx --unicode=[default|invalid|locale|escape|hex|highlight] ++Controls the display of non-ASCII characters in identifier names. ++The default (@option{--unicode=locale} or @option{--unicode=default}) is ++to treat them as multibyte characters and display them in the current ++locale. All other versions of this option treat the bytes as UTF-8 ++encoded values and attempt to interpret them. If they cannot be ++interpreted or if the @option{--unicode=invalid} option is used then ++they are displayed as a sequence of hex bytes, encloses in curly ++parethesis characters. ++ ++Using the @option{--unicode=escape} option will display the characters ++as as unicode escape sequences (@var{\uxxxx}). Using the ++@option{--unicode=hex} will display the characters as hex byte ++sequences enclosed between angle brackets. ++ ++Using the @option{--unicode=highlight} will display the characters as ++unicode escape sequences but it will also highlighted them in red, ++assuming that colouring is supported by the output device. The ++colouring is intended to draw attention to the presence of unicode ++sequences when they might not be expected. ++ + @item -e + @itemx --headers + Display all the headers in the file. Equivalent to @option{-h -l -S}. +diff -rup binutils.orig/binutils/doc/c++filt.1 binutils-2.35.2/binutils/doc/c++filt.1 +--- binutils.orig/binutils/doc/c++filt.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/c++filt.1 2021-10-25 12:13:31.698727004 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "C++FILT 1" +-.TH C++FILT 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH C++FILT 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/cxxfilt.man binutils-2.35.2/binutils/doc/cxxfilt.man +--- binutils.orig/binutils/doc/cxxfilt.man 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/cxxfilt.man 2021-10-25 12:13:31.495727660 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "C++FILT 1" +-.TH C++FILT 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH C++FILT 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/dlltool.1 binutils-2.35.2/binutils/doc/dlltool.1 +--- binutils.orig/binutils/doc/dlltool.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/dlltool.1 2021-10-25 12:13:31.308728264 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "DLLTOOL 1" +-.TH DLLTOOL 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH DLLTOOL 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/elfedit.1 binutils-2.35.2/binutils/doc/elfedit.1 +--- binutils.orig/binutils/doc/elfedit.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/elfedit.1 2021-10-25 12:13:31.427727880 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "ELFEDIT 1" +-.TH ELFEDIT 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH ELFEDIT 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/nm.1 binutils-2.35.2/binutils/doc/nm.1 +--- binutils.orig/binutils/doc/nm.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/nm.1 2021-10-25 12:13:31.322728219 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "NM 1" +-.TH NM 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH NM 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +@@ -147,6 +147,7 @@ nm [\fB\-A\fR|\fB\-o\fR|\fB\-\-print\-fi + [\fB\-D\fR|\fB\-\-dynamic\fR] [\fB\-f\fR\fIformat\fR|\fB\-\-format=\fR\fIformat\fR] + [\fB\-g\fR|\fB\-\-extern\-only\fR] [\fB\-h\fR|\fB\-\-help\fR] + [\fB\-l\fR|\fB\-\-line\-numbers\fR] [\fB\-\-inlines\fR] ++ [\fB\-U\fR \fImethod\fR] [\fB\-\-unicode=\fR\fImethod\fR] + [\fB\-n\fR|\fB\-v\fR|\fB\-\-numeric\-sort\fR] + [\fB\-P\fR|\fB\-\-portability\fR] [\fB\-p\fR|\fB\-\-no\-sort\fR] + [\fB\-r\fR|\fB\-\-reverse\-sort\fR] [\fB\-S\fR|\fB\-\-print\-size\fR] +@@ -514,6 +515,24 @@ Use \fIradix\fR as the radix for printin + .IX Item "--undefined-only" + .PD + Display only undefined symbols (those external to each object file). ++.IP "\fB\-U\fR \fI[d|i|l|e|x|h]\fR" 4 ++.IX Item "-U [d|i|l|e|x|h]" ++.PD 0 ++.IP "\fB\-\-unicode=\fR\fI[default|invalid|locale|escape|hex|highlight]\fR" 4 ++.IX Item "--unicode=[default|invalid|locale|escape|hex|highlight]" ++.PD ++Controls the display of \s-1UTF\-8\s0 encoded mulibyte characters in strings. ++The default (\fB\-\-unicode=default\fR) is to give them no special ++treatment. The \fB\-\-unicode=locale\fR option displays the sequence ++in the current locale, which may or may not support them. The options ++\&\fB\-\-unicode=hex\fR and \fB\-\-unicode=invalid\fR display them as ++hex byte sequences enclosed by either angle brackets or curly braces. ++.Sp ++The \fB\-\-unicode=escape\fR option displays them as escape sequences ++(\fI\euxxxx\fR) and the \fB\-\-unicode=highlight\fR option displays ++them as escape sequences highlighted in red (if supported by the ++output device). The colouring is intended to draw attention to the ++presence of unicode sequences where they might not be expected. + .IP "\fB\-V\fR" 4 + .IX Item "-V" + .PD 0 +diff -rup binutils.orig/binutils/doc/objcopy.1 binutils-2.35.2/binutils/doc/objcopy.1 +--- binutils.orig/binutils/doc/objcopy.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/objcopy.1 2021-10-25 12:13:31.363728087 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "OBJCOPY 1" +-.TH OBJCOPY 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH OBJCOPY 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/objdump.1 binutils-2.35.2/binutils/doc/objdump.1 +--- binutils.orig/binutils/doc/objdump.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/objdump.1 2021-10-25 12:13:31.370728064 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "OBJDUMP 1" +-.TH OBJDUMP 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH OBJDUMP 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +@@ -190,6 +190,7 @@ objdump [\fB\-a\fR|\fB\-\-archive\-heade + [\fB\-\-prefix\-strip=\fR\fIlevel\fR] + [\fB\-\-insn\-width=\fR\fIwidth\fR] + [\fB\-\-visualize\-jumps[=color|=extended\-color|=off]\fR ++ [\fB\-U\fR \fImethod\fR] [\fB\-\-unicode=\fR\fImethod\fR] + [\fB\-V\fR|\fB\-\-version\fR] + [\fB\-H\fR|\fB\-\-help\fR] + \fIobjfile\fR... +@@ -1265,6 +1266,24 @@ otherwise it's put into parentheses. + When displaying symbols include those which the target considers to be + special in some way and which would not normally be of interest to the + user. ++.IP "\fB\-U\fR \fI[d|i|l|e|x|h]\fR" 4 ++.IX Item "-U [d|i|l|e|x|h]" ++.PD 0 ++.IP "\fB\-\-unicode=\fR\fI[default|invalid|locale|escape|hex|highlight]\fR" 4 ++.IX Item "--unicode=[default|invalid|locale|escape|hex|highlight]" ++.PD ++Controls the display of \s-1UTF\-8\s0 encoded mulibyte characters in strings. ++The default (\fB\-\-unicode=default\fR) is to give them no special ++treatment. The \fB\-\-unicode=locale\fR option displays the sequence ++in the current locale, which may or may not support them. The options ++\&\fB\-\-unicode=hex\fR and \fB\-\-unicode=invalid\fR display them as ++hex byte sequences enclosed by either angle brackets or curly braces. ++.Sp ++The \fB\-\-unicode=escape\fR option displays them as escape sequences ++(\fI\euxxxx\fR) and the \fB\-\-unicode=highlight\fR option displays ++them as escape sequences highlighted in red (if supported by the ++output device). The colouring is intended to draw attention to the ++presence of unicode sequences where they might not be expected. + .IP "\fB\-V\fR" 4 + .IX Item "-V" + .PD 0 +diff -rup binutils.orig/binutils/doc/ranlib.1 binutils-2.35.2/binutils/doc/ranlib.1 +--- binutils.orig/binutils/doc/ranlib.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/ranlib.1 2021-10-25 12:13:31.289728326 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "RANLIB 1" +-.TH RANLIB 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH RANLIB 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/readelf.1 binutils-2.35.2/binutils/doc/readelf.1 +--- binutils.orig/binutils/doc/readelf.1 2021-08-16 13:07:33.367206466 +0100 ++++ binutils-2.35.2/binutils/doc/readelf.1 2021-10-25 12:13:31.419727906 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "READELF 1" +-.TH READELF 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH READELF 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +@@ -177,6 +177,7 @@ readelf [\fB\-a\fR|\fB\-\-all\fR] + [\fB\-W\fR|\fB\-\-wide\fR] + [\fB\-T\fR|\fB\-\-silent\-truncation\fR] + [\fB\-H\fR|\fB\-\-help\fR] ++ [\fB\-U\fR \fImethod\fR|\fB\-\-unicode=\fR\fImethod\fR] + \fIelffile\fR... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" +@@ -274,6 +275,31 @@ displayed as a suffix preceeded by two @ + Displays the entries in dynamic symbol table section of the file, if it + has one. The output format is the same as the format used by the + \&\fB\-\-syms\fR option. ++.IP "\fB\-U\fR \fI[d|i|l|e|x|h]\fR" 4 ++.IX Item "-U [d|i|l|e|x|h]" ++.PD 0 ++.IP "\fB\-\-unicode=[default|invalid|locale|escape|hex|highlight]\fR" 4 ++.IX Item "--unicode=[default|invalid|locale|escape|hex|highlight]" ++.PD ++Controls the display of non-ASCII characters in identifier names. ++The default (\fB\-\-unicode=locale\fR or \fB\-\-unicode=default\fR) is ++to treat them as multibyte characters and display them in the current ++locale. All other versions of this option treat the bytes as \s-1UTF\-8\s0 ++encoded values and attempt to interpret them. If they cannot be ++interpreted or if the \fB\-\-unicode=invalid\fR option is used then ++they are displayed as a sequence of hex bytes, encloses in curly ++parethesis characters. ++.Sp ++Using the \fB\-\-unicode=escape\fR option will display the characters ++as as unicode escape sequences (\fI\euxxxx\fR). Using the ++\&\fB\-\-unicode=hex\fR will display the characters as hex byte ++sequences enclosed between angle brackets. ++.Sp ++Using the \fB\-\-unicode=highlight\fR will display the characters as ++unicode escape sequences but it will also highlighted them in red, ++assuming that colouring is supported by the output device. The ++colouring is intended to draw attention to the presence of unicode ++sequences when they might not be expected. + .IP "\fB\-e\fR" 4 + .IX Item "-e" + .PD 0 +diff -rup binutils.orig/binutils/doc/size.1 binutils-2.35.2/binutils/doc/size.1 +--- binutils.orig/binutils/doc/size.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/size.1 2021-10-25 12:13:31.404727954 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "SIZE 1" +-.TH SIZE 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH SIZE 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/strings.1 binutils-2.35.2/binutils/doc/strings.1 +--- binutils.orig/binutils/doc/strings.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/strings.1 2021-10-25 12:13:31.408727941 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "STRINGS 1" +-.TH STRINGS 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH STRINGS 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +@@ -146,6 +146,7 @@ strings [\fB\-afovV\fR] [\fB\-\fR\fImin- + [\fB\-n\fR \fImin-len\fR] [\fB\-\-bytes=\fR\fImin-len\fR] + [\fB\-t\fR \fIradix\fR] [\fB\-\-radix=\fR\fIradix\fR] + [\fB\-e\fR \fIencoding\fR] [\fB\-\-encoding=\fR\fIencoding\fR] ++ [\fB\-U\fR \fImethod\fR] [\fB\-\-unicode=\fR\fImethod\fR] + [\fB\-\fR] [\fB\-\-all\fR] [\fB\-\-print\-file\-name\fR] + [\fB\-T\fR \fIbfdname\fR] [\fB\-\-target=\fR\fIbfdname\fR] + [\fB\-w\fR] [\fB\-\-include\-all\-whitespace\fR] +@@ -250,6 +251,31 @@ single\-8\-bit\-byte characters, \fBb\fR + 16\-bit littleendian, \fBB\fR = 32\-bit bigendian, \fBL\fR = 32\-bit + littleendian. Useful for finding wide character strings. (\fBl\fR + and \fBb\fR apply to, for example, Unicode \s-1UTF\-16/UCS\-2\s0 encodings). ++.IP "\fB\-U\fR \fI[d|i|l|e|x|h]\fR" 4 ++.IX Item "-U [d|i|l|e|x|h]" ++.PD 0 ++.IP "\fB\-\-unicode=\fR\fI[default|invalid|locale|escape|hex|highlight]\fR" 4 ++.IX Item "--unicode=[default|invalid|locale|escape|hex|highlight]" ++.PD ++Controls the display of \s-1UTF\-8\s0 encoded mulibyte characters in strings. ++The default (\fB\-\-unicode=default\fR) is to give them no special ++treatment, and instead rely upon the setting of the ++\&\fB\-\-encoding\fR option. The other values for this option ++automatically enable \fB\-\-encoding=S\fR. ++.Sp ++The \fB\-\-unicode=invalid\fR option treats them as non-graphic ++characters and hence not part of a valid string. All the remaining ++options treat them as valid string characters. ++.Sp ++The \fB\-\-unicode=locale\fR option displays them in the current ++locale, which may or may not support \s-1UTF\-8\s0 encoding. The ++\&\fB\-\-unicode=hex\fR option displays them as hex byte sequences ++enclosed between \fI<>\fR characters. The \fB\-\-unicode=escape\fR ++option displays them as escape sequences (\fI\euxxxx\fR) and the ++\&\fB\-\-unicode=highlight\fR option displays them as escape sequences ++highlighted in red (if supported by the output device). The colouring ++is intended to draw attention to the presence of unicode sequences ++where they might not be expected. + .IP "\fB\-T\fR \fIbfdname\fR" 4 + .IX Item "-T bfdname" + .PD 0 +diff -rup binutils.orig/binutils/doc/strip.1 binutils-2.35.2/binutils/doc/strip.1 +--- binutils.orig/binutils/doc/strip.1 2021-08-16 13:07:33.367206466 +0100 ++++ binutils-2.35.2/binutils/doc/strip.1 2021-10-25 12:13:31.441727835 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "STRIP 1" +-.TH STRIP 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH STRIP 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/windmc.1 binutils-2.35.2/binutils/doc/windmc.1 +--- binutils.orig/binutils/doc/windmc.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/windmc.1 2021-10-25 12:13:31.484727696 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "WINDMC 1" +-.TH WINDMC 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH WINDMC 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +diff -rup binutils.orig/binutils/doc/windres.1 binutils-2.35.2/binutils/doc/windres.1 +--- binutils.orig/binutils/doc/windres.1 2021-08-16 13:07:33.366206472 +0100 ++++ binutils-2.35.2/binutils/doc/windres.1 2021-10-25 12:13:31.467727751 +0100 +@@ -1,4 +1,4 @@ +-.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) ++.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) + .\" + .\" Standard preamble: + .\" ======================================================================== +@@ -133,7 +133,7 @@ + .\" ======================================================================== + .\" + .IX Title "WINDRES 1" +-.TH WINDRES 1 "2021-01-30" "binutils-2.35.2" "GNU Development Tools" ++.TH WINDRES 1 "2021-10-25" "binutils-2.35.2" "GNU Development Tools" + .\" For nroff, turn off justification. Always turn off hyphenation; it makes + .\" way too many mistakes in technical documents. + .if n .ad l +Only in binutils-2.35.2/binutils/: filemode.o +Only in binutils-2.35.2/binutils/: libtool +diff -rup binutils.orig/binutils/nm.c binutils-2.35.2/binutils/nm.c +--- binutils.orig/binutils/nm.c 2021-08-16 13:07:33.367206466 +0100 ++++ binutils-2.35.2/binutils/nm.c 2021-10-25 12:12:22.313951236 +0100 +@@ -38,6 +38,11 @@ + #include "bucomm.h" + #include "plugin-api.h" + #include "plugin.h" ++#include "safe-ctype.h" ++ ++#ifndef streq ++#define streq(a,b) (strcmp ((a),(b)) == 0) ++#endif + + /* When sorting by size, we use this structure to hold the size and a + pointer to the minisymbol. */ +@@ -185,6 +190,18 @@ static const char *plugin_target = NULL; + static bfd *lineno_cache_bfd; + static bfd *lineno_cache_rel_bfd; + ++typedef enum unicode_display_type ++{ ++ unicode_default = 0, ++ unicode_locale, ++ unicode_escape, ++ unicode_hex, ++ unicode_highlight, ++ unicode_invalid ++} unicode_display_type; ++ ++static unicode_display_type unicode_display = unicode_default; ++ + enum long_option_values + { + OPTION_TARGET = 200, +@@ -225,6 +242,7 @@ static struct option long_options[] = + {"target", required_argument, 0, OPTION_TARGET}, + {"defined-only", no_argument, &defined_only, 1}, + {"undefined-only", no_argument, &undefined_only, 1}, ++ {"unicode", required_argument, NULL, 'U'}, + {"version", no_argument, &show_version, 1}, + {"with-symbol-versions", no_argument, NULL, + OPTION_WITH_SYMBOL_VERSIONS}, +@@ -275,6 +293,8 @@ usage (FILE *stream, int status) + -t, --radix=RADIX Use RADIX for printing symbol values\n\ + --target=BFDNAME Specify the target object format as BFDNAME\n\ + -u, --undefined-only Display only undefined symbols\n\ ++ -U {d|s|i|x|e|h} Specify how to treat UTF-8 encoded unicode characters\n\ ++ --unicode={default|show|invalid|hex|escape|highlight}\n\ + --with-symbol-versions Display version strings after symbol names\n\ + -X 32_64 (ignored)\n\ + @FILE Read options from FILE\n\ +@@ -390,6 +410,189 @@ get_coff_symbol_type (const struct inter + return bufp; + } + ++/* Convert a potential UTF-8 encoded sequence in IN into characters in OUT. ++ The conversion format is controlled by the unicode_display variable. ++ Returns the number of characters added to OUT. ++ Returns the number of bytes consumed from IN in CONSUMED. ++ Always consumes at least one byte and displays at least one character. */ ++ ++static unsigned int ++display_utf8 (const unsigned char * in, char * out, unsigned int * consumed) ++{ ++ char * orig_out = out; ++ unsigned int nchars = 0; ++ ++ if (unicode_display == unicode_default) ++ goto invalid; ++ ++ if (in[0] < 0xc0) ++ goto invalid; ++ ++ if ((in[1] & 0xc0) != 0x80) ++ goto invalid; ++ ++ if ((in[0] & 0x20) == 0) ++ { ++ nchars = 2; ++ goto valid; ++ } ++ ++ if ((in[2] & 0xc0) != 0x80) ++ goto invalid; ++ ++ if ((in[0] & 0x10) == 0) ++ { ++ nchars = 3; ++ goto valid; ++ } ++ ++ if ((in[3] & 0xc0) != 0x80) ++ goto invalid; ++ ++ nchars = 4; ++ ++ valid: ++ switch (unicode_display) ++ { ++ case unicode_locale: ++ /* Copy the bytes into the output buffer as is. */ ++ memcpy (out, in, nchars); ++ out += nchars; ++ break; ++ ++ case unicode_invalid: ++ case unicode_hex: ++ { ++ unsigned int j; ++ ++ out += sprintf (out, "%c", unicode_display == unicode_hex ? '<' : '{'); ++ for (j = 0; j < nchars; j++) ++ out += sprintf (out, "%02x", in [j]); ++ out += sprintf (out, "%c", unicode_display == unicode_hex ? '>' : '}'); ++ } ++ break; ++ ++ case unicode_highlight: ++ if (isatty (1)) ++ out += sprintf (out, "\x1B[31;47m"); /* Red. */ ++ /* Fall through. */ ++ case unicode_escape: ++ switch (nchars) ++ { ++ case 2: ++ out += sprintf (out, "\\u%02x%02x", ++ ((in[0] & 0x1c) >> 2), ++ ((in[0] & 0x03) << 6) | (in[1] & 0x3f)); ++ break; ++ ++ case 3: ++ out += sprintf (out, "\\u%02x%02x", ++ ((in[0] & 0x0f) << 4) | ((in[1] & 0x3c) >> 2), ++ ((in[1] & 0x03) << 6) | ((in[2] & 0x3f))); ++ break; ++ ++ case 4: ++ out += sprintf (out, "\\u%02x%02x%02x", ++ ((in[0] & 0x07) << 6) | ((in[1] & 0x3c) >> 2), ++ ((in[1] & 0x03) << 6) | ((in[2] & 0x3c) >> 2), ++ ((in[2] & 0x03) << 6) | ((in[3] & 0x3f))); ++ break; ++ default: ++ /* URG. */ ++ break; ++ } ++ ++ if (unicode_display == unicode_highlight && isatty (1)) ++ out += sprintf (out, "\033[0m"); /* Default colour. */ ++ break; ++ ++ default: ++ /* URG */ ++ break; ++ } ++ ++ * consumed = nchars; ++ return out - orig_out; ++ ++ invalid: ++ /* Not a valid UTF-8 sequence. */ ++ *out = *in; ++ * consumed = 1; ++ return 1; ++} ++ ++/* Convert any UTF-8 encoded characters in NAME into the form specified by ++ unicode_display. Also converts control characters. Returns a static ++ buffer if conversion was necessary. ++ Code stolen from objdump.c:sanitize_string(). */ ++ ++static const char * ++convert_utf8 (const char * in) ++{ ++ static char * buffer = NULL; ++ static size_t buffer_len = 0; ++ const char * original = in; ++ char * out; ++ ++ /* Paranoia. */ ++ if (in == NULL) ++ return ""; ++ ++ /* See if any conversion is necessary. ++ In the majority of cases it will not be needed. */ ++ do ++ { ++ unsigned char c = *in++; ++ ++ if (c == 0) ++ return original; ++ ++ if (ISCNTRL (c)) ++ break; ++ ++ if (unicode_display != unicode_default && c >= 0xc0) ++ break; ++ } ++ while (1); ++ ++ /* Copy the input, translating as needed. */ ++ in = original; ++ if (buffer_len < (strlen (in) * 9)) ++ { ++ free ((void *) buffer); ++ buffer_len = strlen (in) * 9; ++ buffer = xmalloc (buffer_len + 1); ++ } ++ ++ out = buffer; ++ do ++ { ++ unsigned char c = *in++; ++ ++ if (c == 0) ++ break; ++ ++ if (ISCNTRL (c)) ++ { ++ *out++ = '^'; ++ *out++ = c + 0x40; ++ } ++ else if (unicode_display != unicode_default && c >= 0xc0) ++ { ++ unsigned int num_consumed; ++ ++ out += display_utf8 ((const unsigned char *)(in - 1), out, & num_consumed); ++ in += num_consumed - 1; ++ } ++ else ++ *out++ = c; ++ } ++ while (1); ++ ++ *out = 0; ++ return buffer; ++} ++ + /* Print symbol name NAME, read from ABFD, with printf format FORM, + demangling it if requested. */ + +@@ -408,6 +611,9 @@ print_symname (const char *form, struct + name = alloc; + } + ++ if (unicode_display != unicode_default) ++ name = convert_utf8 (name); ++ + if (info != NULL && info->elfinfo) + { + const char *version_string; +@@ -1716,7 +1922,7 @@ main (int argc, char **argv) + fatal (_("fatal error: libbfd ABI mismatch")); + set_default_bfd_target (); + +- while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:", ++ while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uU:vVvX:", + long_options, (int *) 0)) != EOF) + { + switch (c) +@@ -1806,6 +2012,24 @@ main (int argc, char **argv) + case 'u': + undefined_only = 1; + break; ++ ++ case 'U': ++ if (streq (optarg, "default") || streq (optarg, "d")) ++ unicode_display = unicode_default; ++ else if (streq (optarg, "locale") || streq (optarg, "l")) ++ unicode_display = unicode_locale; ++ else if (streq (optarg, "escape") || streq (optarg, "e")) ++ unicode_display = unicode_escape; ++ else if (streq (optarg, "invalid") || streq (optarg, "i")) ++ unicode_display = unicode_invalid; ++ else if (streq (optarg, "hex") || streq (optarg, "x")) ++ unicode_display = unicode_hex; ++ else if (streq (optarg, "highlight") || streq (optarg, "h")) ++ unicode_display = unicode_highlight; ++ else ++ fatal (_("invalid argument to -U/--unicode: %s"), optarg); ++ break; ++ + case 'V': + show_version = 1; + break; +diff -rup binutils.orig/binutils/objdump.c binutils-2.35.2/binutils/objdump.c +--- binutils.orig/binutils/objdump.c 2021-08-16 13:07:33.368206459 +0100 ++++ binutils-2.35.2/binutils/objdump.c 2021-10-25 12:16:10.140214947 +0100 +@@ -205,6 +205,18 @@ static const struct objdump_private_desc + + /* The list of detected jumps inside a function. */ + static struct jump_info *detected_jumps = NULL; ++ ++typedef enum unicode_display_type ++{ ++ unicode_default = 0, ++ unicode_locale, ++ unicode_escape, ++ unicode_hex, ++ unicode_highlight, ++ unicode_invalid ++} unicode_display_type; ++ ++static unicode_display_type unicode_display = unicode_default; + + static void usage (FILE *, int) ATTRIBUTE_NORETURN; + static void +@@ -247,6 +259,9 @@ usage (FILE *stream, int status) + -r, --reloc Display the relocation entries in the file\n\ + -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\ + @ Read options from \n\ ++ -U[d|l|i|x|e|h] Controls the display of UTF-8 unicode characters\n\ ++ --unicode=[default|locale|invalid|hex|escape|highlight]\n")); ++ fprintf (stream, _("\ + -v, --version Display this program's version number\n\ + -i, --info List object formats and architectures supported\n\ + -H, --help Display this information\n\ +@@ -395,6 +410,7 @@ static struct option long_options[]= + {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS}, + {"syms", no_argument, NULL, 't'}, + {"target", required_argument, NULL, 'b'}, ++ {"unicode", required_argument, NULL, 'U'}, + {"version", no_argument, NULL, 'V'}, + {"wide", no_argument, NULL, 'w'}, + {"prefix", required_argument, NULL, OPTION_PREFIX}, +@@ -415,9 +431,123 @@ nonfatal (const char *msg) + exit_status = 1; + } + ++/* Convert a potential UTF-8 encoded sequence in IN into characters in OUT. ++ The conversion format is controlled by the unicode_display variable. ++ Returns the number of characters added to OUT. ++ Returns the number of bytes consumed from IN in CONSUMED. ++ Always consumes at least one byte and displays at least one character. */ ++ ++static unsigned int ++display_utf8 (const unsigned char * in, char * out, unsigned int * consumed) ++{ ++ char * orig_out = out; ++ unsigned int nchars = 0; ++ ++ if (unicode_display == unicode_default) ++ goto invalid; ++ ++ if (in[0] < 0xc0) ++ goto invalid; ++ ++ if ((in[1] & 0xc0) != 0x80) ++ goto invalid; ++ ++ if ((in[0] & 0x20) == 0) ++ { ++ nchars = 2; ++ goto valid; ++ } ++ ++ if ((in[2] & 0xc0) != 0x80) ++ goto invalid; ++ ++ if ((in[0] & 0x10) == 0) ++ { ++ nchars = 3; ++ goto valid; ++ } ++ ++ if ((in[3] & 0xc0) != 0x80) ++ goto invalid; ++ ++ nchars = 4; ++ ++ valid: ++ switch (unicode_display) ++ { ++ case unicode_locale: ++ /* Copy the bytes into the output buffer as is. */ ++ memcpy (out, in, nchars); ++ out += nchars; ++ break; ++ ++ case unicode_invalid: ++ case unicode_hex: ++ { ++ unsigned int j; ++ ++ out += sprintf (out, "%c", unicode_display == unicode_hex ? '<' : '{'); ++ for (j = 0; j < nchars; j++) ++ out += sprintf (out, "%02x", in [j]); ++ out += sprintf (out, "%c", unicode_display == unicode_hex ? '>' : '}'); ++ } ++ break; ++ ++ case unicode_highlight: ++ if (isatty (1)) ++ out += sprintf (out, "\x1B[31;47m"); /* Red. */ ++ /* Fall through. */ ++ case unicode_escape: ++ switch (nchars) ++ { ++ case 2: ++ out += sprintf (out, "\\u%02x%02x", ++ ((in[0] & 0x1c) >> 2), ++ ((in[0] & 0x03) << 6) | (in[1] & 0x3f)); ++ break; ++ ++ case 3: ++ out += sprintf (out, "\\u%02x%02x", ++ ((in[0] & 0x0f) << 4) | ((in[1] & 0x3c) >> 2), ++ ((in[1] & 0x03) << 6) | ((in[2] & 0x3f))); ++ break; ++ ++ case 4: ++ out += sprintf (out, "\\u%02x%02x%02x", ++ ((in[0] & 0x07) << 6) | ((in[1] & 0x3c) >> 2), ++ ((in[1] & 0x03) << 6) | ((in[2] & 0x3c) >> 2), ++ ((in[2] & 0x03) << 6) | ((in[3] & 0x3f))); ++ break; ++ default: ++ /* URG. */ ++ break; ++ } ++ ++ if (unicode_display == unicode_highlight && isatty (1)) ++ out += sprintf (out, "\033[0m"); /* Default colour. */ ++ break; ++ ++ default: ++ /* URG */ ++ break; ++ } ++ ++ * consumed = nchars; ++ return out - orig_out; ++ ++ invalid: ++ /* Not a valid UTF-8 sequence. */ ++ *out = *in; ++ * consumed = 1; ++ return 1; ++} ++ + /* Returns a version of IN with any control characters + replaced by escape sequences. Uses a static buffer +- if necessary. */ ++ if necessary. ++ ++ If unicode display is enabled, then also handles the ++ conversion of unicode characters. */ + + static const char * + sanitize_string (const char * in) +@@ -435,40 +565,50 @@ sanitize_string (const char * in) + of cases it will not be needed. */ + do + { +- char c = *in++; ++ unsigned char c = *in++; + + if (c == 0) + return original; + + if (ISCNTRL (c)) + break; ++ ++ if (unicode_display != unicode_default && c >= 0xc0) ++ break; + } + while (1); + + /* Copy the input, translating as needed. */ + in = original; +- if (buffer_len < (strlen (in) * 2)) ++ if (buffer_len < (strlen (in) * 9)) + { + free ((void *) buffer); +- buffer_len = strlen (in) * 2; ++ buffer_len = strlen (in) * 9; + buffer = xmalloc (buffer_len + 1); + } + + out = buffer; + do + { +- char c = *in++; ++ unsigned char c = *in++; + + if (c == 0) + break; + +- if (!ISCNTRL (c)) +- *out++ = c; +- else ++ if (ISCNTRL (c)) + { + *out++ = '^'; + *out++ = c + 0x40; + } ++ else if (unicode_display != unicode_default && c >= 0xc0) ++ { ++ unsigned int num_consumed; ++ ++ out += display_utf8 ((const unsigned char *)(in - 1), out, & num_consumed); ++ in += num_consumed - 1; ++ } ++ else ++ *out++ = c; + } + while (1); + +@@ -476,7 +616,6 @@ sanitize_string (const char * in) + return buffer; + } + +- + /* Returns TRUE if the specified section should be dumped. */ + + static bfd_boolean +@@ -1055,6 +1194,8 @@ objdump_print_symname (bfd *abfd, struct + + name = sanitize_string (name); + ++ name = sanitize_string (name); ++ + if (inf != NULL) + { + (*inf->fprintf_func) (inf->stream, "%s", name); +@@ -3136,7 +3277,7 @@ disassemble_section (bfd *abfd, asection + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + non_fatal (_("Reading section %s failed because: %s"), +- section->name, bfd_errmsg (bfd_get_error ())); ++ sanitize_string (section->name), bfd_errmsg (bfd_get_error ())); + return; + } + +@@ -4307,7 +4448,7 @@ dump_section (bfd *abfd, asection *secti + if (!bfd_get_full_section_contents (abfd, section, &data)) + { + non_fatal (_("Reading section %s failed because: %s"), +- section->name, bfd_errmsg (bfd_get_error ())); ++ sanitize_string (section->name), bfd_errmsg (bfd_get_error ())); + return; + } + +@@ -4447,6 +4588,24 @@ dump_symbols (bfd *abfd ATTRIBUTE_UNUSED + free (alloc); + } + } ++ else if (unicode_display != unicode_default ++ && name != NULL && *name != '\0') ++ { ++ const char * sanitized_name; ++ ++ /* If we want to sanitize the name, we do it here, and ++ temporarily clobber it while calling bfd_print_symbol. ++ FIXME: This is a gross hack. */ ++ sanitized_name = sanitize_string (name); ++ if (sanitized_name != name) ++ (*current)->name = sanitized_name; ++ else ++ sanitized_name = NULL; ++ bfd_print_symbol (cur_bfd, stdout, *current, ++ bfd_print_symbol_all); ++ if (sanitized_name != NULL) ++ (*current)->name = name; ++ } + else + bfd_print_symbol (cur_bfd, stdout, *current, + bfd_print_symbol_all); +@@ -5128,7 +5287,7 @@ main (int argc, char **argv) + set_default_bfd_target (); + + while ((c = getopt_long (argc, argv, +- "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::", ++ "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::U:", + long_options, (int *) 0)) + != EOF) + { +@@ -5407,6 +5566,23 @@ main (int argc, char **argv) + seenflag = TRUE; + break; + ++ case 'U': ++ if (streq (optarg, "default") || streq (optarg, "d")) ++ unicode_display = unicode_default; ++ else if (streq (optarg, "locale") || streq (optarg, "l")) ++ unicode_display = unicode_locale; ++ else if (streq (optarg, "escape") || streq (optarg, "e")) ++ unicode_display = unicode_escape; ++ else if (streq (optarg, "invalid") || streq (optarg, "i")) ++ unicode_display = unicode_invalid; ++ else if (streq (optarg, "hex") || streq (optarg, "x")) ++ unicode_display = unicode_hex; ++ else if (streq (optarg, "highlight") || streq (optarg, "h")) ++ unicode_display = unicode_highlight; ++ else ++ fatal (_("invalid argument to -U/--unicode: %s"), optarg); ++ break; ++ + case 'H': + usage (stdout, 0); + /* No need to set seenflag or to break - usage() does not return. */ +Only in binutils-2.35.2/binutils/po: Makefile +Only in binutils-2.35.2/binutils/po: Makefile.in +Only in binutils-2.35.2/binutils/po: POTFILES +diff -rup binutils.orig/binutils/readelf.c binutils-2.35.2/binutils/readelf.c +--- binutils.orig/binutils/readelf.c 2021-08-16 13:07:33.384206359 +0100 ++++ binutils-2.35.2/binutils/readelf.c 2021-10-25 12:12:22.318951219 +0100 +@@ -317,6 +317,18 @@ typedef enum print_mode + } + print_mode; + ++typedef enum unicode_display_type ++{ ++ unicode_locale, ++ unicode_escape, ++ unicode_hex, ++ unicode_highlight, ++ unicode_invalid ++} unicode_display_type; ++ ++static unicode_display_type unicode_display = unicode_locale; ++ ++ + /* Versioned symbol info. */ + enum versioned_symbol_info + { +@@ -592,11 +604,18 @@ print_symbol (signed int width, const ch + if (c == 0) + break; + +- /* Do not print control characters directly as they can affect terminal +- settings. Such characters usually appear in the names generated +- by the assembler for local labels. */ +- if (ISCNTRL (c)) ++ if (ISPRINT (c)) ++ { ++ putchar (c); ++ width_remaining --; ++ num_printed ++; ++ } ++ else if (ISCNTRL (c)) + { ++ /* Do not print control characters directly as they can affect terminal ++ settings. Such characters usually appear in the names generated ++ by the assembler for local labels. */ ++ + if (width_remaining < 2) + break; + +@@ -604,11 +623,135 @@ print_symbol (signed int width, const ch + width_remaining -= 2; + num_printed += 2; + } +- else if (ISPRINT (c)) ++ else if (c == 0x7f) + { +- putchar (c); +- width_remaining --; +- num_printed ++; ++ if (width_remaining < 5) ++ break; ++ printf (""); ++ width_remaining -= 5; ++ num_printed += 5; ++ } ++ else if (unicode_display != unicode_locale) ++ { ++ /* Display unicode characters as something else. */ ++ unsigned char bytes[4]; ++ bfd_boolean is_utf8; ++ unsigned int nbytes; ++ ++ bytes[0] = c; ++ ++ if (bytes[0] < 0xc0) ++ { ++ nbytes = 1; ++ is_utf8 = FALSE; ++ } ++ else ++ { ++ bytes[1] = *symbol++; ++ ++ if ((bytes[1] & 0xc0) != 0x80) ++ { ++ is_utf8 = FALSE; ++ /* Do not consume this character. It may only ++ be the first byte in the sequence that was ++ corrupt. */ ++ --symbol; ++ nbytes = 1; ++ } ++ else if ((bytes[0] & 0x20) == 0) ++ { ++ is_utf8 = TRUE; ++ nbytes = 2; ++ } ++ else ++ { ++ bytes[2] = *symbol++; ++ ++ if ((bytes[2] & 0xc0) != 0x80) ++ { ++ is_utf8 = FALSE; ++ symbol -= 2; ++ nbytes = 1; ++ } ++ else if ((bytes[0] & 0x10) == 0) ++ { ++ is_utf8 = TRUE; ++ nbytes = 3; ++ } ++ else ++ { ++ bytes[3] = *symbol++; ++ ++ nbytes = 4; ++ ++ if ((bytes[3] & 0xc0) != 0x80) ++ { ++ is_utf8 = FALSE; ++ symbol -= 3; ++ nbytes = 1; ++ } ++ else ++ is_utf8 = TRUE; ++ } ++ } ++ } ++ ++ if (unicode_display == unicode_invalid) ++ is_utf8 = FALSE; ++ ++ if (unicode_display == unicode_hex || ! is_utf8) ++ { ++ unsigned int i; ++ ++ if (width_remaining < (nbytes * 2) + 2) ++ break; ++ ++ putchar (is_utf8 ? '<' : '{'); ++ for (i = 0; i < nbytes; i++) ++ printf ("%02x", bytes[i]); ++ putchar (is_utf8 ? '>' : '}'); ++ } ++ else ++ { ++ if (unicode_display == unicode_highlight && isatty (1)) ++ printf ("\x1B[31;47m"); /* Red. */ ++ ++ switch (nbytes) ++ { ++ case 2: ++ if (width_remaining < 6) ++ break; ++ printf ("\\u%02x%02x", ++ (bytes[0] & 0x1c) >> 2, ++ ((bytes[0] & 0x03) << 6) | (bytes[1] & 0x3f)); ++ break; ++ case 3: ++ if (width_remaining < 6) ++ break; ++ printf ("\\u%02x%02x", ++ ((bytes[0] & 0x0f) << 4) | ((bytes[1] & 0x3c) >> 2), ++ ((bytes[1] & 0x03) << 6) | (bytes[2] & 0x3f)); ++ break; ++ case 4: ++ if (width_remaining < 8) ++ break; ++ printf ("\\u%02x%02x%02x", ++ ((bytes[0] & 0x07) << 6) | ((bytes[1] & 0x3c) >> 2), ++ ((bytes[1] & 0x03) << 6) | ((bytes[2] & 0x3c) >> 2), ++ ((bytes[2] & 0x03) << 6) | (bytes[3] & 0x3f)); ++ ++ break; ++ default: ++ /* URG. */ ++ break; ++ } ++ ++ if (unicode_display == unicode_highlight && isatty (1)) ++ printf ("\033[0m"); /* Default colour. */ ++ } ++ ++ if (bytes[nbytes - 1] == 0) ++ break; + } + else + { +@@ -4528,6 +4671,7 @@ static struct option options[] = + {"ctf-parent", required_argument, 0, OPTION_CTF_PARENT}, + #endif + ++ {"unicode", required_argument, 0, 'U'}, + {"version", no_argument, 0, 'v'}, + {"wide", no_argument, 0, 'W'}, + {"silent-truncation",no_argument, 0, 'T'}, +@@ -4599,6 +4743,11 @@ usage (FILE * stream) + -I --histogram Display histogram of bucket list lengths\n\ + -W --wide Allow output width to exceed 80 characters\n\ + -T --silent-truncation If a symbol name is truncated, do not add a suffix [...]\n\ ++ -U --unicode=[locale|escape|hex|highlight|invalid]\n\ ++ Display unicode characters as determined by the current locale\n\ ++ (default), escape sequences, \"\", highlighted\n\ ++ escape sequences, or treat them as invalid and display as\n\ ++ \"{hex sequences}\"\n\ + @ Read options from \n\ + -H --help Display this information\n\ + -v --version Display the version number of readelf\n")); +@@ -4693,7 +4842,7 @@ parse_args (struct dump_data *dumpdata, + usage (stderr); + + while ((c = getopt_long +- (argc, argv, "ADHILNR:STVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF) ++ (argc, argv, "ADHILNR:STU:VWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF) + { + switch (c) + { +@@ -4843,6 +4992,25 @@ parse_args (struct dump_data *dumpdata, + request_dump (dumpdata, DISASS_DUMP); + break; + #endif ++ case 'U': ++ if (optarg == NULL) ++ error (_("Missing arg to -U/--unicode")); /* Can this happen ? */ ++ else if (streq (optarg, "default") || streq (optarg, "d")) ++ unicode_display = unicode_locale; ++ else if (streq (optarg, "locale") || streq (optarg, "l")) ++ unicode_display = unicode_locale; ++ else if (streq (optarg, "escape") || streq (optarg, "e")) ++ unicode_display = unicode_escape; ++ else if (streq (optarg, "invalid") || streq (optarg, "i")) ++ unicode_display = unicode_invalid; ++ else if (streq (optarg, "hex") || streq (optarg, "x")) ++ unicode_display = unicode_hex; ++ else if (streq (optarg, "highlight") || streq (optarg, "h")) ++ unicode_display = unicode_highlight; ++ else ++ error (_("unknown argument to -U/--unicode: %s"), optarg); ++ break; ++ + case 'v': + print_version (program_name); + break; +Only in binutils-2.35.2/binutils/: size.o +Only in binutils-2.35.2/binutils/: stamp-h1 +diff -rup binutils.orig/binutils/strings.c binutils-2.35.2/binutils/strings.c +--- binutils.orig/binutils/strings.c 2021-08-16 13:07:33.382206371 +0100 ++++ binutils-2.35.2/binutils/strings.c 2021-10-25 12:12:22.319951216 +0100 +@@ -55,6 +55,19 @@ + -T {bfdname} + Specify a non-default object file format. + ++ --unicode={default|locale|invalid|hex|escape|highlight} ++ -U {d|l|i|x|e|h} ++ Determine how to handle UTF-8 unicode characters. The default ++ is no special treatment. All other versions of this option ++ only apply if the encoding is valid and enabling the option ++ implies --encoding=S. ++ The 'locale' option displays the characters according to the ++ current locale. The 'invalid' option treats them as ++ non-string characters. The 'hex' option displays them as hex ++ byte sequences. The 'escape' option displays them as escape ++ sequences and the 'highlight' option displays them as ++ coloured escape sequences. ++ + --output-separator=sep_string + -s sep_string String used to separate parsed strings in output. + Default is newline. +@@ -76,6 +89,22 @@ + #include "safe-ctype.h" + #include "bucomm.h" + ++#ifndef streq ++#define streq(a,b) (strcmp ((a),(b)) == 0) ++#endif ++ ++typedef enum unicode_display_type ++{ ++ unicode_default = 0, ++ unicode_locale, ++ unicode_escape, ++ unicode_hex, ++ unicode_highlight, ++ unicode_invalid ++} unicode_display_type; ++ ++static unicode_display_type unicode_display = unicode_default; ++ + #define STRING_ISGRAPHIC(c) \ + ( (c) >= 0 \ + && (c) <= 255 \ +@@ -94,7 +123,7 @@ extern int errno; + static int address_radix; + + /* Minimum length of sequence of graphic chars to trigger output. */ +-static int string_min; ++static uint string_min; + + /* Whether or not we include all whitespace as a graphic char. */ + static bfd_boolean include_all_whitespace; +@@ -130,6 +159,7 @@ static struct option long_options[] = + {"target", required_argument, NULL, 'T'}, + {"output-separator", required_argument, NULL, 's'}, + {"help", no_argument, NULL, 'h'}, ++ {"unicode", required_argument, NULL, 'U'}, + {"version", no_argument, NULL, 'v'}, + {NULL, 0, NULL, 0} + }; +@@ -173,7 +203,7 @@ main (int argc, char **argv) + encoding = 's'; + output_separator = NULL; + +- while ((optc = getopt_long (argc, argv, "adfhHn:wot:e:T:s:Vv0123456789", ++ while ((optc = getopt_long (argc, argv, "adfhHn:wot:e:T:s:U:Vv0123456789", + long_options, (int *) 0)) != EOF) + { + switch (optc) +@@ -246,6 +276,23 @@ main (int argc, char **argv) + output_separator = optarg; + break; + ++ case 'U': ++ if (streq (optarg, "default") || streq (optarg, "d")) ++ unicode_display = unicode_default; ++ else if (streq (optarg, "locale") || streq (optarg, "l")) ++ unicode_display = unicode_locale; ++ else if (streq (optarg, "escape") || streq (optarg, "e")) ++ unicode_display = unicode_escape; ++ else if (streq (optarg, "invalid") || streq (optarg, "i")) ++ unicode_display = unicode_invalid; ++ else if (streq (optarg, "hex") || streq (optarg, "x")) ++ unicode_display = unicode_hex; ++ else if (streq (optarg, "highlight") || streq (optarg, "h")) ++ unicode_display = unicode_highlight; ++ else ++ fatal (_("invalid argument to -U/--unicode: %s"), optarg); ++ break; ++ + case 'V': + case 'v': + print_version ("strings"); +@@ -260,6 +307,9 @@ main (int argc, char **argv) + } + } + ++ if (unicode_display != unicode_default) ++ encoding = 'S'; ++ + if (numeric_opt != 0) + { + string_min = (int) strtoul (argv[numeric_opt - 1] + 1, &s, 0); +@@ -553,11 +603,629 @@ unget_part_char (long c, file_ptr *addre + } + } + } ++ ++static void ++print_filename_and_address (const char * filename, file_ptr address) ++{ ++ if (print_filenames) ++ printf ("%s: ", filename); ++ ++ if (! print_addresses) ++ return; ++ ++ switch (address_radix) ++ { ++ case 8: ++ if (sizeof (address) > sizeof (long)) ++ { ++#ifndef __MSVCRT__ ++ printf ("%7llo ", (unsigned long long) address); ++#else ++ printf ("%7I64o ", (unsigned long long) address); ++#endif ++ } ++ else ++ printf ("%7lo ", (unsigned long) address); ++ break; ++ ++ case 10: ++ if (sizeof (address) > sizeof (long)) ++ { ++#ifndef __MSVCRT__ ++ printf ("%7llu ", (unsigned long long) address); ++#else ++ printf ("%7I64d ", (unsigned long long) address); ++#endif ++ } ++ else ++ printf ("%7ld ", (long) address); ++ break; ++ ++ case 16: ++ if (sizeof (address) > sizeof (long)) ++ { ++#ifndef __MSVCRT__ ++ printf ("%7llx ", (unsigned long long) address); ++#else ++ printf ("%7I64x ", (unsigned long long) address); ++#endif ++ } ++ else ++ printf ("%7lx ", (unsigned long) address); ++ break; ++ } ++} ++ ++/* Return non-zero if the bytes starting at BUFFER form a valid UTF-8 encoding. ++ If the encoding is valid then returns the number of bytes it uses. */ ++ ++static unsigned int ++is_valid_utf8 (const unsigned char * buffer, unsigned long buflen) ++{ ++ if (buffer[0] < 0xc0) ++ return 0; ++ ++ if (buflen < 2) ++ return 0; ++ ++ if ((buffer[1] & 0xc0) != 0x80) ++ return 0; ++ ++ if ((buffer[0] & 0x20) == 0) ++ return 2; ++ ++ if (buflen < 3) ++ return 0; ++ ++ if ((buffer[2] & 0xc0) != 0x80) ++ return 0; ++ ++ if ((buffer[0] & 0x10) == 0) ++ return 3; ++ ++ if (buflen < 4) ++ return 0; ++ ++ if ((buffer[3] & 0xc0) != 0x80) ++ return 0; ++ ++ return 4; ++} ++ ++/* Display a UTF-8 encoded character in BUFFER according to the setting ++ of unicode_display. The character is known to be valid. ++ Returns the number of bytes consumed. */ ++ ++static unsigned int ++display_utf8_char (const unsigned char * buffer) ++{ ++ unsigned int j; ++ unsigned int utf8_len; ++ ++ switch (buffer[0] & 0x30) ++ { ++ case 0x00: ++ case 0x10: ++ utf8_len = 2; ++ break; ++ case 0x20: ++ utf8_len = 3; ++ break; ++ default: ++ utf8_len = 4; ++ } ++ ++ switch (unicode_display) ++ { ++ default: ++ fprintf (stderr, "ICE: unexpected unicode display type\n"); ++ break; ++ ++ case unicode_escape: ++ case unicode_highlight: ++ if (unicode_display == unicode_highlight && isatty (1)) ++ printf ("\x1B[31;47m"); /* Red. */ ++ ++ switch (utf8_len) ++ { ++ case 2: ++ printf ("\\u%02x%02x", ++ ((buffer[0] & 0x1c) >> 2), ++ ((buffer[0] & 0x03) << 6) | (buffer[1] & 0x3f)); ++ break; ++ ++ case 3: ++ printf ("\\u%02x%02x", ++ ((buffer[0] & 0x0f) << 4) | ((buffer[1] & 0x3c) >> 2), ++ ((buffer[1] & 0x03) << 6) | ((buffer[2] & 0x3f))); ++ break; ++ ++ case 4: ++ printf ("\\u%02x%02x%02x", ++ ((buffer[0] & 0x07) << 6) | ((buffer[1] & 0x3c) >> 2), ++ ((buffer[1] & 0x03) << 6) | ((buffer[2] & 0x3c) >> 2), ++ ((buffer[2] & 0x03) << 6) | ((buffer[3] & 0x3f))); ++ break; ++ default: ++ /* URG. */ ++ break; ++ } ++ ++ if (unicode_display == unicode_highlight && isatty (1)) ++ printf ("\033[0m"); /* Default colour. */ ++ break; ++ ++ case unicode_hex: ++ putchar ('<'); ++ for (j = 0; j < utf8_len; j++) ++ printf ("%02x", buffer [j]); ++ putchar ('>'); ++ break; ++ ++ case unicode_locale: ++ printf ("%.1s", buffer); ++ break; ++ } ++ ++ return utf8_len; ++} ++ ++/* Display strings in BUFFER. Treat any UTF-8 encoded characters encountered ++ according to the setting of the unicode_display variable. The buffer ++ contains BUFLEN bytes. ++ ++ Display the characters as if they started at ADDRESS and are contained in ++ FILENAME. */ ++ ++static void ++print_unicode_buffer (const char * filename, ++ file_ptr address, ++ const unsigned char * buffer, ++ unsigned long buflen) ++{ ++ /* Paranoia checks... */ ++ if (filename == NULL ++ || buffer == NULL ++ || unicode_display == unicode_default ++ || encoding != 'S' ++ || encoding_bytes != 1) ++ { ++ fprintf (stderr, "ICE: bad arguments to print_unicode_buffer\n"); ++ return; ++ } ++ ++ if (buflen == 0) ++ return; ++ ++ /* We must only display strings that are at least string_min *characters* ++ long. So we scan the buffer in two stages. First we locate the start ++ of a potential string. Then we walk along it until we have found ++ string_min characters. Then we go back to the start point and start ++ displaying characters according to the unicode_display setting. */ ++ ++ unsigned long start_point = 0; ++ unsigned long i = 0; ++ unsigned int char_len = 1; ++ unsigned int num_found = 0; ++ ++ for (i = 0; i < buflen; i += char_len) ++ { ++ int c = buffer[i]; ++ ++ char_len = 1; ++ ++ /* Find the first potential character of a string. */ ++ if (! STRING_ISGRAPHIC (c)) ++ { ++ num_found = 0; ++ continue; ++ } ++ ++ if (c > 126) ++ { ++ if (c < 0xc0) ++ { ++ num_found = 0; ++ continue; ++ } ++ ++ if ((char_len = is_valid_utf8 (buffer + i, buflen - i)) == 0) ++ { ++ char_len = 1; ++ num_found = 0; ++ continue; ++ } ++ ++ if (unicode_display == unicode_invalid) ++ { ++ /* We have found a valid UTF-8 character, but we treat it as non-graphic. */ ++ num_found = 0; ++ continue; ++ } ++ } ++ ++ if (num_found == 0) ++ /* We have found a potential starting point for a string. */ ++ start_point = i; ++ ++ ++ num_found; ++ ++ if (num_found >= string_min) ++ break; ++ } ++ ++ if (num_found < string_min) ++ return; ++ ++ print_filename_and_address (filename, address + start_point); ++ ++ /* We have found string_min characters. Display them and any ++ more that follow. */ ++ for (i = start_point; i < buflen; i += char_len) ++ { ++ int c = buffer[i]; ++ ++ char_len = 1; ++ ++ if (! STRING_ISGRAPHIC (c)) ++ break; ++ else if (c < 127) ++ putchar (c); ++ else if (! is_valid_utf8 (buffer + i, buflen - i)) ++ break; ++ else if (unicode_display == unicode_invalid) ++ break; ++ else ++ char_len = display_utf8_char (buffer + i); ++ } ++ ++ if (output_separator) ++ fputs (output_separator, stdout); ++ else ++ putchar ('\n'); ++ ++ /* FIXME: Using tail recursion here is lazy programming... */ ++ print_unicode_buffer (filename, address + i, buffer + i, buflen - i); ++} ++ ++static int ++get_unicode_byte (FILE * stream, ++ unsigned char * putback, ++ unsigned int * num_putback, ++ unsigned int * num_read) ++{ ++ if (* num_putback > 0) ++ { ++ * num_putback = * num_putback - 1; ++ return putback [* num_putback]; ++ } ++ ++ * num_read = * num_read + 1; ++ ++#if defined(HAVE_GETC_UNLOCKED) && HAVE_DECL_GETC_UNLOCKED ++ return getc_unlocked (stream); ++#else ++ return getc (stream); ++#endif ++} ++ ++/* Helper function for print_unicode_stream. */ ++ ++static void ++print_unicode_stream_body (const char * filename, ++ file_ptr address, ++ FILE * stream, ++ unsigned char * putback_buf, ++ unsigned int num_putback, ++ unsigned char * print_buf) ++{ ++ /* It would be nice if we could just read the stream into a buffer ++ and then process if with print_unicode_buffer. But the input ++ might be huge or it might time-locked (eg stdin). So instead ++ we go one byte at a time... */ ++ ++ file_ptr start_point = 0; ++ unsigned int num_read = 0; ++ unsigned int num_chars = 0; ++ unsigned int num_print = 0; ++ int c; ++ ++ /* Find a series of string_min characters. Put them into print_buf. */ ++ do ++ { ++ if (num_chars >= string_min) ++ break; ++ ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ ++ if (! STRING_ISGRAPHIC (c)) ++ { ++ num_chars = num_print = 0; ++ continue; ++ } ++ ++ if (num_chars == 0) ++ start_point = num_read - 1; ++ ++ if (c < 127) ++ { ++ print_buf[num_print] = c; ++ num_chars ++; ++ num_print ++; ++ continue; ++ } ++ ++ if (c < 0xc0) ++ { ++ num_chars = num_print = 0; ++ continue; ++ } ++ ++ /* We *might* have a UTF-8 sequence. Time to start peeking. */ ++ char utf8[4]; ++ ++ utf8[0] = c; ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[1] = c; ++ ++ if ((utf8[1] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[1]; ++ num_chars = num_print = 0; ++ continue; ++ } ++ else if ((utf8[0] & 0x20) == 0) ++ { ++ /* A valid 2-byte UTF-8 encoding. */ ++ if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[1]; ++ num_chars = num_print = 0; ++ } ++ else ++ { ++ print_buf[num_print ++] = utf8[0]; ++ print_buf[num_print ++] = utf8[1]; ++ num_chars ++; ++ } ++ continue; ++ } ++ ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[2] = c; ++ ++ if ((utf8[2] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ num_chars = num_print = 0; ++ continue; ++ } ++ else if ((utf8[0] & 0x10) == 0) ++ { ++ /* A valid 3-byte UTF-8 encoding. */ ++ if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ num_chars = num_print = 0; ++ } ++ else ++ { ++ print_buf[num_print ++] = utf8[0]; ++ print_buf[num_print ++] = utf8[1]; ++ print_buf[num_print ++] = utf8[2]; ++ num_chars ++; ++ } ++ continue; ++ } ++ ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[3] = c; ++ ++ if ((utf8[3] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[3]; ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ num_chars = num_print = 0; ++ } ++ /* We have a valid 4-byte UTF-8 encoding. */ ++ else if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[3]; ++ putback_buf[num_putback++] = utf8[1]; ++ putback_buf[num_putback++] = utf8[2]; ++ num_chars = num_print = 0; ++ } ++ else ++ { ++ print_buf[num_print ++] = utf8[0]; ++ print_buf[num_print ++] = utf8[1]; ++ print_buf[num_print ++] = utf8[2]; ++ print_buf[num_print ++] = utf8[3]; ++ num_chars ++; ++ } ++ } ++ while (1); ++ ++ if (num_chars >= string_min) ++ { ++ /* We know that we have string_min valid characters in print_buf, ++ and there may be more to come in the stream. Start displaying ++ them. */ ++ ++ print_filename_and_address (filename, address + start_point); ++ ++ unsigned int i; ++ for (i = 0; i < num_print;) ++ { ++ if (print_buf[i] < 127) ++ putchar (print_buf[i++]); ++ else ++ i += display_utf8_char (print_buf + i); ++ } ++ ++ /* OK so now we have to start read unchecked bytes. */ ++ ++ /* Find a series of string_min characters. Put them into print_buf. */ ++ do ++ { ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ ++ if (! STRING_ISGRAPHIC (c)) ++ break; ++ ++ if (c < 127) ++ { ++ putchar (c); ++ continue; ++ } ++ ++ if (c < 0xc0) ++ break; ++ ++ /* We *might* have a UTF-8 sequence. Time to start peeking. */ ++ unsigned char utf8[4]; ++ ++ utf8[0] = c; ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[1] = c; ++ ++ if ((utf8[1] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else if ((utf8[0] & 0x20) == 0) ++ { ++ /* Valid 2-byte UTF-8. */ ++ if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else ++ { ++ (void) display_utf8_char (utf8); ++ continue; ++ } ++ } ++ ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[2] = c; ++ ++ if ((utf8[2] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else if ((utf8[0] & 0x10) == 0) ++ { ++ /* Valid 3-byte UTF-8. */ ++ if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else ++ { ++ (void) display_utf8_char (utf8); ++ continue; ++ } ++ } ++ ++ c = get_unicode_byte (stream, putback_buf, & num_putback, & num_read); ++ if (c == EOF) ++ break; ++ utf8[3] = c; ++ ++ if ((utf8[3] & 0xc0) != 0x80) ++ { ++ /* Invalid UTF-8. */ ++ putback_buf[num_putback++] = utf8[3]; ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else if (unicode_display == unicode_invalid) ++ { ++ putback_buf[num_putback++] = utf8[3]; ++ putback_buf[num_putback++] = utf8[2]; ++ putback_buf[num_putback++] = utf8[1]; ++ break; ++ } ++ else ++ /* A valid 4-byte UTF-8 encoding. */ ++ (void) display_utf8_char (utf8); ++ } ++ while (1); ++ ++ if (output_separator) ++ fputs (output_separator, stdout); ++ else ++ putchar ('\n'); ++ } ++ ++ if (c != EOF) ++ /* FIXME: Using tail recursion here is lazy, but it works. */ ++ print_unicode_stream_body (filename, address + num_read, stream, putback_buf, num_putback, print_buf); ++} ++ ++/* Display strings read in from STREAM. Treat any UTF-8 encoded characters ++ encountered according to the setting of the unicode_display variable. ++ The stream is positioned at ADDRESS and is attached to FILENAME. */ ++ ++static void ++print_unicode_stream (const char * filename, ++ file_ptr address, ++ FILE * stream) ++{ ++ /* Paranoia checks... */ ++ if (filename == NULL ++ || stream == NULL ++ || unicode_display == unicode_default ++ || encoding != 'S' ++ || encoding_bytes != 1) ++ { ++ fprintf (stderr, "ICE: bad arguments to print_unicode_stream\n"); ++ return; ++ } ++ ++ /* Allocate space for string_min 4-byte utf-8 characters. */ ++ unsigned char * print_buf = xmalloc ((4 * string_min) + 1); ++ /* We should never have to put back more than 4 bytes. */ ++ unsigned char putback_buf[5]; ++ unsigned int num_putback = 0; ++ ++ print_unicode_stream_body (filename, address, stream, putback_buf, num_putback, print_buf); ++ free (print_buf); ++} + + /* Find the strings in file FILENAME, read from STREAM. + Assume that STREAM is positioned so that the next byte read + is at address ADDRESS in the file. +- Stop reading at address STOP_POINT in the file, if nonzero. + + If STREAM is NULL, do not read from it. + The caller can supply a buffer of characters +@@ -570,18 +1238,27 @@ static void + print_strings (const char *filename, FILE *stream, file_ptr address, + int stop_point, int magiccount, char *magic) + { ++ if (unicode_display != unicode_default) ++ { ++ if (magic != NULL) ++ print_unicode_buffer (filename, address, ++ (const unsigned char *) magic, magiccount); ++ ++ if (stream != NULL) ++ print_unicode_stream (filename, address, stream); ++ return; ++ } ++ + char *buf = (char *) xmalloc (sizeof (char) * (string_min + 1)); + + while (1) + { + file_ptr start; +- int i; ++ unsigned int i; + long c; + + /* See if the next `string_min' chars are all graphic chars. */ + tryline: +- if (stop_point && address >= stop_point) +- break; + start = address; + for (i = 0; i < string_min; i++) + { +@@ -718,6 +1395,8 @@ usage (FILE *stream, int status) + -T --target= Specify the binary file format\n\ + -e --encoding={s,S,b,l,B,L} Select character size and endianness:\n\ + s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\ ++ --unicode={default|show|invalid|hex|escape|highlight}\n\ ++ -U {d|s|i|x|e|h} Specify how to treat UTF-8 encoded unicode characters\n\ + -s --output-separator= String used to separate strings in output.\n\ + @ Read options from \n\ + -h --help Display this information\n\ +Only in binutils-2.35.2/binutils/: sysinfo +Only in binutils-2.35.2/binutils/: sysinfo.o +Only in binutils-2.35.2/binutils/: syslex_wrap.o +Only in binutils-2.35.2/binutils/: sysroff.h +Only in binutils-2.35.2/binutils/: version.o diff --git a/SPECS/binutils.spec b/SPECS/binutils.spec index 29abdd0..9e869cc 100644 --- a/SPECS/binutils.spec +++ b/SPECS/binutils.spec @@ -39,7 +39,7 @@ Summary: A GNU collection of binary utilities Name: binutils%{?name_cross}%{?_with_debug:-debug} Version: 2.35.2 -Release: 9%{?dist} +Release: 10%{?dist} License: GPLv3+ URL: https://sourceware.org/binutils @@ -386,6 +386,10 @@ Patch47: binutils-gold-i386-gnu-property-notes.patch # Lifetime: Fixed in 2.38 Patch48: binutils-dwarf-5-dir0.patch +# Purpose: Add options to control the display of multibyte characters. CVE 2021-42574 +# Lifetime: Fixed in 2.38 (maybe) +Patch49: binutils.unicode.patch + #---------------------------------------------------------------------------- Provides: bundled(libiberty) @@ -971,6 +975,9 @@ exit 0 #---------------------------------------------------------------------------- %changelog +* Mon Oct 25 2021 Nick Clifton - 2.32.2-10 +- Add ability to control the display of unicode characters. (#2009190) + * Mon Aug 16 2021 Nick Clifton - 2.32.2-9 - Add another s390x arch 14 instruction. (#1898533)