initial buildroot for linux 5.15
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
From b31e9b1bff6832063816b972395179859d1d4619 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Sun, 13 Aug 2017 16:03:20 +0200
|
||||
Subject: [PATCH] ld-elf2flt: behave properly when called with a name different
|
||||
from TARGET_ALIAS
|
||||
|
||||
ld-elf2flt currently handles two cases:
|
||||
|
||||
1 It is called as the wrapper for <TARGET_ALIAS>-ld, generally
|
||||
installed in the bin/ directory of a toolchain.
|
||||
|
||||
2 It is called as the wrapper for "ld", generally installed in the
|
||||
TARGET_ALIAS/bin/ directory of a toolchain.
|
||||
|
||||
Unfortunately, if for some reason it gets called using a FOOBAR-ld
|
||||
name that is different from <TARGET_ALIAS>-ld, it assumes it is in
|
||||
case (2), while it really is in case (1). Due to this, the path
|
||||
mangling logic doesn't work, and it doesn't find ld.real.
|
||||
|
||||
This happens for example when the binary program in bin/ is named
|
||||
arm-buildroot-uclinux-uclibcgnueabi-ld, but also has a simpler symlink
|
||||
named arm-linux-ld. In this case,
|
||||
arm-buildroot-uclinux-uclibcgnueabi-ld is recognized by ld-elf2flt as
|
||||
containing TARGET_ALIAS, and therefore the proper logic to find
|
||||
ld.real is applied. However, when arm-linux-ld is used, ld-elf2flt
|
||||
doesn't find TARGET_ALIAS, and therefore assumes we're being called as
|
||||
TARGET_ALIAS/bin/ld.. and searches for a program called ld.real in
|
||||
bin/, which doesn't exist.
|
||||
|
||||
See:
|
||||
|
||||
$ ./output/host/bin/arm-buildroot-uclinux-uclibcgnueabi-ld
|
||||
/home/thomas/buildroot/buildroot/output/host/bin/../arm-buildroot-uclinux-uclibcgnueabi/bin/ld.real: no input files
|
||||
|
||||
$ ./output/host/bin/arm-linux-ld
|
||||
arm-linux-ld (ld-elf2flt): error trying to exec '/home/thomas/buildroot/buildroot/output/host/bin/ld.real': execvp: No such file or directory
|
||||
|
||||
$ ./output/host/arm-buildroot-uclinux-uclibcgnueabi/bin/ld
|
||||
/home/thomas/buildroot/buildroot/output/host/arm-buildroot-uclinux-uclibcgnueabi/bin/ld.real: no input files
|
||||
|
||||
This commit fixes that by inverting the logic: if we're being called
|
||||
as just "ld", then we assume it's the program in
|
||||
TARGET_ALIAS/bin/. Otherwise, we're called through some variant of
|
||||
TARGET-ld.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Submitted-upstream: https://github.com/uclinux-dev/elf2flt/pull/8
|
||||
---
|
||||
ld-elf2flt.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/ld-elf2flt.c b/ld-elf2flt.c
|
||||
index de39fe0..c187c2e 100644
|
||||
--- a/ld-elf2flt.c
|
||||
+++ b/ld-elf2flt.c
|
||||
@@ -506,15 +506,15 @@ int main(int argc, char *argv[])
|
||||
the host while those in <TARGET_ALIAS>/lib are for the target.
|
||||
Make bindir point to the bin dir for bin/<TARGET_ALIAS>-foo.
|
||||
Make tooldir point to the bin dir for <TARGET_ALIAS>/bin/foo. */
|
||||
- if (streqn(elf2flt_progname, TARGET_ALIAS)) {
|
||||
- tmp = concat(argv0_dir, "../" TARGET_ALIAS "/bin", NULL);
|
||||
+ if (streqn(elf2flt_progname, "ld")) {
|
||||
+ tmp = concat(argv0_dir, "../../bin", NULL);
|
||||
if (stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode)) {
|
||||
- tooldir = concat(tmp, "/", NULL);
|
||||
+ bindir = concat(tmp, "/", NULL);
|
||||
}
|
||||
} else {
|
||||
- tmp = concat(argv0_dir, "../../bin", NULL);
|
||||
+ tmp = concat(argv0_dir, "../" TARGET_ALIAS "/bin", NULL);
|
||||
if (stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode)) {
|
||||
- bindir = concat(tmp, "/", NULL);
|
||||
+ tooldir = concat(tmp, "/", NULL);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.9.4
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
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
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
From 26165906f85d82f0a4456f34b5c60fcaaef48535 Mon Sep 17 00:00:00 2001
|
||||
From: Romain Naour <romain.naour@smile.fr>
|
||||
Date: Wed, 5 Feb 2020 10:31:32 +0100
|
||||
Subject: [PATCH] elf2flt: handle binutils >= 2.34
|
||||
|
||||
The latest Binutils release (2.34) is not compatible with elf2flt due
|
||||
to a change in bfd_section_* macros [1]. The issue has been reported
|
||||
to the Binutils mailing list but Alan Modra recommend to bundle
|
||||
libbfd library sources into each projects using it [2]. That's
|
||||
because the API is not stable over the time without any backward
|
||||
compatibility guaranties.
|
||||
|
||||
On the other hand, the elf2flt tools needs to support modified
|
||||
version of binutils for specific arch/target [3].
|
||||
|
||||
Add two tests in the configure script to detect this API change
|
||||
in order to support binutils < 2.34 and binutils >= 2.34.
|
||||
|
||||
Upstream status: [4]
|
||||
|
||||
[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=fd3619828e94a24a92cddec42cbc0ab33352eeb4
|
||||
[2] https://sourceware.org/ml/binutils/2020-02/msg00044.html
|
||||
[3] https://github.com/uclinux-dev/elf2flt/issues/14
|
||||
[4] https://github.com/uclinux-dev/elf2flt/pull/15
|
||||
|
||||
Signed-off-by: Romain Naour <romain.naour@smile.fr>
|
||||
---
|
||||
configure.ac | 16 +++++++++++
|
||||
elf2flt.c | 81 +++++++++++++++++++++++++++++-----------------------
|
||||
2 files changed, 61 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index e82eb1d..cf7dea8 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -229,6 +229,22 @@ AC_CHECK_FUNCS([ \
|
||||
strsignal \
|
||||
])
|
||||
|
||||
+dnl Various bfd section macros and functions like bfd_section_size() have been
|
||||
+dnl modified starting with binutils >= 2.34.
|
||||
+dnl Check if the prototypes take a bfd argument.
|
||||
+if test "$binutils_build_dir" != "NONE"; then
|
||||
+ CFLAGS="-I$binutils_include_dir -I$bfd_include_dir $CFLAGS"
|
||||
+fi
|
||||
+
|
||||
+AC_TRY_COMPILE([#include <bfd.h>],
|
||||
+ [const asection *sec; bfd_section_size(sec);],
|
||||
+ bfd_section_api_takes_bfd=no,
|
||||
+ bfd_section_api_takes_bfd=yes)
|
||||
+if test "$bfd_section_api_takes_bfd" = "yes" ; then
|
||||
+ AC_DEFINE(HAVE_BFD_SECTION_API_TAKES_BFD, 1,
|
||||
+ [define to 1 for binutils < 2.34])
|
||||
+fi
|
||||
+
|
||||
if test "$GCC" = yes ; then
|
||||
CFLAGS="-Wall $CFLAGS"
|
||||
if test "$werror" = 1 ; then
|
||||
diff --git a/elf2flt.c b/elf2flt.c
|
||||
index b93aecd..3bcf4fe 100644
|
||||
--- a/elf2flt.c
|
||||
+++ b/elf2flt.c
|
||||
@@ -149,6 +149,17 @@ const char *elf2flt_progname;
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
+/*
|
||||
+ * The bfd parameter isn't actually used by any of the bfd_section funcs and
|
||||
+ * have been removed since binutils 2.34.
|
||||
+ */
|
||||
+#ifdef HAVE_BFD_SECTION_API_TAKES_BFD
|
||||
+#define elf2flt_bfd_section_size(s) bfd_section_size(NULL, s)
|
||||
+#define elf2flt_bfd_section_vma(s) bfd_section_vma(NULL, s)
|
||||
+#else
|
||||
+#define elf2flt_bfd_section_size(s) bfd_section_size(s)
|
||||
+#define elf2flt_bfd_section_vma(s) bfd_section_vma(s)
|
||||
+#endif
|
||||
|
||||
/* Extra output when running. */
|
||||
static int verbose = 0;
|
||||
@@ -323,10 +334,8 @@ compare_relocs (const void *pa, const void *pb)
|
||||
else if (!rb->sym_ptr_ptr || !*rb->sym_ptr_ptr)
|
||||
return 1;
|
||||
|
||||
- a_vma = bfd_section_vma(compare_relocs_bfd,
|
||||
- (*(ra->sym_ptr_ptr))->section);
|
||||
- b_vma = bfd_section_vma(compare_relocs_bfd,
|
||||
- (*(rb->sym_ptr_ptr))->section);
|
||||
+ a_vma = elf2flt_bfd_section_vma((*(ra->sym_ptr_ptr))->section);
|
||||
+ b_vma = elf2flt_bfd_section_vma((*(rb->sym_ptr_ptr))->section);
|
||||
va = (*(ra->sym_ptr_ptr))->value + a_vma + ra->addend;
|
||||
vb = (*(rb->sym_ptr_ptr))->value + b_vma + rb->addend;
|
||||
return va - vb;
|
||||
@@ -403,7 +412,7 @@ output_relocs (
|
||||
}
|
||||
|
||||
for (a = abs_bfd->sections; (a != (asection *) NULL); a = a->next) {
|
||||
- section_vma = bfd_section_vma(abs_bfd, a);
|
||||
+ section_vma = elf2flt_bfd_section_vma(a);
|
||||
|
||||
if (verbose)
|
||||
printf("SECTION: %s [%p]: flags=0x%x vma=0x%"PRIx32"\n",
|
||||
@@ -442,7 +451,7 @@ output_relocs (
|
||||
continue;
|
||||
if (verbose)
|
||||
printf(" RELOCS: %s [%p]: flags=0x%x vma=0x%"BFD_VMA_FMT"x\n",
|
||||
- r->name, r, r->flags, bfd_section_vma(abs_bfd, r));
|
||||
+ r->name, r, r->flags, elf2flt_bfd_section_vma(r));
|
||||
if ((r->flags & SEC_RELOC) == 0)
|
||||
continue;
|
||||
relsize = bfd_get_reloc_upper_bound(rel_bfd, r);
|
||||
@@ -694,7 +703,7 @@ output_relocs (
|
||||
case R_BFIN_RIMM16:
|
||||
case R_BFIN_LUIMM16:
|
||||
case R_BFIN_HUIMM16:
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
|
||||
if (weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
|
||||
@@ -727,7 +736,7 @@ output_relocs (
|
||||
break;
|
||||
|
||||
case R_BFIN_BYTE4_DATA:
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
|
||||
if (weak_und_symbol (sym_section->name, (*(q->sym_ptr_ptr))))
|
||||
@@ -885,7 +894,7 @@ output_relocs (
|
||||
#if defined(TARGET_m68k)
|
||||
case R_68K_32:
|
||||
relocation_needed = 1;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_68K_PC16:
|
||||
@@ -910,7 +919,7 @@ output_relocs (
|
||||
q->address, sym_addr,
|
||||
(*p)->howto->rightshift,
|
||||
*(uint32_t *)r_mem);
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_ARM_GOT32:
|
||||
@@ -938,7 +947,7 @@ output_relocs (
|
||||
#ifdef TARGET_v850
|
||||
case R_V850_ABS32:
|
||||
relocation_needed = 1;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_V850_ZDA_16_16_OFFSET:
|
||||
@@ -960,7 +969,7 @@ output_relocs (
|
||||
sym_addr = (*(q->sym_ptr_ptr))->value;
|
||||
q->address -= 1;
|
||||
r_mem -= 1; /* tracks q->address */
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
sym_addr |= (*(unsigned char *)r_mem<<24);
|
||||
break;
|
||||
@@ -973,7 +982,7 @@ output_relocs (
|
||||
/* Absolute symbol done not relocation */
|
||||
relocation_needed = !bfd_is_abs_section(sym_section);
|
||||
sym_addr = (*(q->sym_ptr_ptr))->value;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_H8_DIR32:
|
||||
@@ -986,7 +995,7 @@ output_relocs (
|
||||
}
|
||||
relocation_needed = 1;
|
||||
sym_addr = (*(q->sym_ptr_ptr))->value;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_H8_PCREL16:
|
||||
@@ -1012,7 +1021,7 @@ output_relocs (
|
||||
#ifdef TARGET_microblaze
|
||||
case R_MICROBLAZE_64:
|
||||
/* work out the relocation */
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
/* Write relocated pointer back */
|
||||
r_mem[2] = (sym_addr >> 24) & 0xff;
|
||||
@@ -1026,7 +1035,7 @@ output_relocs (
|
||||
pflags = 0x80000000;
|
||||
break;
|
||||
case R_MICROBLAZE_32:
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
relocation_needed = 1;
|
||||
break;
|
||||
@@ -1058,7 +1067,7 @@ output_relocs (
|
||||
case R_NIOS2_BFD_RELOC_32:
|
||||
relocation_needed = 1;
|
||||
pflags = (FLAT_NIOS2_R_32 << 28);
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
/* modify target, in target order */
|
||||
*(unsigned long *)r_mem = htoniosl(sym_addr);
|
||||
@@ -1068,7 +1077,7 @@ output_relocs (
|
||||
unsigned long exist_val;
|
||||
relocation_needed = 1;
|
||||
pflags = (FLAT_NIOS2_R_CALL26 << 28);
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
|
||||
/* modify target, in target order */
|
||||
@@ -1099,7 +1108,7 @@ output_relocs (
|
||||
? FLAT_NIOS2_R_HIADJ_LO : FLAT_NIOS2_R_HI_LO;
|
||||
pflags <<= 28;
|
||||
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
|
||||
/* modify high 16 bits, in target order */
|
||||
@@ -1132,7 +1141,7 @@ output_relocs (
|
||||
goto NIOS2_RELOC_ERR;
|
||||
}
|
||||
/* _gp holds a absolute value, otherwise the ld cannot generate correct code */
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
//printf("sym=%x, %d, _gp=%x, %d\n", sym_addr+sym_vma, sym_addr+sym_vma, gp, gp);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
sym_addr -= gp;
|
||||
@@ -1213,7 +1222,7 @@ NIOS2_RELOC_ERR:
|
||||
case R_SPARC_32:
|
||||
case R_SPARC_UA32:
|
||||
relocation_needed = 1;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_SPARC_PC22:
|
||||
@@ -1232,7 +1241,7 @@ NIOS2_RELOC_ERR:
|
||||
case R_SPARC_HI22:
|
||||
relocation_needed = 1;
|
||||
pflags = 0x80000000;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
sym_addr |= (
|
||||
htonl(*(uint32_t *)r_mem)
|
||||
@@ -1242,7 +1251,7 @@ NIOS2_RELOC_ERR:
|
||||
case R_SPARC_LO10:
|
||||
relocation_needed = 1;
|
||||
pflags = 0x40000000;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
sym_addr &= 0x000003ff;
|
||||
sym_addr |= (
|
||||
@@ -1256,7 +1265,7 @@ NIOS2_RELOC_ERR:
|
||||
#ifdef TARGET_sh
|
||||
case R_SH_DIR32:
|
||||
relocation_needed = 1;
|
||||
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sym_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
sym_addr += sym_vma + q->addend;
|
||||
break;
|
||||
case R_SH_REL32:
|
||||
@@ -1288,7 +1297,7 @@ NIOS2_RELOC_ERR:
|
||||
case R_E1_CONST31:
|
||||
relocation_needed = 1;
|
||||
DBG_E1("Handling Reloc <CONST31>\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x], q->address : [0x%x]\n",
|
||||
sec_vma, sym_addr, q->address);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1303,7 +1312,7 @@ NIOS2_RELOC_ERR:
|
||||
relocation_needed = 0;
|
||||
DBG_E1("Handling Reloc <CONST31_PCREL>\n");
|
||||
DBG_E1("DONT RELOCATE AT LOADING\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x], q->address : [0x%x]\n",
|
||||
sec_vma, sym_addr, q->address);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1330,7 +1339,7 @@ NIOS2_RELOC_ERR:
|
||||
relocation_needed = 0;
|
||||
DBG_E1("Handling Reloc <DIS29W_PCREL>\n");
|
||||
DBG_E1("DONT RELOCATE AT LOADING\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x], q->address : [0x%x]\n",
|
||||
sec_vma, sym_addr, q->address);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1363,7 +1372,7 @@ NIOS2_RELOC_ERR:
|
||||
DBG_E1("Handling Reloc <DIS29B>\n");
|
||||
DIS29_RELOCATION:
|
||||
relocation_needed = 1;
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%08x]\n",
|
||||
sec_vma, sym_addr);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1380,7 +1389,7 @@ DIS29_RELOCATION:
|
||||
relocation_needed = 0;
|
||||
DBG_E1("Handling Reloc <IMM32_PCREL>\n");
|
||||
DBG_E1("DONT RELOCATE AT LOADING\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x]\n",
|
||||
sec_vma, sym_addr);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1406,7 +1415,7 @@ DIS29_RELOCATION:
|
||||
case R_E1_IMM32:
|
||||
relocation_needed = 1;
|
||||
DBG_E1("Handling Reloc <IMM32>\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x]\n",
|
||||
sec_vma, sym_addr);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1422,7 +1431,7 @@ DIS29_RELOCATION:
|
||||
case R_E1_WORD:
|
||||
relocation_needed = 1;
|
||||
DBG_E1("Handling Reloc <WORD>\n");
|
||||
- sec_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(sym_section);
|
||||
DBG_E1("sec_vma : [0x%x], sym_addr : [0x%x]\n",
|
||||
sec_vma, sym_addr);
|
||||
sym_addr = sec_vma + sym_addr;
|
||||
@@ -1449,7 +1458,7 @@ DIS29_RELOCATION:
|
||||
}
|
||||
|
||||
sprintf(&addstr[0], "+0x%lx", sym_addr - (*(q->sym_ptr_ptr))->value -
|
||||
- bfd_section_vma(abs_bfd, sym_section));
|
||||
+ elf2flt_bfd_section_vma(sym_section));
|
||||
|
||||
|
||||
/*
|
||||
@@ -1887,8 +1896,8 @@ int main(int argc, char *argv[])
|
||||
} else
|
||||
continue;
|
||||
|
||||
- sec_size = bfd_section_size(abs_bfd, s);
|
||||
- sec_vma = bfd_section_vma(abs_bfd, s);
|
||||
+ sec_size = elf2flt_bfd_section_size(s);
|
||||
+ sec_vma = elf2flt_bfd_section_vma(s);
|
||||
|
||||
if (sec_vma < *vma) {
|
||||
if (*len > 0)
|
||||
@@ -1913,7 +1922,7 @@ int main(int argc, char *argv[])
|
||||
if (s->flags & SEC_CODE)
|
||||
if (!bfd_get_section_contents(abs_bfd, s,
|
||||
text + (s->vma - text_vma), 0,
|
||||
- bfd_section_size(abs_bfd, s)))
|
||||
+ elf2flt_bfd_section_size(s)))
|
||||
{
|
||||
fatal("read error section %s", s->name);
|
||||
}
|
||||
@@ -1939,7 +1948,7 @@ int main(int argc, char *argv[])
|
||||
if (s->flags & SEC_DATA)
|
||||
if (!bfd_get_section_contents(abs_bfd, s,
|
||||
data + (s->vma - data_vma), 0,
|
||||
- bfd_section_size(abs_bfd, s)))
|
||||
+ elf2flt_bfd_section_size(s)))
|
||||
{
|
||||
fatal("read error section %s", s->name);
|
||||
}
|
||||
--
|
||||
2.25.4
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
From 1dea576eac4289602adc4a37f48c80330bf82e63 Mon Sep 17 00:00:00 2001
|
||||
From: Damien Le Moal <damien.lemoal@wdc.com>
|
||||
Date: Wed, 9 Sep 2020 17:31:33 +0900
|
||||
Subject: [PATCH] elf2flt: add riscv 64-bits support
|
||||
|
||||
Add support for riscv 64bits ISA by defining the relocation types
|
||||
R_RISCV_32_PCREL, R_RISCV_ADD32, R_RISCV_SUB32, R_RISCV_32 and
|
||||
R_RISCV_64. riscv64 support also needs the __global_pointer$ symbol to
|
||||
be defined right after the relocation tables in the data section.
|
||||
Furthermore, the .got and .got.plt sections must be reversed. These 2
|
||||
requirements are handled with runtime modifications of the default
|
||||
linker script using the append_sed() function.
|
||||
(1) For the .got.plt and .got sections order swap, append_sed() is used
|
||||
to rename "(.got.plt)" to "(.got.tmp)" and to rename "(.got)" to
|
||||
"(.got.plt)". A last call finalize the name swap by replacing
|
||||
"(.got.tmp)" with "(.got)"
|
||||
(2) For the global pointer synbol, a definition line starting with
|
||||
"RISCV_GP" is added. The "RISCV_GP" string is removed if the target CPU
|
||||
type is riscv64. The definition line is dropped for other CPU types.
|
||||
|
||||
With these changes, buildroot/busybox builds and run on NOMMU
|
||||
systems with kernel 5.13. Tested on Canaan Kendryte K210 boards.
|
||||
|
||||
This patch is based on earlier work by Christoph Hellwig <hch@lst.de>.
|
||||
|
||||
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
|
||||
---
|
||||
elf2flt.c | 23 +++++++++++++++++++++++
|
||||
elf2flt.ld.in | 9 +++++----
|
||||
ld-elf2flt.c | 16 ++++++++++++++++
|
||||
3 files changed, 44 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/elf2flt.c b/elf2flt.c
|
||||
index f87f1fc..dbce467 100644
|
||||
--- a/elf2flt.c
|
||||
+++ b/elf2flt.c
|
||||
@@ -80,6 +80,8 @@ const char *elf2flt_progname;
|
||||
#include <elf/v850.h>
|
||||
#elif defined(TARGET_xtensa)
|
||||
#include <elf/xtensa.h>
|
||||
+#elif defined(TARGET_riscv64)
|
||||
+#include <elf/riscv.h>
|
||||
#endif
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
@@ -122,6 +124,8 @@ const char *elf2flt_progname;
|
||||
#define ARCH "nios2"
|
||||
#elif defined(TARGET_xtensa)
|
||||
#define ARCH "xtensa"
|
||||
+#elif defined(TARGET_riscv64)
|
||||
+#define ARCH "riscv64"
|
||||
#else
|
||||
#error "Don't know how to support your CPU architecture??"
|
||||
#endif
|
||||
@@ -797,6 +801,16 @@ output_relocs (
|
||||
goto good_32bit_resolved_reloc;
|
||||
default:
|
||||
goto bad_resolved_reloc;
|
||||
+#elif defined(TARGET_riscv64)
|
||||
+ case R_RISCV_32_PCREL:
|
||||
+ case R_RISCV_ADD32:
|
||||
+ case R_RISCV_SUB32:
|
||||
+ continue;
|
||||
+ case R_RISCV_32:
|
||||
+ case R_RISCV_64:
|
||||
+ goto good_32bit_resolved_reloc;
|
||||
+ default:
|
||||
+ goto bad_resolved_reloc;
|
||||
#else
|
||||
default:
|
||||
/* The default is to assume that the
|
||||
@@ -1806,6 +1820,15 @@ int main(int argc, char *argv[])
|
||||
if (!load_to_ram && !pfile)
|
||||
load_to_ram = 1;
|
||||
|
||||
+#if defined(TARGET_riscv64)
|
||||
+ /*
|
||||
+ * riscv only supports loading text and data contiguously.
|
||||
+ * So fail if load_to_ram is false.
|
||||
+ */
|
||||
+ if (!load_to_ram)
|
||||
+ fatal("Loading to RAM ('-r' option) is required");
|
||||
+#endif
|
||||
+
|
||||
fname = argv[argc-1];
|
||||
|
||||
if (pfile) {
|
||||
diff --git a/elf2flt.ld.in b/elf2flt.ld.in
|
||||
index ec1fe6f..c0c44b8 100644
|
||||
--- a/elf2flt.ld.in
|
||||
+++ b/elf2flt.ld.in
|
||||
@@ -70,10 +70,11 @@ W_RODAT *(.gnu.linkonce.r*)
|
||||
. = ALIGN(0x20) ;
|
||||
LONG(-1)
|
||||
. = ALIGN(0x20) ;
|
||||
-R_RODAT *(.rodata)
|
||||
-R_RODAT *(.rodata1)
|
||||
-R_RODAT *(.rodata.*)
|
||||
-R_RODAT *(.gnu.linkonce.r*)
|
||||
+RISCV_GP: __global_pointer$ = . + 0x800 ;
|
||||
+R_RODAT *(.rodata)
|
||||
+R_RODAT *(.rodata1)
|
||||
+R_RODAT *(.rodata.*)
|
||||
+R_RODAT *(.gnu.linkonce.r*)
|
||||
*(.data)
|
||||
*(.data1)
|
||||
*(.data.*)
|
||||
diff --git a/ld-elf2flt.c b/ld-elf2flt.c
|
||||
index e5de506..31b565f 100644
|
||||
--- a/ld-elf2flt.c
|
||||
+++ b/ld-elf2flt.c
|
||||
@@ -324,6 +324,22 @@ static int do_final_link(void)
|
||||
append_option(&other_options, concat(got_offset, "=", buf, NULL));
|
||||
}
|
||||
|
||||
+ if (streq(TARGET_CPU, "riscv64")) {
|
||||
+ /*
|
||||
+ * The .got section must come before the .got.plt section
|
||||
+ * (gcc/ld bug ?).
|
||||
+ */
|
||||
+ append_sed(&sed, "(.got.plt)", "(.got.tmp)");
|
||||
+ append_sed(&sed, "(.got.plt)", "(.got)");
|
||||
+ append_sed(&sed, "(.got.tmp)", "(.got.plt)");
|
||||
+
|
||||
+ /* The global pointer symbol is defined after the GOT. */
|
||||
+ append_sed(&sed, "^RISCV_GP:", "");
|
||||
+ } else {
|
||||
+ /* Get rid of the global pointer definition. */
|
||||
+ append_sed(&sed, "^RISCV_GP:", NULL);
|
||||
+ }
|
||||
+
|
||||
/* Locate the default linker script, if we don't have one provided. */
|
||||
if (!linker_script)
|
||||
linker_script = concat(ldscriptpath, "/elf2flt.ld", NULL);
|
||||
--
|
||||
2.31.1
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
config BR2_PACKAGE_HOST_ELF2FLT
|
||||
bool "Enable elf2flt support?"
|
||||
depends on BR2_arm || BR2_sh || BR2_sparc || BR2_xtensa || BR2_RISCV_64
|
||||
depends on !BR2_USE_MMU
|
||||
help
|
||||
uCLinux uses a Binary Flat format commonly known as BFLT. It
|
||||
is a relatively simple and lightweight executable format
|
||||
based on the original a.out format.
|
||||
|
||||
This option compiles the required tools and makes the required
|
||||
modifications on your toolchain (linker).
|
||||
|
||||
https://github.com/uclinux-dev/elf2flt
|
||||
@@ -0,0 +1,3 @@
|
||||
# Locally calculated
|
||||
sha256 d63baae6fe0d7fcc50a635be151a6f9e1e83dba30568046a869a395c15bf6284 elf2flt-7e33f28df198c46764021ed14408bd262751e148.tar.gz
|
||||
sha256 f20bc5007904094e3a4e9fbcc3526cdd40893f91d458c3139b308e5c4c0899c6 LICENSE.TXT
|
||||
@@ -0,0 +1,51 @@
|
||||
################################################################################
|
||||
#
|
||||
# elf2flt
|
||||
#
|
||||
################################################################################
|
||||
|
||||
ELF2FLT_VERSION = 7e33f28df198c46764021ed14408bd262751e148
|
||||
ELF2FLT_SITE = $(call github,uclinux-dev,elf2flt,$(ELF2FLT_VERSION))
|
||||
ELF2FLT_LICENSE = GPL-2.0+
|
||||
ELF2FLT_LICENSE_FILES = LICENSE.TXT
|
||||
|
||||
HOST_ELF2FLT_DEPENDENCIES = host-binutils host-zlib
|
||||
|
||||
# 0003-elf2flt-handle-binutils-2.34.patch
|
||||
HOST_ELF2FLT_AUTORECONF = YES
|
||||
|
||||
# It is not exactly a host variant, but more a cross variant, which is
|
||||
# why we pass a special --target option.
|
||||
HOST_ELF2FLT_CONF_OPTS = \
|
||||
--with-bfd-include-dir=$(HOST_BINUTILS_DIR)/bfd/ \
|
||||
--with-binutils-include-dir=$(HOST_BINUTILS_DIR)/include/ \
|
||||
--with-libbfd=$(HOST_BINUTILS_DIR)/bfd/libbfd.a \
|
||||
--with-libiberty=$(HOST_BINUTILS_DIR)/libiberty/libiberty.a \
|
||||
--target=$(GNU_TARGET_NAME) \
|
||||
--disable-werror
|
||||
|
||||
HOST_ELF2FLT_LIBS = -lz
|
||||
|
||||
ifeq ($(BR2_GCC_ENABLE_LTO),y)
|
||||
HOST_ELF2FLT_LIBS += -ldl
|
||||
endif
|
||||
|
||||
HOST_ELF2FLT_CONF_ENV = LIBS="$(HOST_ELF2FLT_LIBS)"
|
||||
|
||||
# Hardlinks between binaries in different directories cause a problem
|
||||
# with rpath fixup, so we de-hardlink those binaries, and replace them
|
||||
# with copies instead. Note that elf2flt will rename ld to ld.real
|
||||
# before installing its own ld, but we already took care of the
|
||||
# original ld from binutils so that it is already de-hardlinked. So
|
||||
# ld is now the one from elf2flt, and we want to de-hardlinke it.
|
||||
ELF2FLT_TOOLS = elf2flt flthdr ld
|
||||
define HOST_ELF2FLT_FIXUP_HARDLINKS
|
||||
$(foreach tool,$(ELF2FLT_TOOLS),\
|
||||
rm -f $(HOST_DIR)/$(GNU_TARGET_NAME)/bin/$(tool) && \
|
||||
cp -a $(HOST_DIR)/bin/$(GNU_TARGET_NAME)-$(tool) \
|
||||
$(HOST_DIR)/$(GNU_TARGET_NAME)/bin/$(tool)
|
||||
)
|
||||
endef
|
||||
HOST_ELF2FLT_POST_INSTALL_HOOKS += HOST_ELF2FLT_FIXUP_HARDLINKS
|
||||
|
||||
$(eval $(host-autotools-package))
|
||||
Reference in New Issue
Block a user