Browse Source

lm32: use latest elf2git, add small binutils patch to create ELF instead ELF FDPIC by default

Waldemar Brodkorb 7 months ago
parent
commit
5c26d11ac3

+ 0 - 1
target/config/Config.in.binutils

@@ -7,7 +7,6 @@ default ADK_TOOLCHAIN_BINUTILS_AVR32 if ADK_TARGET_ARCH_AVR32
 default ADK_TOOLCHAIN_BINUTILS_KVX if ADK_TARGET_ARCH_KVX
 default ADK_TOOLCHAIN_BINUTILS_2_28 if ADK_TARGET_CPU_SH_J2
 default ADK_TOOLCHAIN_BINUTILS_2_38 if ADK_TARGET_ARCH_NDS32
-default ADK_TOOLCHAIN_BINUTILS_2_40 if ADK_TARGET_ARCH_LM32
 default ADK_TOOLCHAIN_BINUTILS_2_41
 
 config ADK_TOOLCHAIN_BINUTILS_GIT

+ 0 - 5
target/config/Config.in.elf2flt

@@ -8,7 +8,6 @@ depends on ADK_TARGET_BINFMT_FLAT
 
 config ADK_TOOLCHAIN_ELF2FLT_GIT
 	bool "git"
-	depends on !ADK_TARGET_ARCH_LM32
 	depends on !ADK_TARGET_ARCH_SH
 
 config ADK_TOOLCHAIN_ELF2FLT_2021_08
@@ -22,8 +21,4 @@ config ADK_TOOLCHAIN_ELF2FLT_OLD
 	depends on ADK_TARGET_ARCH_BFIN || \
 		ADK_TARGET_ARCH_SH
 
-config ADK_TOOLCHAIN_ELF2FLT_LM32
-	bool "lm32"
-	depends on ADK_TARGET_ARCH_LM32
-
 endchoice

+ 24 - 0
toolchain/binutils/patches/2.41/lm32.patch

@@ -0,0 +1,24 @@
+diff -Nur binutils-2.41.orig/bfd/config.bfd binutils-2.41/bfd/config.bfd
+--- binutils-2.41.orig/bfd/config.bfd	2023-07-03 01:00:00.000000000 +0200
++++ binutils-2.41/bfd/config.bfd	2023-09-07 17:03:12.853045008 +0200
+@@ -803,7 +803,7 @@
+     ;;
+ 
+   lm32-*-*linux*)
+-    targ_defvec=lm32_elf32_fdpic_vec
++    targ_defvec=lm32_elf32_vec
+     targ_selvecs=lm32_elf32_vec
+     ;;
+ 
+diff -Nur binutils-2.41.orig/ld/configure.tgt binutils-2.41/ld/configure.tgt
+--- binutils-2.41.orig/ld/configure.tgt	2023-07-03 01:00:00.000000000 +0200
++++ binutils-2.41/ld/configure.tgt	2023-09-07 17:03:44.364298973 +0200
+@@ -468,7 +468,7 @@
+ 			targ_extra_emuls="elf32iq10"
+ 			targ_extra_ofiles=ldelfgen.o
+ 			;;
+-lm32-*-*linux*)		targ_emul=elf32lm32fd
++lm32-*-*linux*)		targ_emul=elf32lm32
+ 			;;
+ lm32-*-*)		targ_emul=elf32lm32
+ 			targ_extra_emuls="elf32lm32fd"

+ 0 - 6
toolchain/elf2flt/Makefile.inc

@@ -20,9 +20,3 @@ PKG_GIT:=		hash
 PKG_RELEASE:=		1
 PKG_SITES:=		https://github.com/uclinux-dev/elf2flt.git
 endif
-ifeq ($(ADK_TOOLCHAIN_ELF2FLT_LM32),y)
-PKG_VERSION:=		3051fec89bbd30de6f952dc3100712feff3ca076
-PKG_GIT:=		hash
-PKG_RELEASE:=		1
-PKG_SITES:=		https://github.com/m-labs/elf2flt-lm32.git
-endif

+ 167 - 0
toolchain/elf2flt/patches/26dfb54a59c8c0106418a0c46ccb4288d9e066fd/0002-lm32.patch

