bump version to 2022.02.9

add miyoo_defconfig
This commit is contained in:
tiopex
2023-01-31 13:11:45 +01:00
parent 1fa746c353
commit dcdaa3599c
8423 changed files with 184305 additions and 91107 deletions

View File

@@ -0,0 +1,377 @@
From d78acba6510527aaa01a41eaf4c931f7a57e5f44 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 b7db2cb..fdc0876 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 7ac0617..ea6b5a1 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",
@@ -443,7 +452,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);
@@ -695,7 +704,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))))
@@ -728,7 +737,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))))
@@ -886,7 +895,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:
@@ -911,7 +920,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:
@@ -939,7 +948,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:
@@ -961,7 +970,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;
@@ -974,7 +983,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:
@@ -987,7 +996,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:
@@ -1013,7 +1022,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;
@@ -1027,7 +1036,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;
@@ -1059,7 +1068,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);
@@ -1069,7 +1078,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 */
@@ -1100,7 +1109,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(abs_bfd, sym_section);
sym_addr += sym_vma + q->addend;
/* modify high 16 bits, in target order */
@@ -1133,7 +1142,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;
@@ -1214,7 +1223,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:
@@ -1233,7 +1242,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)
@@ -1243,7 +1252,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 |= (
@@ -1257,7 +1266,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:
@@ -1289,7 +1298,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;
@@ -1304,7 +1313,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;
@@ -1331,7 +1340,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;
@@ -1364,7 +1373,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;
@@ -1381,7 +1390,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;
@@ -1407,7 +1416,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;
@@ -1423,7 +1432,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;
@@ -1450,7 +1459,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));
/*
@@ -1890,8 +1899,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)
@@ -1920,7 +1929,7 @@ int main(int argc, char *argv[])
(SEC_DATA | SEC_READONLY | SEC_RELOC)))
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);
}
@@ -1950,7 +1959,7 @@ int main(int argc, char *argv[])
(SEC_READONLY | SEC_RELOC)))
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.35.1

View File

@@ -1,79 +0,0 @@
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

View File

@@ -0,0 +1,129 @@
From 3879965dfda08a24e7d44ed76bbcc2f4a41df1fa 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 | 1 +
ld-elf2flt.c | 16 ++++++++++++++++
3 files changed, 40 insertions(+)
diff --git a/elf2flt.c b/elf2flt.c
index ea6b5a1..7100c20 100644
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -81,6 +81,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__)
@@ -123,6 +125,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
@@ -821,6 +825,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
@@ -1841,6 +1855,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 0df999d..f1eed1f 100644
--- a/elf2flt.ld.in
+++ b/elf2flt.ld.in
@@ -109,6 +109,7 @@ W_RODAT: *(.gnu.linkonce.r*)
. = ALIGN(0x20) ;
LONG(-1)
. = ALIGN(0x20) ;
+RISCV_GP: __global_pointer$ = . + 0x800 ;
R_RODAT: *(.rodata)
R_RODAT: *(.rodata1)
R_RODAT: *(.rodata.*)
diff --git a/ld-elf2flt.c b/ld-elf2flt.c
index 7cb02d5..1a503dd 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.35.1

View File

@@ -1,188 +0,0 @@
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

View File

@@ -0,0 +1,76 @@
From 37e1e0ace8ccebf54ec2f5522bfc1f9db86946ad Mon Sep 17 00:00:00 2001
From: Niklas Cassel <niklas.cassel@wdc.com>
Date: Tue, 9 Aug 2022 12:13:50 +0200
Subject: [PATCH] elf2flt: create a common helper function
In order to make the code more maintainable,
move duplicated code to a common helper function.
No functional change intended.
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
---
elf2flt.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/elf2flt.c b/elf2flt.c
index 669591e..9c32f9a 100644
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -337,6 +337,13 @@ compare_relocs (const void *pa, const void *pb)
}
#endif
+static bool
+ro_reloc_data_section_should_be_in_text(asection *s)
+{
+ return (s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
+ (SEC_DATA | SEC_READONLY | SEC_RELOC);
+}
+
static uint32_t *
output_relocs (
bfd *abs_bfd,
@@ -428,8 +435,7 @@ output_relocs (
*/
if ((!pic_with_got || ALWAYS_RELOC_TEXT) &&
((a->flags & SEC_CODE) ||
- ((a->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
- (SEC_DATA | SEC_READONLY | SEC_RELOC))))
+ ro_reloc_data_section_should_be_in_text(a)))
sectionp = text + (a->vma - text_vma);
else if (a->flags & SEC_DATA)
sectionp = data + (a->vma - data_vma);
@@ -1893,8 +1899,7 @@ int main(int argc, char *argv[])
bfd_vma sec_vma;
if ((s->flags & SEC_CODE) ||
- ((s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
- (SEC_DATA | SEC_READONLY | SEC_RELOC))) {
+ ro_reloc_data_section_should_be_in_text(s)) {
vma = &text_vma;
len = &text_len;
} else if (s->flags & SEC_DATA) {
@@ -1932,8 +1937,7 @@ int main(int argc, char *argv[])
* data sections.*/
for (s = abs_bfd->sections; s != NULL; s = s->next)
if ((s->flags & SEC_CODE) ||
- ((s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
- (SEC_DATA | SEC_READONLY | SEC_RELOC)))
+ ro_reloc_data_section_should_be_in_text(s))
if (!bfd_get_section_contents(abs_bfd, s,
text + (s->vma - text_vma), 0,
bfd_section_size(abs_bfd, s)))
@@ -1962,8 +1966,7 @@ int main(int argc, char *argv[])
* data sections already included in the text output section.*/
for (s = abs_bfd->sections; s != NULL; s = s->next)
if ((s->flags & SEC_DATA) &&
- ((s->flags & (SEC_READONLY | SEC_RELOC)) !=
- (SEC_READONLY | SEC_RELOC)))
+ !ro_reloc_data_section_should_be_in_text(s))
if (!bfd_get_section_contents(abs_bfd, s,
data + (s->vma - data_vma), 0,
bfd_section_size(abs_bfd, s)))
--
2.37.1

View File

@@ -0,0 +1,73 @@
From 65ac5f9e69cfb989d970da74c41e478774d29be5 Mon Sep 17 00:00:00 2001
From: Niklas Cassel <niklas.cassel@wdc.com>
Date: Tue, 9 Aug 2022 21:06:05 +0200
Subject: [PATCH] elf2flt: fix fatal error regression on m68k, xtensa,
riscv64
Commit ba379d08bb78 ("elf2flt: fix for segfault on some ARM ELFs")
changed the condition of which input sections that should be included
in the .text output section from:
((a->flags & (SEC_DATA | SEC_READONLY)) == (SEC_DATA | SEC_READONLY))
to:
((a->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
(SEC_DATA | SEC_READONLY | SEC_RELOC))
On ARM, the .eh_frame input section does not have the SEC_RELOC flag
set, so this specific change had no effect on ARM.
However, on e.g. m68k and riscv64, the .eh_frame input section does
have the SEC_RELOC flag set, which means that after commit ba379d08bb78
("elf2flt: fix for segfault on some ARM ELFs"), read-only relocation
data sections were placed in .text output section, instead of .data
output section.
This will result in a fatal error on m68k, xtensa and riscv64:
ERROR: text=0x3bab8 overlaps data=0x33f60 ?
This is because elf2flt cannot append to .text after .data has been
appended to.
Note that the binutils maintainer says that the correct thing is
to put read-only relocation data sections in .text:
https://sourceware.org/legacy-ml/binutils/2019-10/msg00132.html
So the proper fix is probably to rewrite elf2flt so that it can append
to .text after .data has been appended to (which will require elf2flt
to move/relocate everything that has already been appended to .data,
since the virtual addresses are contiguous).
However, for now, add an exception for m68k, xtensa and riscv64
(specifically for the problematic input section, .eh_frame), so that we
get the same behavior as older elf2flt releases, where we put read-only
relocation data in .data, which was working perfectly fine.
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
---
elf2flt.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/elf2flt.c b/elf2flt.c
index 9c32f9a..a680c89 100644
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -340,8 +340,15 @@ compare_relocs (const void *pa, const void *pb)
static bool
ro_reloc_data_section_should_be_in_text(asection *s)
{
- return (s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
- (SEC_DATA | SEC_READONLY | SEC_RELOC);
+ if ((s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) ==
+ (SEC_DATA | SEC_READONLY | SEC_RELOC)) {
+#if defined(TARGET_m68k) || defined(TARGET_riscv64) || defined(TARGET_xtensa)
+ if (!strcmp(".eh_frame", s->name))
+ return false;
+#endif
+ return true;
+ }
+ return false;
}
static uint32_t *
--
2.37.1

View File

@@ -0,0 +1,51 @@
From e248d9774506fdd8698b14a7edead113f19ecdb0 Mon Sep 17 00:00:00 2001
From: Max Filippov <jcmvbkbc@gmail.com>
Date: Tue, 29 Nov 2022 17:47:54 -0800
Subject: [PATCH] xtensa: fix text relocations
The commit 5e08f1968316 ("Don't always update text in !pic_with_got case")
changed good_32bit_resolved_reloc to not do endianness swapping for
relocated entries in the text segment. This broke little-endian xtensa
FLAT images which after this change fail to start with the following
message:
binfmt_flat: reloc outside program 0x24c80100 (0 - 0x6e430/0x56a20)
Fix it by preserving 'update_text' when building for xtensa.
Fixes: 5e08f1968316 ("Don't always update text in !pic_with_got case")
Reported-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
elf2flt.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/elf2flt.c b/elf2flt.c
index b93aecdaced3..cec3f4a22239 100644
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -808,7 +808,20 @@ output_relocs (
continue;
case R_XTENSA_32:
case R_XTENSA_PLT:
- goto good_32bit_resolved_reloc;
+ if (bfd_big_endian (abs_bfd))
+ sym_addr =
+ (r_mem[0] << 24)
+ + (r_mem[1] << 16)
+ + (r_mem[2] << 8)
+ + r_mem[3];
+ else
+ sym_addr =
+ r_mem[0]
+ + (r_mem[1] << 8)
+ + (r_mem[2] << 16)
+ + (r_mem[3] << 24);
+ relocation_needed = 1;
+ break;
default:
goto bad_resolved_reloc;
#else
--
2.30.2

View File

@@ -1,6 +1,6 @@
config BR2_PACKAGE_HOST_ELF2FLT
bool "Enable elf2flt support?"
depends on BR2_arm || BR2_sh || BR2_sparc || BR2_xtensa
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

View File

@@ -1,3 +1,3 @@
# Locally calculated
sha256 d63baae6fe0d7fcc50a635be151a6f9e1e83dba30568046a869a395c15bf6284 elf2flt-7e33f28df198c46764021ed14408bd262751e148.tar.gz
sha256 6637432ed58dee2d42d09e3b9a902a0dd3b9975acba0c0b24ef9e4e9253159a9 elf2flt-2021.08.tar.gz
sha256 f20bc5007904094e3a4e9fbcc3526cdd40893f91d458c3139b308e5c4c0899c6 LICENSE.TXT

View File

@@ -4,13 +4,16 @@
#
################################################################################
ELF2FLT_VERSION = 7e33f28df198c46764021ed14408bd262751e148
ELF2FLT_SITE = $(call github,uclinux-dev,elf2flt,$(ELF2FLT_VERSION))
ELF2FLT_VERSION = 2021.08
ELF2FLT_SITE = $(call github,uclinux-dev,elf2flt,v$(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 = \