package/elf2flt: add support for binutils >= 2.34
authorRomain Naour <romain.naour@gmail.com>
Sat, 7 Nov 2020 22:55:35 +0000 (23:55 +0100)
committerPeter Korsgaard <peter@korsgaard.com>
Mon, 9 Nov 2020 16:07:56 +0000 (17:07 +0100)
Various bfd section macros and functions like bfd_section_size() have been
modified starting with binutils >= 2.34.
Add a patch to handle this API change.

Signed-off-by: Romain Naour <romain.naour@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
package/elf2flt/0003-elf2flt-handle-binutils-2.34.patch [new file with mode: 0644]
package/elf2flt/elf2flt.mk

diff --git a/package/elf2flt/0003-elf2flt-handle-binutils-2.34.patch b/package/elf2flt/0003-elf2flt-handle-binutils-2.34.patch
new file mode 100644 (file)
index 0000000..16d5633
--- /dev/null
@@ -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
+
index e7edd8b9de71b0c5aef8d62baf96b78fa4dc1162..3239af1b9a1576ddb3facbfe7fb11fe1b341b6a2 100644 (file)
@@ -11,6 +11,9 @@ 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 = \