This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [patch,avr] Fix PR21569
- From: Georg-Johann Lay <avr at gjlay dot de>
- To: Binutils Development <binutils at sourceware dot org>
- Cc: Senthil Kumar Selvaraj <senthilkumar dot selvaraj at microchip dot com>, Pitchumani Sivanupandi <pitchumani dot sivanupandi at microchip dot com>, Nick Clifton <nickc at redhat dot com>, Denis Chertykov <chertykov at gmail dot com>
- Date: Mon, 12 Jun 2017 18:33:45 +0200
- Subject: Re: [patch,avr] Fix PR21569
- Authentication-results: sourceware.org; auth=none
- References: <df87e461-1568-f174-a573-c47a958e5d25@gjlay.de> <47cf0f02-c46d-f33d-4b88-5ad2d2976d2a@gjlay.de>
On 12.06.2017 18:28, Georg-Johann Lay wrote:
Here is an updated patch that also simplifies the handling of
RODATA_PM_OFFSET so that avr.sc gets a bit simpler.
Output and ChangeLog remain the same.
oops, wrong delta for v2. Again...
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 3aa7e80..b509e23 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -922,7 +922,7 @@ eavrxmega7.c: $(srcdir)/emulparams/avrxmega7.sh \
${GEN_DEPENDS}
eavrtiny.c: $(srcdir)/emulparams/avrtiny.sh \
- $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avrtiny.sc \
+ $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
${GEN_DEPENDS}
ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
diff --git a/ld/Makefile.in b/ld/Makefile.in
index f485f4f..b69d6b8 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -2486,7 +2486,7 @@ eavrxmega7.c: $(srcdir)/emulparams/avrxmega7.sh \
${GEN_DEPENDS}
eavrtiny.c: $(srcdir)/emulparams/avrtiny.sh \
- $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avrtiny.sc \
+ $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
${GEN_DEPENDS}
ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
diff --git a/ld/emulparams/avr1.sh b/ld/emulparams/avr1.sh
index 2f6af99..0fa6eed 100644
--- a/ld/emulparams/avr1.sh
+++ b/ld/emulparams/avr1.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=8K
DATA_ORIGIN=0x800060
DATA_LENGTH=0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr2.sh b/ld/emulparams/avr2.sh
index cb35bb9..e0bdc21 100644
--- a/ld/emulparams/avr2.sh
+++ b/ld/emulparams/avr2.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=8K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr25.sh b/ld/emulparams/avr25.sh
index 2965347..4a6e0a3 100644
--- a/ld/emulparams/avr25.sh
+++ b/ld/emulparams/avr25.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=8K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr3.sh b/ld/emulparams/avr3.sh
index a0b86c4..f02dd39 100644
--- a/ld/emulparams/avr3.sh
+++ b/ld/emulparams/avr3.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=128K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr31.sh b/ld/emulparams/avr31.sh
index 6e1ee0a..0bf3c0f 100644
--- a/ld/emulparams/avr31.sh
+++ b/ld/emulparams/avr31.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=128K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr35.sh b/ld/emulparams/avr35.sh
index abc6790..fe83dc8 100644
--- a/ld/emulparams/avr35.sh
+++ b/ld/emulparams/avr35.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=64K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr4.sh b/ld/emulparams/avr4.sh
index deaf3e7..ccda23f 100644
--- a/ld/emulparams/avr4.sh
+++ b/ld/emulparams/avr4.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=8K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr5.sh b/ld/emulparams/avr5.sh
index 2d0fc4f..64e9d66 100644
--- a/ld/emulparams/avr5.sh
+++ b/ld/emulparams/avr5.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=128K
DATA_ORIGIN=0x800060
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr51.sh b/ld/emulparams/avr51.sh
index 2069dfe..b097771 100644
--- a/ld/emulparams/avr51.sh
+++ b/ld/emulparams/avr51.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=128K
DATA_ORIGIN=0x800100
DATA_LENGTH=0xff00
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avr6.sh b/ld/emulparams/avr6.sh
index c1a4fab..10efa6f 100644
--- a/ld/emulparams/avr6.sh
+++ b/ld/emulparams/avr6.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x800200
DATA_LENGTH=0xfe00
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrtiny.sh b/ld/emulparams/avrtiny.sh
index b4ed14b..4aca22b 100644
--- a/ld/emulparams/avrtiny.sh
+++ b/ld/emulparams/avrtiny.sh
@@ -1,13 +1,19 @@
ARCH=avr:100
MACHINE=
-SCRIPT_NAME=avrtiny
+SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=elf32
-TEXT_ORIGIN=0x0
TEXT_LENGTH=4K
DATA_ORIGIN=0x0800040
DATA_LENGTH=0x100
+RODATA_PM_OFFSET=0x4000
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=config
+
+FUSE_LENGTH=2
+LOCK_LENGTH=2
+SIGNATURE_LENGTH=4
diff --git a/ld/emulparams/avrxmega1.sh b/ld/emulparams/avrxmega1.sh
index 95e8aac..722ee18 100644
--- a/ld/emulparams/avrxmega1.sh
+++ b/ld/emulparams/avrxmega1.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega2.sh b/ld/emulparams/avrxmega2.sh
index f282a69..d9211b2 100644
--- a/ld/emulparams/avrxmega2.sh
+++ b/ld/emulparams/avrxmega2.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega3.sh b/ld/emulparams/avrxmega3.sh
index 7c5a1e5..b33f895 100644
--- a/ld/emulparams/avrxmega3.sh
+++ b/ld/emulparams/avrxmega3.sh
@@ -11,3 +11,11 @@ DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
RODATA_PM_OFFSET=0x8000
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega4.sh b/ld/emulparams/avrxmega4.sh
index 829c8b7..02ef7d7 100644
--- a/ld/emulparams/avrxmega4.sh
+++ b/ld/emulparams/avrxmega4.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega5.sh b/ld/emulparams/avrxmega5.sh
index 0a09aee..93b69da 100644
--- a/ld/emulparams/avrxmega5.sh
+++ b/ld/emulparams/avrxmega5.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega6.sh b/ld/emulparams/avrxmega6.sh
index 3c3a468..f7dae40 100644
--- a/ld/emulparams/avrxmega6.sh
+++ b/ld/emulparams/avrxmega6.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/emulparams/avrxmega7.sh b/ld/emulparams/avrxmega7.sh
index b84a0ba..578f52a 100644
--- a/ld/emulparams/avrxmega7.sh
+++ b/ld/emulparams/avrxmega7.sh
@@ -10,3 +10,11 @@ TEXT_LENGTH=1024K
DATA_ORIGIN=0x802000
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf
+
+FUSE_NAME=fuse
+
+EEPROM_LENGTH=64K
+FUSE_LENGTH=1K
+LOCK_LENGTH=1K
+SIGNATURE_LENGTH=1K
+USER_SIGNATURE_LENGTH=1K
diff --git a/ld/scripttempl/avr.sc b/ld/scripttempl/avr.sc
index 144d32d..1b74dc4 100644
--- a/ld/scripttempl/avr.sc
+++ b/ld/scripttempl/avr.sc
@@ -27,29 +27,21 @@ OUTPUT_ARCH(${ARCH})
__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : $TEXT_LENGTH;
__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : $DATA_LENGTH;
-__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K;
-__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K;
-__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
-__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
-__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
-EOF
-
-if test -n "$RODATA_PM_OFFSET"; then
- cat <<EOF
-__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : $RODATA_PM_OFFSET;
-EOF
-fi
-
-cat <<EOF
+${EEPROM_LENGTH+__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : $EEPROM_LENGTH;}
+__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : $FUSE_LENGTH;
+__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : $LOCK_LENGTH;
+__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : $SIGNATURE_LENGTH;
+${USER_SIGNATURE_LENGTH+__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : $USER_SIGNATURE_LENGTH;}
+${RODATA_PM_OFFSET+__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : $RODATA_PM_OFFSET;}
MEMORY
{
text (rx) : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__
data (rw!x) : ORIGIN = $DATA_ORIGIN, LENGTH = __DATA_REGION_LENGTH__
- eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__
- fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
+${EEPROM_LENGTH+ eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__}
+ $FUSE_NAME (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
- user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__
+${USER_SIGNATURE_LENGTH+ user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__}
}
SECTIONS
@@ -271,6 +263,10 @@ cat <<EOF
${RELOCATING+ _end = . ; }
${RELOCATING+ PROVIDE (__heap_start = .) ; }
} ${RELOCATING+ > data}
+EOF
+
+if test -n "${EEPROM_LENGTH}"; then
+cat <<EOF
.eeprom ${RELOCATING-0}:
{
@@ -278,6 +274,11 @@ cat <<EOF
KEEP(*(.eeprom*))
${RELOCATING+ __eeprom_end = . ; }
} ${RELOCATING+ > eeprom}
+EOF
+fi
+
+if test "$FUSE_NAME" = "fuse" ; then
+cat <<EOF
.fuse ${RELOCATING-0}:
{
@@ -286,6 +287,10 @@ cat <<EOF
KEEP(*(.hfuse))
KEEP(*(.efuse))
} ${RELOCATING+ > fuse}
+EOF
+fi
+
+cat <<EOF
.lock ${RELOCATING-0}:
{
@@ -296,6 +301,19 @@ cat <<EOF
{
KEEP(*(.signature*))
} ${RELOCATING+ > signature}
+EOF
+
+if test "$FUSE_NAME" = "config" ; then
+cat <<EOF
+
+ .config ${RELOCATING-0}:
+ {
+ KEEP(*(.config*))
+ } ${RELOCATING+ > config}
+EOF
+fi
+
+cat <<EOF
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }