tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: gcc: optimizations, and stack traces



Le 09/02/2018 à 12:08, Valery Ushakov a écrit :
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>

Yes, exactly. -fno-omit-frame-pointer doesn't change anything here, GCC
does not omit the frame pointer but moves the instructions a little later
in the function.

So we need to find a say to keep the two instructions at the beginning...

Maxime


Home | Main Index | Thread Index | Old Index