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