Enhance the strings program so that it can display multibyte strings.
authorNick Clifton <nickc@redhat.com>
Fri, 9 Nov 2018 12:48:23 +0000 (12:48 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 9 Nov 2018 12:48:23 +0000 (12:48 +0000)
* strings.c (print_strings): Check for multibyte encodings.
* binutils-all/strings-1.bin: New file.  Test binary for string decoding.
* testsuite/binutils-all/strings.exp: New file.  Test the strings program.
* testsuite/config/default.exp (STRINGS): Define if not provided
by the environment.
(STRINGSFLAGS): Likewise.

binutils/ChangeLog
binutils/strings.c
binutils/testsuite/binutils-all/strings-1.bin [new file with mode: 0755]
binutils/testsuite/binutils-all/strings.exp [new file with mode: 0644]
binutils/testsuite/config/default.exp

index 2b76d8cc0f4f1f87b20528254e12a955791f4f9c..77c61aac43fb4f76d98ff003a931d2521b76760a 100644 (file)
@@ -1,3 +1,12 @@
+2018-11-09  Mathias   <m4tze@exitno.de>
+
+       * strings.c (print_strings): Check for multibyte encodings.
+       * binutils-all/strings-1.bin: New file.  Test binary for string decoding.
+       * testsuite/binutils-all/strings.exp: New file.  Test the strings program.
+       * testsuite/config/default.exp (STRINGS): Define if not provided
+       by the environment.
+       (STRINGSFLAGS): Likewise.
+
 2018-11-07  Masatake Yamato  <yamato@redhat.com>
 
        * objdump.c (long_options): Have the --disassemble option take an
index 74545dbbdcb5b65e858958bbe219713f54f6b0fa..eac7292dab8fcbf1de83064e9bafa41887cbaa81 100644 (file)
@@ -540,9 +540,48 @@ print_strings (const char *filename, FILE *stream, file_ptr address,
              free (buf);
              return;
            }
+
          if (! STRING_ISGRAPHIC (c))
-           /* Found a non-graphic.  Try again starting with next char.  */
-           goto tryline;
+           {
+             /* Found a non-graphic. Try again starting with next char.  */
+             if (encoding_bytes > 1)
+               {
+                 /* In case of multibyte encodings rewind using magic buffer.  */
+                 if (magiccount == 0)
+                   {
+                     /* If no magic buffer exists: use memory of c.  */
+                     switch (encoding)
+                       {
+                       default:
+                         break;
+                       case 'b':
+                         c = c & 0xff;
+                         magiccount += 1;
+                         break;
+                       case 'l':
+                       case 'L':
+                         c = c >> 8;
+                         magiccount += (encoding_bytes -1);
+                         break;
+                       case 'B':
+                         c = (( c & 0xff0000) >> 16) | ( c & 0xff00)
+                           | (( c & 0xff) << 16);
+                         magiccount += 3;
+                         break;
+                       }
+                     magic = (char *) &c;
+                   }
+                 else
+                   {
+                     /* If magic buffer exists: rewind.  */
+                     magic = magic - (encoding_bytes -1);
+                   }
+
+                 address = address - (encoding_bytes -1);
+               }
+
+             goto tryline;
+           }
          buf[i] = c;
        }
 
diff --git a/binutils/testsuite/binutils-all/strings-1.bin b/binutils/testsuite/binutils-all/strings-1.bin
new file mode 100755 (executable)
index 0000000..569be85
Binary files /dev/null and b/binutils/testsuite/binutils-all/strings-1.bin differ
diff --git a/binutils/testsuite/binutils-all/strings.exp b/binutils/testsuite/binutils-all/strings.exp
new file mode 100644 (file)
index 0000000..c4bbf69
--- /dev/null
@@ -0,0 +1,41 @@
+#   Copyright (C) 2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+proc test_multibyte {testfile} {
+    global STRINGS
+    global STRINGSFLAGS
+    
+    set testname "strings: decoding little-endian multibyte strings"
+    set got [binutils_run $STRINGS "$STRINGSFLAGS --encoding=l $testfile"]
+
+    set want "String1"
+    if ![regexp $want $got] then {
+       fail "$testname [String1]"
+       return
+    }
+
+    set want "tring2"
+    if ![regexp $want $got] then {
+       fail "$testname [tring2]"
+       return
+    }
+
+    pass $testname
+}
+
+test_multibyte $srcdir/$subdir/strings-1.bin
+
+
index 1bfe72e8c8526ff45062a1a519ed2a7911409529..b34e45cd20a9339ddae6490a631b80e02fb332b5 100644 (file)
@@ -63,6 +63,12 @@ if ![info exists OBJCOPYFLAGS] then {
 if ![info exists AR] then {
     set AR [findfile $base_dir/ar]
 }
+if ![info exists STRINGS] then {
+    set STRINGS [findfile $base_dir/strings]
+}
+if ![info exists STRINGSFLAGS] then {
+    set STRINGSFLAGS ""
+}
 if ![info exists STRIP] then {
     set STRIP [findfile $base_dir/strip-new $base_dir/strip-new [transform strip]]
 }