On Wed, Mar 18, 2015 at 6:24 AM, Ilya Enkovich <enkovich....@gmail.com> wrote: > 2015-03-18 15:42 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: >> On Wed, Mar 18, 2015 at 1:25 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> On Wed, Mar 18, 2015 at 5:13 AM, Ilya Enkovich <enkovich....@gmail.com> >>> wrote: >>>> 2015-03-18 15:08 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>: >>>>> On Wed, Mar 18, 2015 at 5:05 AM, Ilya Enkovich <enkovich....@gmail.com> >>>>> wrote: >>>>>> 2015-03-18 15:02 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>: >>>>>>> On Wed, Mar 18, 2015 at 4:56 AM, Ilya Enkovich <enkovich....@gmail.com> >>>>>>> wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> This patch fixes PR target/65444 by passing '-z bndplt' to linker when >>>>>>>> appropriate. Bootstrapped and tested on x86_64-unknown-linux-gnu. >>>>>>>> Will commit it to trunk in a couple of days if no objections arise. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Ilya >>>>>>>> -- >>>>>>>> gcc/ >>>>>>>> >>>>>>>> 2015-03-18 Ilya Enkovich <ilya.enkov...@intel.com> >>>>>>>> >>>>>>>> PR driver/65444 >>>>>>>> * config/i386/linux-common.h (MPX_SPEC): New. >>>>>>>> (CHKP_SPEC): Add MPX_SPEC. >>>>>>>> >>>>>>>> libmpx/ >>>>>>>> >>>>>>>> 2015-03-18 Ilya Enkovich <ilya.enkov...@intel.com> >>>>>>>> >>>>>>>> PR driver/65444 >>>>>>>> * configure.ac: Add check for '-z bndplt' support >>>>>>>> by linker. Add link_mpx output variable. >>>>>>>> * libmpx.spec.in (link_mpx): New. >>>>>>>> * configure: Regenerate. >>>>>>>> >>>>>>>> >>>>>>>> diff --git a/gcc/config/i386/linux-common.h >>>>>>>> b/gcc/config/i386/linux-common.h >>>>>>>> index 9c6560b..dd79ec6 100644 >>>>>>>> --- a/gcc/config/i386/linux-common.h >>>>>>>> +++ b/gcc/config/i386/linux-common.h >>>>>>>> @@ -59,6 +59,11 @@ along with GCC; see the file COPYING3. If not see >>>>>>>> %:include(libmpx.spec)%(link_libmpx)" >>>>>>>> #endif >>>>>>>> >>>>>>>> +#ifndef MPX_SPEC >>>>>>>> +#define MPX_SPEC "\ >>>>>>>> + >>>>>>>> %{mmpx:%{fcheck-pointer-bounds:%{!static:%:include(libmpx.spec)%(link_mpx)}}}" >>>>>>>> +#endif >>>>>>>> + >>>>>>>> #ifndef LIBMPX_SPEC >>>>>>>> #if defined(HAVE_LD_STATIC_DYNAMIC) >>>>>>>> #define LIBMPX_SPEC "\ >>>>>>>> @@ -89,5 +94,5 @@ along with GCC; see the file COPYING3. If not see >>>>>>>> >>>>>>>> #ifndef CHKP_SPEC >>>>>>>> #define CHKP_SPEC "\ >>>>>>>> -%{!nostdlib:%{!nodefaultlibs:" LIBMPX_SPEC LIBMPXWRAPPERS_SPEC "}}" >>>>>>>> +%{!nostdlib:%{!nodefaultlibs:" LIBMPX_SPEC LIBMPXWRAPPERS_SPEC "}}" >>>>>>>> MPX_SPEC >>>>>>>> #endif >>>>>>>> diff --git a/libmpx/configure.ac b/libmpx/configure.ac >>>>>>>> index fe0d3f2..3f8b50f 100644 >>>>>>>> --- a/libmpx/configure.ac >>>>>>>> +++ b/libmpx/configure.ac >>>>>>>> @@ -40,7 +40,18 @@ AC_MSG_RESULT($LIBMPX_SUPPORTED) >>>>>>>> AM_CONDITIONAL(LIBMPX_SUPPORTED, [test "x$LIBMPX_SUPPORTED" = "xyes"]) >>>>>>>> >>>>>>>> link_libmpx="-lpthread" >>>>>>>> +link_mpx="" >>>>>>>> +AC_MSG_CHECKING([whether ld accepts -z bndplt]) >>>>>>>> +echo "int main() {};" > conftest.c >>>>>>>> +if AC_TRY_COMMAND([${CC} ${CFLAGS} -Wl,-z,bndplt -o conftest >>>>>>>> conftest.c 1>&AS_MESSAGE_LOG_FD]) >>>>>>>> +then >>>>>>>> + AC_MSG_RESULT([yes]) >>>>>>>> + link_mpx="$link_mpx -z bndplt" >>>>>>>> +else >>>>>>>> + AC_MSG_RESULT([no]) >>>>>>>> +fi >>>>>>>> AC_SUBST(link_libmpx) >>>>>>>> +AC_SUBST(link_mpx) >>>>>>>> >>>>>>> >>>>>>> Without -z bndplt, MPX won't work correctly. We should always pass -z >>>>>>> bndplt >>>>>>> to linker. If linker doesn't support it, ld will issue a warning, not >>>>>>> error and users >>>>>>> will know their linker is too old. When they update linker, they don't >>>>>>> have to >>>>>>> rebuild GCC. >>>>>> >>>>>> If ld issues a warning instead of an error, then configure test passes >>>>>> and we pass '-z bndplt' to linker. >>>>>> >>>>> >>>>> Can you verify it with an older linker? The unknown XXX in -z XXX is >>>>> always >>>>> warned and ignored in Linux linker. If testing it on Linux always passes, >>>>> it is useless. >>>> >>>> Old ld issues a warning: >>>> >>>> ld: warning: -z bndplt ignored. >>> >>> Does configure test pass? >>> >>>> But gold issues an error: >>>> >>>> ld.gold: bndplt: unknown -z option >>>> ld.gold: use the --help option for usage information >>> >>> If gold is used, MPX won't work. What should we do here? >>> Should we hardcode -fuse-ld=bfd for MPX? >> >> Is MPX disabled when the host linker is gold and gld isn't available? > > No. You may use MPX with gold and old ld but you would loose passed > bounds when make a call via plt. >
If gold is default linker, the configure test will fail and we never pass -z bndplt to linker even if ld.bfd is available and ld.gold is fixed later. I'd rather always pass -z bndplt to ld. -- H.J.