On Fri, 12 Oct 2018 at 12:01, Richard Earnshaw (lists) < richard.earns...@arm.com> wrote:
> 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. > > You are right, this is not clear. I tried to follow what other fdpic targets do, but it's not consistent either, it seems. So, at present, -mfdpic alone is in general not sufficient, and the user has to use -fpic/-fPIC/-fpie/-fPIE as needed. When configured for arm-uclinuxfdpiceabi, this is done implicitly (thanks to this patch). One possibility is to rephrase the doc, and say that -fPIE is only implied when GCC is configured for arm-uclinuxfdpiceabi. Do you mean to also make -mfdpic non-existent/rejected when GCC is not configured for arm-uclinuxfdpiceabi? How to achieve that? 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*) > > > >