378 lines
14 KiB
Diff
378 lines
14 KiB
Diff
|
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
|
||
|
|