public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Ian Lance Taylor <iant@google.com>
To: mathieu lacage <mathieu.lacage@cutebugs.net>
Cc: gcc-help@gcc.gnu.org
Subject: Re: using -fsplit-stack
Date: Fri, 30 Nov 2012 15:16:00 -0000	[thread overview]
Message-ID: <CAKOQZ8zfQduU2kov63P_=PPabcj7PPQPo6fxORAr2Ycd3OuktA@mail.gmail.com> (raw)
In-Reply-To: <1354284795.6211.28.camel@mathieu-UX21E>

On Fri, Nov 30, 2012 at 6:13 AM, mathieu lacage
<mathieu.lacage@cutebugs.net> wrote:
>
> $ gcc -fsplit-stack ./test.c -o test
> $ ./test
> hello 0x7fbecfd58960
> Segmentation fault (core dumped)

You neglected to say which version of GCC you are using.

I tried your test case with both GCC mainline and the GCC 4.7 branch,
and it worked fine.  But I am using the gold linker, not GNU ld.


> Obviously, the same test will also segfault without -fsplit-stack but
> now, it segfaults with an interesting backtrace:

I don't really see why this test will segfault without using
-fsplit-stack.  For me it works fine without -fsplit-stack, which is
what I would expect.


> Program received signal SIGSEGV, Segmentation fault.
> 0x00007ffff7de3af5 in do_lookup_x (new_hash=2090266759,
> old_hash=0x7ffff6e7b110, result=0x7ffff6e7b0e0, scope=0x7ffff7ffe5a0,
> i=0, flags=1,
>     skip=0x0, undef_map=0x7ffff7ffa9a8) at dl-lookup.c:82
> 82      dl-lookup.c: No such file or directory.
> (gdb) bt
> #0  0x00007ffff7de3af5 in do_lookup_x (new_hash=2090266759,
> old_hash=0x7ffff6e7b110, result=0x7ffff6e7b0e0, scope=0x7ffff7ffe5a0,
> i=0, flags=1,
>     skip=0x0, undef_map=0x7ffff7ffa9a8) at dl-lookup.c:82
> #1  0x00007ffff7de4533 in _dl_lookup_symbol_x (undef_name=0x7ffff7816f25
> "free", undef_map=0x7ffff7ffa9a8, ref=0x7ffff6e7b170,
>     symbol_scope=0x7ffff7ffad00, version=0x7ffff7fd9180, type_class=1,
> flags=1, skip_map=0x0) at dl-lookup.c:739
> #2  0x00007ffff7de8784 in _dl_fixup (l=<optimized out>,
> reloc_arg=<optimized out>) at ../elf/dl-runtime.c:119
> '#3  0x00007ffff7def245 in _dl_runtime_resolve ()
> at ../sysdeps/x86_64/dl-trampoline.S:42
> #4  0x00007ffff784dac4 in _IO_vfprintf_internal (s=<optimized out>,
> format=<optimized out>, ap=<optimized out>) at vfprintf.c:2052
> #5  0x00007ffff78588d9 in __printf (format=<optimized out>) at
> printf.c:35
> #6  0x0000000000400d21 in main ()
>
> It looks like printf cannot find free anymore. Strange.

That is a crash inside the dynamic linker.  I'm not sure why it happened.


> 1) I have disassembled the generated code and I see one symbol that
> appears to be related to this:__morestack
> Is there documentation somewhere on the exact semantics that is supposed
> to be provided by this function ? Are there other functions that the
> stack-split code will potentially call ?

The detailed documentation on that internal function are in the source
code.  libgcc/config/i386/morestack.S.

That function and __morestack_non_split are the only ones that your
application will call directly.  There are various other functions
involved that are called, directly or indirectly, by __morestack.

> 2) What is the story about interaction with code that is not compiled
> with stack-split code ? i.e., can I call non-stack-split code from
> stack-split code and vice-versa ?

Yes, provided you are using gold.

> gold -lc ./test.o -o test
> gold: error: ./test.o: could not convert call to '__morestack' to
> '__morestack_non_split'
> ./test.o:test.c:function main: error: undefined reference to
> '__morestack'

You neglected to say which version of gold you are using.  In any
case, note that you should not invoke gold directly.  You should
arrange for the GCC driver to invoke it on your behalf.  Otherwise you
won't get the right files.  The way to do this is to install gold
under the name "ld" in some directory DIR, and pass the option -BDIR
to gcc.  You can use gcc -Wl,-debug to see precisely which linker gcc
is running, and make sure that it is gold and not GNU ld.

> But, anyway, I can't see how that link-time code change would work for
> libraries. Say, binary A links to B and C. A and B  are stack-split. C
> is not. What is the linker going to do ?.

The linker adjusts the code on a function by function basis, based on
whether the function calls a non-split-stack function or not.  The
general scheme is outlined on the wiki page:
http://gcc.gnu.org/wiki/SplitStacks .

> What happens at runtime ? Does the loader perform a similar check ? (if
> so, which loader/version ?

The loader does not know anything about split stacks, and it doesn't
need to know.

> 3) gdb: Does gcc generate the right kind of dwarf information for gdb to
> understand how to unwind a stack-split stack ?

Yes.


> 4) Any data on CPU/memory performance for using -fsplit-stack ? i.e.,
> what would be the downsides of compiling everything with this feature
> on ?

I don't have any precise measurements.  The cost of code that does not
split the stack is low: a few additional instructions per function
call.  This is unlikely to make any difference except perhaps in a
program that is heavily CPU bound and makes lots of function calls in
tight loops.  However, actually splitting the stack is relatively
expensive because it requires a couple of system calls.  That can add
up pretty quickly if you have a tight loop that winds up needing to
split the stack to an unfortunate coincidence of available stack space
and the stack requirements of the function being called.

Ian

  reply	other threads:[~2012-11-30 15:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-30 14:13 mathieu lacage
2012-11-30 15:16 ` Ian Lance Taylor [this message]
2012-11-30 21:10   ` mathieu lacage
     [not found]     ` <CAKOQZ8yQj3pM6j2gcY7U7SGXd2u9UE8aEqP2ta3wNHKSp5Gvzw@mail.gmail.com>
2012-12-01  7:50       ` mathieu lacage

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAKOQZ8zfQduU2kov63P_=PPabcj7PPQPo6fxORAr2Ycd3OuktA@mail.gmail.com' \
    --to=iant@google.com \
    --cc=gcc-help@gcc.gnu.org \
    --cc=mathieu.lacage@cutebugs.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).