On 11/10/18 14:34, Christophe Lyon wrote: > In FDPIC mode, we set -fPIE unless the user provides -fno-PIE, -fpie, > -fPIC or -fpic: indeed FDPIC code is PIC, but we want to generate code > for executables rather than shared libraries by default. > > We also make sure to use the --fdpic assembler option, and select the > appropriate linker emulation. > > At link time, we also default to -pie, unless we are generating a > shared library or a relocatable file (-r). Note that even for static > link, we must specify the dynamic linker because the executable still > has to relocate itself at startup. > > We also force 'now' binding since lazy binding is not supported. > > We should also apply the same behavior for -Wl,-Ur as for -r, but I > couldn't find how to describe that in the specs fragment. > > 2018-XX-XX Christophe Lyon <christophe.l...@st.com> > Mickaël Guêné <mickael.gu...@st.com> > > gcc/ > * config.gcc: Handle arm*-*-uclinuxfdpiceabi. > * config/arm/bpabi.h (TARGET_FDPIC_ASM_SPEC): New. > (SUBTARGET_EXTRA_ASM_SPEC): Use TARGET_FDPIC_ASM_SPEC. > * config/arm/linux-eabi.h (FDPIC_CC1_SPEC): New. > (CC1_SPEC): Use FDPIC_CC1_SPEC. > * config/arm/uclinuxfdpiceabi.h: New file. > > libsanitizer/ > * configure.tgt (arm*-*-uclinuxfdpiceabi): Sanitizers are > unsupported in this configuration.
The documentation (in patch 1) seems to imply that -mfdpic is available in all configurations and has certain effects (such as enabling -fPIE), but this patch set suggests that such behaviours are only available when the compiler is configured explicitly for an fdpic target. I think this needs to be resolved. Either -mfdpic works everywhere, or the option should only be available when configured for -mfdpic. R. > > Change-Id: If369e0a10bb916fd72e38f71498d3c640fa85c4c > > diff --git a/gcc/config.gcc b/gcc/config.gcc > index 793fc69..a4f4331 100644 > --- a/gcc/config.gcc > +++ b/gcc/config.gcc > @@ -1144,6 +1144,11 @@ arm*-*-linux-* | arm*-*-uclinuxfdpiceabi) > # ARM GNU/Linux with ELF > esac > tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi > arm/t-linux-eabi" > tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h" > + case $target in > + arm*-*-uclinuxfdpiceabi) > + tm_file="$tm_file arm/uclinuxfdpiceabi.h" > + ;; > + esac > # Generation of floating-point instructions requires at least ARMv5te. > if [ "$with_float" = "hard" -o "$with_float" = "softfp" ] ; then > target_cpu_cname="arm10e" > diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h > index 1e3ecfb..5901154 100644 > --- a/gcc/config/arm/bpabi.h > +++ b/gcc/config/arm/bpabi.h > @@ -55,6 +55,8 @@ > #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\ > "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}" > > +#define TARGET_FDPIC_ASM_SPEC "" > + > #define BE8_LINK_SPEC > \ > "%{!r:%{!mbe32:%:be8_linkopt(%{mlittle-endian:little}" \ > " %{mbig-endian:big}" \ > @@ -64,7 +66,7 @@ > /* Tell the assembler to build BPABI binaries. */ > #undef SUBTARGET_EXTRA_ASM_SPEC > #define SUBTARGET_EXTRA_ASM_SPEC \ > - "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC > + "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC > TARGET_FDPIC_ASM_SPEC > > #ifndef SUBTARGET_EXTRA_LINK_SPEC > #define SUBTARGET_EXTRA_LINK_SPEC "" > diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h > index 8585fde..4cee958 100644 > --- a/gcc/config/arm/linux-eabi.h > +++ b/gcc/config/arm/linux-eabi.h > @@ -98,11 +98,14 @@ > #undef ASAN_CC1_SPEC > #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}" > > +#define FDPIC_CC1_SPEC "" > + > #undef CC1_SPEC > #define CC1_SPEC \ > - LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC, \ > + LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " > \ > + FDPIC_CC1_SPEC, \ > GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " " \ > - ANDROID_CC1_SPEC) > + ANDROID_CC1_SPEC "" FDPIC_CC1_SPEC) > > #define CC1PLUS_SPEC \ > LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC) > diff --git a/gcc/config/arm/uclinuxfdpiceabi.h > b/gcc/config/arm/uclinuxfdpiceabi.h > new file mode 100644 > index 0000000..43a17de > --- /dev/null > +++ b/gcc/config/arm/uclinuxfdpiceabi.h > @@ -0,0 +1,53 @@ > +/* Configuration file for ARM GNU/Linux FDPIC EABI targets. > + Copyright (C) 2018 Free Software Foundation, Inc. > + Contributed by STMicroelectronics. > + > + This file is part of GCC. > + > + GCC is free software; you can redistribute it and/or modify it > + under the terms of the GNU General Public License as published > + by the Free Software Foundation; either version 3, or (at your > + option) any later version. > + > + GCC is distributed in the hope that it will be useful, but WITHOUT > + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public > + License for more details. > + > + You should have received a copy of the GNU General Public License > + along with GCC; see the file COPYING3. If not see > + <http://www.gnu.org/licenses/>. */ > + > +/* On uClibc EABI GNU/Linux, we want to force -mfdpic by default, > + which also means we produce PIE code by default. */ > +#undef FDPIC_CC1_SPEC > +#define FDPIC_CC1_SPEC \ > + "%{!mno-fdpic:-mfdpic %{!no-PIE:%{!fpie:%{!fPIC:%{!fpic: -fPIE}}}}}" > + > +/* Add --fdpic assembler flag by default. */ > +#undef TARGET_FDPIC_ASM_SPEC > +#define TARGET_FDPIC_ASM_SPEC "%{!mno-fdpic: --fdpic}" > + > +/* TARGET_BIG_ENDIAN_DEFAULT is set in > + config.gcc for big endian configurations. */ > +#if TARGET_BIG_ENDIAN_DEFAULT > +#define TARGET_FDPIC_LINKER_EMULATION "armelfb_linux_fdpiceabi" > +#else > +#define TARGET_FDPIC_LINKER_EMULATION "armelf_linux_fdpiceabi" > +#endif > + > +/* Unless we generate a shared library or a relocatable object, we > + force -pie. */ > +/* Even with -static, we have to define the dynamic-linker, as we > + have some relocations to resolve at load time. */ > +#undef SUBTARGET_EXTRA_LINK_SPEC > +#define SUBTARGET_EXTRA_LINK_SPEC \ > + "%{!mno-fdpic: -m " TARGET_FDPIC_LINKER_EMULATION \ > + "%{!shared:%{!r: -pie}} \ > + %{static:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" \ > + "%{mno-fdpic: -m " TARGET_LINKER_EMULATION "}" \ > + "%{!r:%{!mno-fdpic: -z now}}" > + > +#undef STARTFILE_SPEC > +#define STARTFILE_SPEC "%{!mno-fdpic:%{!shared:crtreloc.o%s}} " \ > + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, > ANDROID_STARTFILE_SPEC) > diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt > index 1dce1e6..dff34cd 100644 > --- a/libsanitizer/configure.tgt > +++ b/libsanitizer/configure.tgt > @@ -43,6 +43,9 @@ case "${target}" in > ;; > s390*-*-linux*) > ;; > + arm*-*-uclinuxfdpiceabi) > + UNSUPPORTED=1 > + ;; > arm*-*-linux*) > ;; > mips*64*-*-linux*) >