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 <[email protected]>
> Mickaël Guêné <[email protected]>
>
> 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*)
>