This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH][revised] fix PR sanitizer/55617
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Jack Howarth <howarth at bromo dot med dot uc dot edu>
- Cc: gcc-patches at gcc dot gnu dot org, jakub at redhat dot com, dodji at redhat dot com, kcc at google dot com, dvyukov at google dot com, glidergoogle dot com at bromo dot med dot uc dot edu, mikestump at comcast dot net, iain at codesourcery dot com
- Date: Mon, 4 Feb 2013 10:26:44 +0100
- Subject: Re: [PATCH][revised] fix PR sanitizer/55617
- References: <20130203202522.GA16751@bromo.med.uc.edu>
On Sun, Feb 3, 2013 at 9:25 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote:
> Currently darwin is unable to utilize libasan with constructors due to the lack of
> constructor priority support on that target. The asan_finish_file routine inserts an
> essential __asan_init into the array of constructors (via the __mod_init_func section).
> However the insertion occurs at the end, and due to the lack of priority support for
> constructors, these are executed from the start of the array of constructors on program
> startup. This causes code any instrumented code that executes before the __asan_init
> call to crash.
> Since darwin sets...
>
> #undef SUPPORTS_INIT_PRIORITY
> #define SUPPORTS_INIT_PRIORITY 0
>
> in gcc/config/darwin.h, all constructors are automatically set to
>
> #define DEFAULT_INIT_PRIORITY 65535
>
> in gcc/collect2.c. Any code that attempts to set the constructor/destructor priority
> on darwin results in a compile time error of "constructor priorities are not supported".
> So asan alone should be unique in emitting priorities different from 65535 on darwin.
> The attached patch uses a va_gc vector of constructor symbol/priority records to queue
> this data as it is generated in calls to machopic_asm_out_constructor. Any instances of
> the static constructor with priority MAX_RESERVED_INIT_PRIORITY-1 emitted by asan are
> inserted safely in the front of the vector queue which retains the original order of the
> remaining constructors in the queue. The contents of the vector queue are later processed
> in a new finalize_ctors routine called from darwin_file_end if necessary. The patch also
> adds a g++.dg/asan/pr55617.C test case which is targeted to i?86-*-darwin* and x86_64-*-darwin*.
> The patch reduces the failures observed when running....
>
> make -k check-g++ RUNTESTFLAGS="--target_board=unix'{-fsanitize=address}'"
>
> from 323 to only 85 on darwin (similar to the results on linux). The cov.C testcase also
> fails on gcc trunk with -fsanitize=address when recrafted into a dynamic shared library
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55617#c28. This patch eliminates those
> crashes. This problem doesn't extend to when the shared library or module is dlopen'd
> (which works in stock gcc trunk and with this patch as well).
> The patch has been bootstrap and regression tested on x86_64-apple-darwin12.
> Okay for gcc trunk?
See my other reply - this does not work for multiple TUs.
Richard.
> Jack
> ps Unfortunately the flag_sort variable is unavailable inside of machopic_asm_out_constructor
> so we have to unconditionally test for priority == MAX_RESERVED_INIT_PRIORITY - 1.
>