[build] Move ENABLE_EXECUTE_STACK to toplevel libgcc
Paolo Bonzini
bonzini@gnu.org
Fri Jun 3 16:01:00 GMT 2011
On 06/03/2011 05:45 PM, Rainer Orth wrote:
> Paolo Bonzini<bonzini@gnu.org> writes:
>
>>> >> Seems like a plan, but I didn't go in this direction since I couldn't
>>> >> test anything like this.
>> >
>> > As long as you test the general configury on 1-2 platforms, it's not any
>> > less tested than what you have now.
> Unfortunately, that's not true: my original patch just moved the
> existing ENABLE_EXECUTE_STACK definitions to new headers in libgcc and
> used them as is. The revised one below consolidates them into two new
> files, only one of them has been tested so far.
Yes, I wasn't expecting to go to this length. But thanks for doing it.
>>> >> One other caveat: I don't know if I like grouping the configure support
>>> >> for the enable-execute-stack.c variants together or would rather keep
>>> >> all configuration for a single platform (or OS) together. Probably a
>>> >> matter of taste.
>> >
>> > In case it wasn't clear, I was proposing the latter.
> I suppose you mean the former, i.e. grouping them together and not
> setting enable_execute_stack in the existing host cases?
I meant doing it in config.host, because I was expecting you to keep all
implementations in separate *.c files, even for all the mprotect
variants, but I agree your patch is better.
> Will do when I submit the final patch. Right now, I've got a plan and a
> draft where I'm looking for comments.
Makes sense.
> * Except for Darwin, the code uses TRAMPOLINE_SIZE. This only exists in
> the backend headers. While it could be duplicated somewhere in the
> libgcc configury, I'd rather propose that gcc define
> __TRAMPOLINE_SIZE__ (in gcc/c-family/c-cppbuiltin.c (c_cpp_builtins)
> to avoid this. On PowerPC Darwin, one cannot use TRAMPOLINE_SIZE
> definition right now since the macro calls the rs6000_trampoline_size
> function in rs6000/rs6000.c. This would be solved nicely by
> __TRAMPOLINE_SIZE__.
Good idea.
> * FreeBSD and Solaris use a check_enabling function to check if
> __enable_execute_stack needs to run at all. Initially, I had
> enable-execute-stack-{freebsd, netbsd, sol2}.c, all including a common
> enable-execute-stack-mprotect.c to avoid code duplication. I now
> consider that ugly and hard to read, and merged everything into a
> common enable-execute-stack-mprotect.c below. Right now, the file
> uses __FreeBSD__, __NetBSD__, and __sun__&& __svr4__ to select the
> right code, but this could be autoconf'ed if desired. There are a
> couple of FIXME comments in the code.
Please avoid putting the ((constructor)) in common code. You can put
static int i = 1;
in the #else case, and leave
static int i;
in common code.
> * NetBSD is extremely careful to avoid namespace pollution and uses
> private __sysctl (declared privately) to avoid using getpagesize.
> Either this is an issue, and we might do something similar on all
> platforms, or it's not and we should avoid special-casing NetBSD
> here.
Perhaps it has to do with getpagesize not being available for old
versions of NetBSD. No idea, but I'd leave it as is.
> * FreeBSD uses the unmodified address passed to __enable_execute_stack
> to call mprocted, while all others round both address and size to a
> pagesize boundary. I cannot imagine that FreeBSD supports
> byte-granularity mprotect, so this seems an oversight.
Agreed.
> * Windows32 calls abort when VirtualProtect fails. With the exception
> of Darwin and NetBSD, all others call perror, which seems to be
> frowned upon. We should be consistent here.
I think it should either abort() or do nothing, consistently across all
platforms.
> * gcc/config/i386/mingw32.h has
>
> #ifdef IN_LIBGCC2
> #include<windows.h>
> #endif
>
> I strongly suspect that this is only to declare VirtualQuery and
> VirtualProtect and can go if ENABLE_EXECUTE_STACK is removed?
Yes, it should go.
> * Finally, __enable_execute_stack is only used on those NetBSD targets
> that actually define HAVE_ENABLE_EXECUTE_STACK, while OpenBSD uses it
> everywhere. config.host could be simplyfied if NetBSD behaved the
> same.
I would add it to all NetBSDs, and perhaps all FreeBSDs too? Do you
know why SPARC is special?
Paolo
More information about the Gcc-patches
mailing list