123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- From d7eb73163bcea31168c438fc132a0967ac172e3d Mon Sep 17 00:00:00 2001
- From: Max Filippov <jcmvbkbc@gmail.com>
- Date: Thu, 7 May 2020 21:11:43 -0700
- Subject: [PATCH] elf2flt.c: add new relocation types for xtensa
- Xtensa have added new relocation types R_XTENSA_[NP]DIFF{8,16,32} with
- the same properties as the existing types R_XTENSA_DIFF{8,16,32}.
- Add them to the list of ignored relocation types.
- This fixes the following error when invoking elf2flt on xtensa binaries
- built with the recent binutils:
- ERROR: reloc type R_XTENSA_PDIFF32 unsupported in this context
- Reported-by: Romain Naour <romain.naour@gmail.com>
- Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
- Backported from: d7eb73163bcea31168c438fc132a0967ac172e3d
- ---
- Makefile.in | 3 ++-
- configure | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++
- configure.ac | 14 ++++++++++++
- elf2flt.c | 8 +++++++
- 4 files changed, 88 insertions(+), 1 deletion(-)
- diff --git a/Makefile.in b/Makefile.in
- index 52b3347d7f43..0529c7f0a25a 100644
- --- a/Makefile.in
- +++ b/Makefile.in
- @@ -30,7 +30,8 @@ DEFS = @DEFS@ \
- -DNO_GOT_CHECK=@got_check@ \
- -DUSE_EMIT_RELOCS=@emit_relocs@ \
- -DEMIT_CTOR_DTOR=@emit_ctor_dtor@ \
- - -DALWAYS_RELOC_TEXT=@always_reloc_text@
- + -DALWAYS_RELOC_TEXT=@always_reloc_text@ \
- + -DHAVE_BFD_XTENSA_PDIFF_RELOCS=@HAVE_BFD_XTENSA_PDIFF_RELOCS@
- EXEEXT = @EXEEXT@
- OBJEXT = @OBJEXT@
-
- diff --git a/configure b/configure
- index bb8e33f9cb28..bca38c34247e 100755
- --- a/configure
- +++ b/configure
- @@ -621,6 +621,7 @@ ac_includes_default="\
-
- ac_subst_vars='LTLIBOBJS
- LIBOBJS
- +HAVE_BFD_XTENSA_PDIFF_RELOCS
- SYMBOL_PREFIX
- always_reloc_text
- emit_ctor_dtor
- @@ -1729,6 +1730,52 @@ fi
-
- } # ac_fn_c_try_link
-
- +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
- +# ---------------------------------------------
- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
- +# accordingly.
- +ac_fn_c_check_decl ()
- +{
- + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- + as_decl_name=`echo $2|sed 's/ *(.*//'`
- + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
- +$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
- +if eval \${$3+:} false; then :
- + $as_echo_n "(cached) " >&6
- +else
- + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- +/* end confdefs.h. */
- +$4
- +int
- +main ()
- +{
- +#ifndef $as_decl_name
- +#ifdef __cplusplus
- + (void) $as_decl_use;
- +#else
- + (void) $as_decl_name;
- +#endif
- +#endif
- +
- + ;
- + return 0;
- +}
- +_ACEOF
- +if ac_fn_c_try_compile "$LINENO"; then :
- + eval "$3=yes"
- +else
- + eval "$3=no"
- +fi
- +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- +fi
- +eval ac_res=\$$3
- + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- +$as_echo "$ac_res" >&6; }
- + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- +
- +} # ac_fn_c_check_decl
- +
- # ac_fn_c_check_func LINENO FUNC VAR
- # ----------------------------------
- # Tests whether FUNC exists, setting the cache variable VAR accordingly
- @@ -4272,6 +4319,22 @@ $as_echo "#define const /**/" >>confdefs.h
- fi
-
-
- +HAVE_BFD_XTENSA_PDIFF_RELOCS=0
- +case $target in
- + xtensa*)
- + OLD_CPPFLAGS=$CPPFLAGS
- + CPPFLAGS="-I$bfd_include_dir -I$binutils_include_dir $CPPFLAGS"
- + ac_fn_c_check_decl "$LINENO" "R_XTENSA_PDIFF8" "ac_cv_have_decl_R_XTENSA_PDIFF8" "#include \"bfd.h\"
- + #include \"elf/xtensa.h\"
- +"
- +if test "x$ac_cv_have_decl_R_XTENSA_PDIFF8" = xyes; then :
- + HAVE_BFD_XTENSA_PDIFF_RELOCS=1
- +fi
- +
- + CPPFLAGS=$OLD_CPPFLAGS
- + ;;
- +esac
- +
- for ac_func in vprintf
- do :
- ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
- @@ -4333,6 +4396,7 @@ fi
-
-
-
- +
- ac_config_files="$ac_config_files ld-elf2flt.sh:ld-elf2flt.in Makefile elf2flt.ld"
-
- cat >confcache <<\_ACEOF
- diff --git a/configure.ac b/configure.ac
- index d6b4119eb18a..19969b1045f6 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -202,6 +202,19 @@ AC_CHECK_HEADERS(fcntl.h unistd.h bfd.h)
- dnl Checks for typedefs, structures, and compiler characteristics.
- AC_C_CONST
-
- +HAVE_BFD_XTENSA_PDIFF_RELOCS=0
- +case $target in
- + xtensa*)
- + AS_VAR_COPY([OLD_CPPFLAGS], [CPPFLAGS])
- + AS_VAR_SET([CPPFLAGS], ["-I$bfd_include_dir -I$binutils_include_dir $CPPFLAGS"])
- + AC_CHECK_DECL([R_XTENSA_PDIFF8],
- + [HAVE_BFD_XTENSA_PDIFF_RELOCS=1],,
- + [#include "bfd.h"
- + #include "elf/xtensa.h"])
- + AS_VAR_COPY([CPPFLAGS], [OLD_CPPFLAGS])
- + ;;
- +esac
- +
- dnl Checks for library functions.
- AC_FUNC_VPRINTF
-
- @@ -235,6 +248,7 @@ AC_SUBST(emit_relocs)
- AC_SUBST(emit_ctor_dtor)
- AC_SUBST(always_reloc_text)
- AC_SUBST(SYMBOL_PREFIX)
- +AC_SUBST(HAVE_BFD_XTENSA_PDIFF_RELOCS)
-
- AC_OUTPUT(ld-elf2flt.sh:ld-elf2flt.in Makefile elf2flt.ld)
-
- diff --git a/elf2flt.c b/elf2flt.c
- index b7c4a490df02..961534973f56 100644
- --- a/elf2flt.c
- +++ b/elf2flt.c
- @@ -776,6 +776,14 @@ output_relocs (
- case R_XTENSA_DIFF8:
- case R_XTENSA_DIFF16:
- case R_XTENSA_DIFF32:
- +#if HAVE_BFD_XTENSA_PDIFF_RELOCS
- + case R_XTENSA_PDIFF8:
- + case R_XTENSA_PDIFF16:
- + case R_XTENSA_PDIFF32:
- + case R_XTENSA_NDIFF8:
- + case R_XTENSA_NDIFF16:
- + case R_XTENSA_NDIFF32:
- +#endif
- case R_XTENSA_32_PCREL:
- continue;
- case R_XTENSA_32:
- --
- 2.20.1
|