On Fri, Feb 09, 2018 at 11:38:47 +0100, Martin Husemann wrote: > On Fri, Feb 09, 2018 at 11:23:17AM +0100, Maxime Villard wrote: > > > When I spotted this several months ago (while developing Live > > Kernel ASLR), I tried to look for GCC options that say "optimize > > with -O2, but keep the stack trace intact". I couldn't find one, > > and the only thing I ended up doing was disabling -O2 in the > > makefiles. > > -fno-omit-frame-pointer?
That won't help. `-O' also turns on `-fomit-frame-pointer' on machines where doing so does not interfere with debugging. so it's not turned off in the first place. The problem is that some of the later optimization passes may push frame pointer setup to some place later in function. E.g. on -7 void kernfs_get_rrootdev(void) { static int tried = 0; if (tried) { /* Already did it once. */ return; } tried = 1; if (rootdev == NODEV) return; rrootdev = devsw_blk2chr(rootdev); if (rrootdev != NODEV) return; rrootdev = NODEV; printf("kernfs_get_rrootdev: no raw root device\n"); } is compiled to c068f81b <kernfs_get_rrootdev>: c068f81b: mov 0xc0fc6b40,%eax c068f820: test %eax,%eax c068f822: jne c068f867 <kernfs_get_rrootdev+0x4c> c068f824: movl $0x1,0xc0fc6b40 c068f82e: mov 0xc0fde0b8,%edx c068f834: mov 0xc0fde0bc,%eax c068f839: mov %edx,%ecx c068f83b: and %eax,%ecx c068f83d: cmp $0xffffffff,%ecx c068f840: je c068f867 <kernfs_get_rrootdev+0x4c> -> c068f842: push %ebp -> c068f843: mov %esp,%ebp c068f845: sub $0x8,%esp c068f848: mov %edx,(%esp) c068f84b: mov %eax,0x4(%esp) c068f84f: call c091ce52 <devsw_blk2chr> So the "tried" check and the first "rootdev" check happen before the frame pointer is set up. -uwe