gdb/linux-tdep.c: Add Perms to the 'info proc mappings' output
authorDominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com>
Tue, 22 Feb 2022 23:43:25 +0000 (00:43 +0100)
committerSimon Marchi <simon.marchi@polymtl.ca>
Wed, 23 Feb 2022 14:10:43 +0000 (09:10 -0500)
Fixes #28914 and so it adds a 'Perms' (permissions) column to the
'info proc mappings' command output. This will allow users to know
the memory pages permissions right away from GDB instead of having
to fetch them from the /proc/$pid/maps file (which is also what GDB
does internally, but it just did not print that column).

Below I am also showing how an example output looks like before and
after this commit in case someone wonders.

On i386 targets - before this commit:
```
(gdb) info proc mappings
process 3461464
Mapped address spaces:

    Start Addr   End Addr        Size     Offset objfile
    0x56555000 0x56556000      0x1000        0x0 /home/dc/src/binutils-gdb/build/a.out
    0x56556000 0x56557000      0x1000     0x1000 /home/dc/src/binutils-gdb/build/a.out
    0x56557000 0x56558000      0x1000     0x2000 /home/dc/src/binutils-gdb/build/a.out
    0x56558000 0x5655a000      0x2000     0x2000 /home/dc/src/binutils-gdb/build/a.out
    0xf7fc4000 0xf7fc8000      0x4000        0x0 [vvar]
    0xf7fc8000 0xf7fca000      0x2000        0x0 [vdso]
    0xf7fca000 0xf7fcb000      0x1000        0x0 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7fcb000 0xf7fee000     0x23000     0x1000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7fee000 0xf7ffb000      0xd000    0x24000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7ffb000 0xf7ffe000      0x3000    0x30000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xfffdc000 0xffffe000     0x22000        0x0 [stack]
(gdb)
```

On i386 targets - after this commit:
```
(gdb) info proc mappings
process 3461464
Mapped address spaces:

    Start Addr   End Addr   Perms       Size     Offset objfile
    0x56555000 0x56556000   r--p      0x1000        0x0 /home/dc/src/binutils-gdb/build/a.out
    0x56556000 0x56557000   r-xp      0x1000     0x1000 /home/dc/src/binutils-gdb/build/a.out
    0x56557000 0x56558000   r--p      0x1000     0x2000 /home/dc/src/binutils-gdb/build/a.out
    0x56558000 0x5655a000   rw-p      0x2000     0x2000 /home/dc/src/binutils-gdb/build/a.out
    0xf7fc4000 0xf7fc8000   r--p      0x4000        0x0 [vvar]
    0xf7fc8000 0xf7fca000   r-xp      0x2000        0x0 [vdso]
    0xf7fca000 0xf7fcb000   r--p      0x1000        0x0 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7fcb000 0xf7fee000   r-xp     0x23000     0x1000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7fee000 0xf7ffb000   r--p      0xd000    0x24000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xf7ffb000 0xf7ffe000   rw-p      0x3000    0x30000 /usr/lib/i386-linux-gnu/ld-2.33.so
    0xfffdc000 0xffffe000   rw-p     0x22000        0x0 [stack]
(gdb)
```

On amd64 targets - after this commit:
```
(gdb) info proc mappings
process 3461869
Mapped address spaces:

          Start Addr           End Addr   Perms       Size     Offset objfile
      0x555555554000     0x555555555000   r--p      0x1000        0x0 /home/dc/src/binutils-gdb/build/a.out
      0x555555555000     0x555555556000   r-xp      0x1000     0x1000 /home/dc/src/binutils-gdb/build/a.out
      0x555555556000     0x555555557000   r--p      0x1000     0x2000 /home/dc/src/binutils-gdb/build/a.out
      0x555555557000     0x555555559000   rw-p      0x2000     0x2000 /home/dc/src/binutils-gdb/build/a.out
      0x7ffff7fc3000     0x7ffff7fc7000   r--p      0x4000        0x0 [vvar]
      0x7ffff7fc7000     0x7ffff7fc9000   r-xp      0x2000        0x0 [vdso]
      0x7ffff7fc9000     0x7ffff7fca000   r--p      0x1000        0x0 /usr/lib/x86_64-linux-gnu/ld-2.33.so
      0x7ffff7fca000     0x7ffff7ff1000   r-xp     0x27000     0x1000 /usr/lib/x86_64-linux-gnu/ld-2.33.so
      0x7ffff7ff1000     0x7ffff7ffb000   r--p      0xa000    0x28000 /usr/lib/x86_64-linux-gnu/ld-2.33.so
      0x7ffff7ffb000     0x7ffff7fff000   rw-p      0x4000    0x31000 /usr/lib/x86_64-linux-gnu/ld-2.33.so
      0x7ffffffdd000     0x7ffffffff000   rw-p     0x22000        0x0 [stack]
  0xffffffffff600000 0xffffffffff601000   --xp      0x1000        0x0 [vsyscall]
(gdb)
```

Signed-off-by: Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com>
Change-Id: I4991f6cc758cd532eae3ae98c29d22e7bd9d9c36

gdb/linux-tdep.c

index 1b48b7fef25ef03d021793374f00e0b4b97d815a..060f60e753a2692ddd542c4919616fbe69f14605 100644 (file)
@@ -879,16 +879,14 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args,
          printf_filtered (_("Mapped address spaces:\n\n"));
          if (gdbarch_addr_bit (gdbarch) == 32)
            {
-             printf_filtered ("\t%10s %10s %10s %10s %s\n",
-                          "Start Addr",
-                          "  End Addr",
+             printf_filtered ("\t%10s %10s %7s %10s %10s %s\n",
+                          "Start Addr", "  End Addr", "Perms",
                           "      Size", "    Offset", "objfile");
            }
          else
            {
-             printf_filtered ("  %18s %18s %10s %10s %s\n",
-                          "Start Addr",
-                          "  End Addr",
+             printf_filtered ("  %18s %18s %7s %10s %10s %s\n",
+                          "Start Addr", "  End Addr", "Perms",
                           "      Size", "    Offset", "objfile");
            }
 
@@ -908,18 +906,20 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args,
 
              if (gdbarch_addr_bit (gdbarch) == 32)
                {
-                 printf_filtered ("\t%10s %10s %10s %10s %s\n",
+                 printf_filtered ("\t%10s %10s %7.5s %10s %10s %s\n",
                                   paddress (gdbarch, addr),
                                   paddress (gdbarch, endaddr),
+                                  permissions,
                                   hex_string (endaddr - addr),
                                   hex_string (offset),
                                   *mapping_filename ? mapping_filename : "");
                }
              else
                {
-                 printf_filtered ("  %18s %18s %10s %10s %s\n",
+                 printf_filtered ("  %18s %18s %7.5s %10s %10s %s\n",
                                   paddress (gdbarch, addr),
                                   paddress (gdbarch, endaddr),
+                                  permissions,
                                   hex_string (endaddr - addr),
                                   hex_string (offset),
                                   *mapping_filename ? mapping_filename : "");