On Wed, Nov 14, 2012 at 5:26 AM, Alexander Ivchenko <aivch...@gmail.com> wrote:
> By default in Android we always compile with -fpic or -fPIC, even when
> compiling executable. Because of that we have some test fails on
> Android:
>
> For example:
> gcc/testsuite/gcc.target/i386/pr47312.c
> /* { dg-do run } */
> /* { dg-options "-O2" } */
>
> void exit (int);
> void noreturn_autodetection_failed ();
> __attribute__ ((noinline))
> detect_noreturn ()
> {
>   exit (0);
> }
> int
> main (void)
> {
>   detect_noreturn ();
>   noreturn_autodetection_failed ();
>   return 0;
> }
>
> If gcc knew, that we are not going to make a shared library (which is
> implied if we are using pic option), then it would delete the call of
> noreturn_autodetection_failed as a dead code. But in case of pic we
> cannot rely on the fact that detect_noreturn () will not be
> overwritten on runtime, eventhough we are compiling executable and
> that will never happen! So in addition to several testfails, it seems
> that we are losing an optimization opportunity here also.
> I'm wondering, maybe we can use -fpie instead of -fpic by default in
> the compiler (of course if there are no -shared or -c options; those
> cases will mean that we cannot rely on the fact that we will have an
> executable after linking)? It seems that it would solve the problem..
> Of course we always can add something like { target nonpic } to all

We should add  { target nonpic } independent of Android.

> tests that fail on Android, but probably the problem is deeper than
> that and that would be only hiding our head in the sand.

Using -fPIE to compile executables is a good idea.

-- 
H.J.

Reply via email to