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*)
> 

Reply via email to