This patch fixes a bug in the handling of section flags.

I added a new test elf file that shows the failures, but I'm not sure if
you would prefer some other way of doing the testing.
From e633babc8129b759ea50c8f9e734686f2374494a Mon Sep 17 00:00:00 2001
From: Christopher Ferris <cfer...@google.com>
Date: Wed, 29 Nov 2023 16:28:23 -0800
Subject: [PATCH] readelf: Fix the section flags handling.

The array of section flags was missing the G flag, so any flags
after it were displayed incorrectly. And, of course, the G flag
was not displayed at all.

Added a new elf file with a section that include the T and C flags
and updated readelf.test to run this test. This test fails on the
old code and passes with the fix.
---
 tests/files/elf/ndk-elf-note-shflags | Bin 0 -> 4308 bytes
 tests/readelf.test                   |  36 +++++++++++++++++++++++++++
 toys/other/readelf.c                 |   2 +-
 3 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100755 tests/files/elf/ndk-elf-note-shflags

diff --git a/tests/files/elf/ndk-elf-note-shflags b/tests/files/elf/ndk-elf-note-shflags
new file mode 100755
index 0000000000000000000000000000000000000000..684a78bf9c7acc6912a6810e7bd0a37418eee75c
GIT binary patch
literal 4308
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
A<NyEw

literal 0
HcmV?d00001

diff --git a/tests/readelf.test b/tests/readelf.test
index 1e85e45e..2f0a4712 100755
--- a/tests/readelf.test
+++ b/tests/readelf.test
@@ -70,6 +70,42 @@ Section Headers:
   [31] .strtab              STRTAB         0000000000000000 001b18 0001f4 00      0  0  1
 " "" ""
 
+# Verify many section header flags display properly.
+NOSPACE=1 testing "-S flags" "readelf -SW $elf-shflags | head -32" \
+"There are 28 section headers, starting at offset 0xc74:
+
+Section Headers:
+  [Nr] Name              Type            Address  Off    Size   ES Flg Lk Inf Al
+  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
+  [ 1] .interp           PROGBITS        000001b4 0001b4 000013 00   A  0   0  1
+  [ 2] .note.android.ident NOTE            000001c8 0001c8 000018 00   A  0   0  4
+  [ 3] .note.gnu.build-id NOTE            000001e0 0001e0 000020 00   A  0   0  4
+  [ 4] .dynsym           DYNSYM          00000200 000200 000060 10   A  8   1  4
+  [ 5] .gnu.version      VERSYM          00000260 000260 00000c 02   A  4   0  2
+  [ 6] .gnu.version_r    VERNEED         0000026c 00026c 000020 00   A  8   1  4
+  [ 7] .gnu.hash         GNU_HASH        0000028c 00028c 000018 00   A  4   0  4
+  [ 8] .dynstr           STRTAB          000002a4 0002a4 000064 00   A  0   0  1
+  [ 9] .rel.dyn          ANDROID_REL     00000308 000308 00000d 01   A  4   0  4
+  [10] .relr.dyn         RELR            00000318 000318 00000c 04   A  0   0  4
+  [11] .ARM.exidx        ARM_EXIDX       00000324 000324 000028 00  AL 14   0  4
+  [12] .rel.plt          REL             0000034c 00034c 000020 08  AI  4  19  4
+  [13] .rodata           PROGBITS        0000036c 00036c 000015 01 AMS  0   0  1
+  [14] .text             PROGBITS        00001384 000384 0001c4 00  AX  0   0  4
+  [15] .plt              PROGBITS        00001550 000550 000060 00  AX  0   0 16
+  [16] .tdata            PROGBITS        000025c0 0005c0 000000 00 WAT  0   0 32
+  [17] .dynamic          DYNAMIC         000025c0 0005c0 0000d0 08  WA  8   0  4
+  [18] .got              PROGBITS        00002690 000690 000010 00  WA  0   0  4
+  [19] .got.plt          PROGBITS        000026a0 0006a0 00001c 00  WA  0   0  4
+  [20] .data             PROGBITS        000036bc 0006bc 00000c 00  WA  0   0  4
+  [21] .comment          PROGBITS        00000000 0006c8 0000cc 01  MS  0   0  1
+  [22] .ARM.attributes   ATTRIBUTES      00000000 000794 000042 00      0   0  1
+  [23] .debug_frame      PROGBITS        00000000 0007d8 00007a 00   C  0   0  4
+  [24] .symtab           SYMTAB          00000000 000854 000220 10     26  27  4
+  [25] .shstrtab         STRTAB          00000000 000a74 00010e 00      0   0  1
+  [26] .strtab           STRTAB          00000000 000b82 0000de 00      0   0  1
+  [27] .gnu_debuglink    PROGBITS        00000000 000c60 000014 00      0   0  4
+" "" ""
+
 testing "-l" "readelf -lW $elf-short" "
 Elf file type is DYN (Shared object file)
 Entry point 0x1001
diff --git a/toys/other/readelf.c b/toys/other/readelf.c
index 6aaa55e1..15e5e7d7 100644
--- a/toys/other/readelf.c
+++ b/toys/other/readelf.c
@@ -542,7 +542,7 @@ static void scan_elf()
     if (FLAG(S)) {
       char sh_flags[12] = {}, *p = sh_flags;
 
-      for (j=0; j<12; j++) if (s.flags&(1<<j)) *p++ = "WAXxMSILOTC"[j];
+      for (j=0; j<12; j++) if (s.flags&(1<<j)) *p++ = "WAXxMSILOGTC"[j];
       printf("  [%2d] %-17s %-15s %0*llx %06llx %06llx %02llx %3s %2d %2d %2lld\n",
              i, s.name, sh_type(s.type), w, s.addr, s.offset, s.size,
              s.entsize, sh_flags, s.link, s.info, s.addralign);
-- 
2.43.0.rc2.451.g8631bc7472-goog

_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to