Bug 22616 - gdb will not set program counter $pc to mmap()ed region
Summary: gdb will not set program counter $pc to mmap()ed region
Status: UNCONFIRMED
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-12-16 16:53 UTC by John Reiser
Modified: 2017-12-16 16:53 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description John Reiser 2017-12-16 16:53:49 UTC
gdb won't set the program counter $pc to point to an mmap()ed region.

Reproducible test case under Linux on armv7l (RaspberryPi-3B in 32-bit mode):
===== gdbbug.c
#include <sys/types.h>
#include <sys/mman.h>

int
main(int argc, char *argv[])
{
    int *addr = mmap(0, 4096, PROT_EXEC|PROT_WRITE|PROT_READ,
	MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    *addr = 0xe24dd004;  // sub sp,sp,#4
    return 0;
}
===== end gdbbug.c
$ uname -a
Linux host.domain 4.14.5-300.fc27.armv7hl #1 SMP Mon Dec 11 17:29:37 UTC 2017 armv7l armv7l armv7l GNU/Linux
$ gcc --version
gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
$ gcc -g -o gdbbug gdbbug.c

$ gdb gdbbug
GNU gdb (GDB) 8.0.50.20171216-git
   <<snip>>
(gdb) b main
Breakpoint 1 at 0x10418: file gdbbug.c, line 7.
(gdb) run
Starting program: /path/to/gdbbug 
Cannot parse expression `.L1199 4@r4'.
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.


Breakpoint 1, main (argc=0x1, argv=0xbefff464) at gdbbug.c:7
7	    int *addr = mmap(0, 4096, PROT_EXEC|PROT_WRITE|PROT_READ,
(gdb) n
9	    *addr = 0xe24dd004;  // sub sp,sp,#4
(gdb) n
10	    return 0;

(gdb) x/i $pc  ## current value
=> 0x10450 <main+76>:	mov	r3, #0
(gdb) x/i addr   ## mmap()ed region
   0xb6ffa000:	sub	sp, sp, #4
(gdb) set $pc = $_   ## attempt to set $pc; no complaint
(gdb) x/i $pc   ## but value did not change
=> 0x1043c <main+56>:	str	r0, [r11, #-8]
(gdb) set $pc = 0xb6ffa000   ## stronger attempt to set $pc
Attempt to assign to an unmodifiable value.   ## very strange
(gdb) x/i $pc   ## value did not change
=> 0x1043c <main+56>:	str	r0, [r11, #-8]
(gdb)
=====

gdb was built from git tip:
=====
$ git log
commit 09da3ecf04d75084ea7d9c43e3cc0b18b2443ea3 (HEAD -> master, origin/master, origin/HEAD)
Author: GDB Administrator <gdbadmin@sourceware.org>
Date:   Sat Dec 16 00:00:33 2017 +0000

    Automatic date update in version.in
=====


A preliminary version of this bugzilla report was filed as 
https://bugzilla.redhat.com/show_bug.cgi?id=1526617