@@ -0,0 +1,167 @@
+diff -Nur elf2flt.orig/elf2flt.c elf2flt/elf2flt.c
+--- elf2flt.orig/elf2flt.c	2023-09-07 15:59:10.019349031 +0200
++++ elf2flt/elf2flt.c	2023-09-07 16:40:06.281961316 +0200
+@@ -62,6 +62,8 @@
+ #include <elf/bfin.h>
+ #elif defined(TARGET_h8300)
+ #include <elf/h8.h>
++#elif defined(TARGET_lm32)
++#include <elf/lm32.h>
+ #elif defined(TARGET_m68k)
+ #include <elf/m68k.h>
+ #elif defined(TARGET_microblaze)
+@@ -123,6 +125,11 @@
+ #define ARCH	"nios"
+ #elif defined(TARGET_nios2)
+ #define ARCH	"nios2"
++#elif defined(TARGET_lm32)
++#define ARCH	"lm32"
++#define FLAT_LM32_RELOC_TYPE_32_BIT   0
++#define FLAT_LM32_RELOC_TYPE_HI16_BIT 1
++#define FLAT_LM32_RELOC_TYPE_LO16_BIT 2
+ #elif defined(TARGET_xtensa)
+ #define ARCH	"xtensa"
+ #elif defined(TARGET_riscv64)
+@@ -373,7 +380,7 @@
+   int			bad_relocs = 0;
+   asymbol		**symb;
+   long			nsymb;
+-#ifdef TARGET_bfin
++#if defined (TARGET_bfin) || defined (TARGET_lm32)
+   unsigned long		persistent_data = 0;
+ #endif
+ 
+@@ -690,6 +697,36 @@
+ 					break;
+ 				default:
+ 					goto bad_resolved_reloc;
++#elif defined(TARGET_lm32)
++				case R_LM32_HI16:
++				case R_LM32_LO16:
++					if (q->howto->type == R_LM32_HI16) {
++						pflags = FLAT_LM32_RELOC_TYPE_HI16_BIT << 29;
++					} else {
++						pflags = FLAT_LM32_RELOC_TYPE_LO16_BIT << 29;
++					}
++
++					relocation_needed = 1;
++
++					/* remember the upper 16 bits */
++				    if ((0xffff0000 & sym_addr) != persistent_data) {
++						flat_relocs = (uint32_t *)
++							(realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
++						if (verbose)
++							printf ("New persistent data for %08lx\n", sym_addr);
++						persistent_data = 0xffff0000 & sym_addr;
++						flat_relocs[flat_reloc_count++] = (sym_addr >> 16) | (3 << 29);
++					}
++					break;
++				case R_LM32_32:
++					pflags = FLAT_LM32_RELOC_TYPE_32_BIT << 29;
++					relocation_needed = 1;
++					break;
++				case R_LM32_CALL:
++					relocation_needed = 0;
++					break;
++				default:
++					goto bad_resolved_reloc;
+ #elif defined(TARGET_m68k)
+ 				case R_68K_32:
+ 					goto good_32bit_resolved_reloc;
+@@ -1478,6 +1515,63 @@
+ #undef _30BITS_RELOC
+ #undef _28BITS_RELOC
+ #endif
++#ifdef TARGET_lm32
++				case R_LM32_32:
++				{
++					pflags = FLAT_LM32_RELOC_TYPE_32_BIT << 29;
++					sym_vma = elf2flt_bfd_section_vma(sym_section);
++					sym_addr += sym_vma + q->addend;
++					relocation_needed = 1;
++					break;
++				}
++				case R_LM32_CALL:
++				{
++					sym_vma = 0;
++					sym_addr += sym_vma + q->addend;
++					sym_addr -= q->address;
++					sym_addr = (int32_t)sym_addr >> q->howto->rightshift;
++
++					if ((int32_t)sym_addr < -0x8000000 || (int32_t)sym_addr > 0x7ffffff) {
++						printf("ERROR: Relocation overflow for R_LM32_CALL relocation against %s\n", sym_name);
++						bad_relocs++;
++						continue;
++					}
++
++					r_mem[0] |= (sym_addr >> 24) & 0x03;
++					r_mem[1] = (sym_addr >> 16) & 0xff;
++					r_mem[2] = (sym_addr >> 8) & 0xff;
++					r_mem[3] = sym_addr & 0xff;
++					break;
++				}
++				case R_LM32_HI16:
++				case R_LM32_LO16:
++				{
++					if (q->howto->type == R_LM32_HI16) {
++						pflags = FLAT_LM32_RELOC_TYPE_HI16_BIT << 29;
++					} else {
++						pflags = FLAT_LM32_RELOC_TYPE_LO16_BIT << 29;
++					}
++
++					sym_vma = elf2flt_bfd_section_vma(sym_section);
++					sym_addr += sym_vma + q->addend;
++
++					relocation_needed = 1;
++
++					/* remember the upper 16 bits */
++				    if ((0xffff0000 & sym_addr) != persistent_data) {
++						flat_relocs = (uint32_t *)
++							(realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
++						if (verbose)
++							printf ("New persistent data for %08lx\n", sym_addr);
++						persistent_data = 0xffff0000 & sym_addr;
++						flat_relocs[flat_reloc_count++] = (sym_addr >> 16) | (3 << 29);
++					}
++
++					r_mem[2] = (sym_addr >> 8) & 0xff;
++					r_mem[3] = sym_addr & 0xff;
++					break;
++				}
++#endif /* TARGET_lm32 */
+ 				default:
+ 					/* missing support for other types of relocs */
+ 					printf("ERROR: bad reloc type (%s)%d\n", q->howto->name, (*p)->howto->type);
+@@ -1616,6 +1710,13 @@
+ 					break;
+ #endif
+ 
++#ifdef TARGET_lm32
++				case R_LM32_HI16:
++				case R_LM32_LO16:
++				case R_LM32_CALL:
++					/* entry has already been written */
++					break;
++#endif
+ 				default:
+ 					/* The alignment of the build host
+ 					   might be stricter than that of the
+diff -Nur elf2flt.orig/elf2flt.ld.in elf2flt/elf2flt.ld.in
+--- elf2flt.orig/elf2flt.ld.in	2023-09-07 11:32:34.223463015 +0200
++++ elf2flt/elf2flt.ld.in	2023-09-07 16:06:02.781672190 +0200
+@@ -73,6 +73,7 @@
+ W_RODAT:	*(.rodata1)
+ W_RODAT:	*(.rodata.*)
+ W_RODAT:	*(.gnu.linkonce.r*)
++W_RODAT:	*(.rofixup)
+ 
+ 		/* .ARM.extab name sections containing exception unwinding information */
+ 		*(.ARM.extab* .gnu.linkonce.armextab.*)
+@@ -111,6 +112,7 @@
+ R_RODAT:	*(.rodata1)
+ R_RODAT:	*(.rodata.*)
+ R_RODAT:	*(.gnu.linkonce.r*)
++R_RODAT:	*(.rofixup)
+ 		*(.data)
+ 		*(.data1)
+ 		*(.data.*)