[packages/crossavr-binutils] - 2.23.1 - updated to Atmel official AVR8-GNU toolchain version 3.4.2

baggins baggins at pld-linux.org
Wed Jun 12 13:24:50 CEST 2013


commit 31ce1ededf3dde4114f4c5b265202cfeffd1c87f
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Wed Jun 12 13:23:49 2013 +0200

    - 2.23.1
    - updated to Atmel official AVR8-GNU toolchain version 3.4.2

 001-xmega-Makefile_am-typo.patch                   |   23 +
 002-tinycore-support.patch                         |  702 +++
 003-RMW-insn-constriant.patch                      |   37 +
 004-new-part-supports.patch                        |  257 +
 005-additional-part-supports.patch                 |  105 +
 006-xmega-showuage-typo.patch                      |   11 +
 ...ch => 007-ata6289-architecture-correction.patch |   30 +-
 008-add-usersig-section.patch                      |   22 +
 009-dwarf-relax-fix.patch                          |  484 ++
 010-disable-demand-paging.patch                    |   28 +
 ...s-avr-size.patch => 200-binutils-avr-size.patch |  196 +-
 ... 201-binutils-dwarf2-AVRStudio-workaround.patch |    8 +-
 202-binutils-bug13113.patch                        |   48 +
 301-binutils-avr-coff.patch                        | 5506 --------------------
 302-binutils-as-dwarf.patch                        |   19 -
 304-binutils-bug13113.patch                        |  114 -
 305-binutils-new-usb-insns.patch                   |   31 -
 306-binutils-bug15573-AVRTC-419.patch              |   26 -
 307-binutils-fix-AVRTC-424.patch                   |   55 -
 ...atmxt336s.patch => 400-binutils-atmxt336s.patch |   32 +-
 400-binutils-xmega.patch                           |   99 -
 401-binutils-atmega48hvf.patch                     |   48 +
 401-binutils-avrtiny10.patch                       |  218 -
 402-binutils-at90pwm161.patch                      |   73 -
 402-binutils-atmega26hvg.patch                     |   49 +
 ..._224e.patch => 403-binutils-atmxt224_224e.patch |   33 +-
 403-binutils-new-devices.patch                     |   61 -
 404-binutils-atmxt112sl.patch                      |   35 +
 404-binutils-attiny1634.patch                      |   36 -
 405-binutils-atmega48pa.patch                      |   38 -
 405-binutils-atmxt540s.patch                       |   51 +
 ...ils-ata5831.patch => 406-binutils-ata5831.patch |  149 +-
 406-binutils-atxmega_16_32_a4u.patch               |   88 -
 ...attiny841.patch => 407-binutils-attiny841.patch |   20 +-
 407-binutils-atxmega64_128_192_256a3u.patch        |   80 -
 408-binutils-atmegarfa2.patch                      |   87 +
 408-binutils-atmegarfr2_a2.patch                   |   92 -
 409-binutils-ata5790n.patch                        |   34 +
 409-binutils-atmega165pa.patch                     |   34 -
 410-binutils-atmega64hve2.patch                    |   40 +
 410-binutils-atxmega384c3.patch                    |   46 -
 411-binutils-attiny474.patch                       |   38 +
 412-binutils-atmxts200.patch                       |   34 +
 412-binutils-atxmega128a4u.patch                   |   34 -
 413-binutils-atxmega64d4.patch                     |   37 -
 414-binutils-atmega164pa_168pa_32a_64a.patch       |   88 -
 415-binutils-atxmega64_128_b3.patch                |   59 -
 416-binutils-atxmega64b1.patch                     |   34 -
 417-binutils-atmega_8a_128a_1284.patch             |   65 -
 418-binutils-atxmega64a4u.patch                    |   34 -
 419-binutils-atxmega128d4.patch                    |   34 -
 421-binutils-atxmega16c4_32c4_128c3_256c3.patch    |   94 -
 422-binutils-atxmega384d3.patch                    |   43 -
 423-binutils-atmega48hvf.patch                     |   44 -
 424-binutils-atmega26hvg.patch                     |   43 -
 426-binutils-atxmega192c3.patch                    |   34 -
 427-binutils-atmxt112sl.patch                      |   37 -
 428-binutils-atxmega64c3.patch                     |   34 -
 429-binutils-ata6285_6286.patch                    |   36 -
 430-binutils-attiny828.patch                       |   34 -
 431-binutils-ata5790_5790N_5795.patch              |   47 -
 432-binutils-ata5272_5505.patch                    |   55 -
 433-binutils-atmxt540s.patch                       |   50 -
 436-binutils-atxmega32_16_8e5.patch                |   38 -
 500-binutils-avrtc530-backported.patch             |   33 +
 500-binutils-bug13789.patch                        |  379 --
 501-binutils-modify-usb-xmega-isa.patch            |   28 -
 502-binutils-add-config-section-tiny.patch         |   32 -
 503-binutils-avrtc193-tiny.patch                   |  227 -
 504-binutils-avrtc530-backported.patch             |   24 -
 crossavr-binutils.spec                             |  109 +-
 71 files changed, 2472 insertions(+), 8551 deletions(-)
---
diff --git a/crossavr-binutils.spec b/crossavr-binutils.spec
index eec42f0..9df9f2a 100644
--- a/crossavr-binutils.spec
+++ b/crossavr-binutils.spec
@@ -5,65 +5,43 @@ Summary(pl.UTF-8):	Skrośne narzędzia programistyczne GNU dla AVR - binutils
 Summary(pt_BR.UTF-8):	Utilitários para desenvolvimento de binários da GNU - AVR binutils
 Summary(tr.UTF-8):	GNU geliştirme araçları - AVR binutils
 Name:		crossavr-binutils
-Version:	2.22
-Release:	3
+Version:	2.23.1
+Release:	1
 Epoch:		1
 Patch0:		am.patch
-# Patches 1xx are taken form Atmel official AVR8-GNU toolchain version 3.4.1.830
-Patch100:	300-binutils-avr-size.patch
-Patch101:	301-binutils-avr-coff.patch
-Patch102:	302-binutils-as-dwarf.patch
-Patch103:	303-binutils-dwarf2-AVRStudio-workaround.patch
-Patch104:	304-binutils-bug13113.patch
-Patch105:	305-binutils-new-usb-insns.patch
-Patch106:	306-binutils-bug15573-AVRTC-419.patch
-Patch107:	307-binutils-fix-AVRTC-424.patch
-Patch108:	400-binutils-xmega.patch
-Patch109:	401-binutils-avrtiny10.patch
-Patch110:	402-binutils-at90pwm161.patch
-Patch111:	403-binutils-new-devices.patch
-Patch112:	404-binutils-attiny1634.patch
-Patch113:	405-binutils-atmega48pa.patch
-Patch114:	406-binutils-atxmega_16_32_a4u.patch
-Patch115:	407-binutils-atxmega64_128_192_256a3u.patch
-Patch116:	408-binutils-atmegarfr2_a2.patch
-Patch117:	409-binutils-atmega165pa.patch
-Patch118:	410-binutils-atxmega384c3.patch
-Patch119:	412-binutils-atxmega128a4u.patch
-Patch120:	413-binutils-atxmega64d4.patch
-Patch121:	414-binutils-atmega164pa_168pa_32a_64a.patch
-Patch122:	415-binutils-atxmega64_128_b3.patch
-Patch123:	416-binutils-atxmega64b1.patch
-Patch124:	417-binutils-atmega_8a_128a_1284.patch
-Patch125:	418-binutils-atxmega64a4u.patch
-Patch126:	419-binutils-atxmega128d4.patch
-Patch127:	420-binutils-atmxt336s.patch
-Patch128:	421-binutils-atxmega16c4_32c4_128c3_256c3.patch
-Patch129:	422-binutils-atxmega384d3.patch
-Patch130:	423-binutils-atmega48hvf.patch
-Patch131:	424-binutils-atmega26hvg.patch
-Patch132:	425-binutils-atmxt224_224e.patch
-Patch133:	426-binutils-atxmega192c3.patch
-Patch134:	427-binutils-atmxt112sl.patch
-Patch135:	428-binutils-atxmega64c3.patch
-Patch136:	429-binutils-ata6285_6286.patch
-Patch137:	430-binutils-attiny828.patch
-Patch138:	431-binutils-ata5790_5790N_5795.patch
-Patch139:	432-binutils-ata5272_5505.patch
-Patch140:	433-binutils-atmxt540s.patch
-Patch141:	434-binutils-ata5831.patch
-Patch142:	435-binutils-attiny841.patch
-Patch143:	436-binutils-atxmega32_16_8e5.patch
-Patch144:	500-binutils-bug13789.patch
-Patch145:	501-binutils-modify-usb-xmega-isa.patch
-Patch146:	502-binutils-add-config-section-tiny.patch
-Patch147:	503-binutils-avrtc193-tiny.patch
-Patch148:	504-binutils-avrtc530-backported.patch
-Patch149:	505-binutils-avrtc446.patch
+# Patches 1xx are taken form Atmel official AVR8-GNU toolchain version 3.4.2
+# http://distribute.atmel.no/tools/opensource/Atmel-AVR-Toolchain-3.4.2/avr/avr-patches.tar.gz
+Patch100:	001-xmega-Makefile_am-typo.patch
+Patch101:	002-tinycore-support.patch
+Patch102:	003-RMW-insn-constriant.patch
+Patch103:	004-new-part-supports.patch
+Patch104:	005-additional-part-supports.patch
+Patch105:	006-xmega-showuage-typo.patch
+Patch106:	007-ata6289-architecture-correction.patch
+Patch107:	008-add-usersig-section.patch
+Patch108:	009-dwarf-relax-fix.patch
+Patch109:	010-disable-demand-paging.patch
+Patch110:	200-binutils-avr-size.patch
+Patch111:	201-binutils-dwarf2-AVRStudio-workaround.patch
+Patch112:	202-binutils-bug13113.patch
+Patch113:	400-binutils-atmxt336s.patch
+Patch114:	401-binutils-atmega48hvf.patch
+Patch115:	402-binutils-atmega26hvg.patch
+Patch116:	403-binutils-atmxt224_224e.patch
+Patch117:	404-binutils-atmxt112sl.patch
+Patch118:	405-binutils-atmxt540s.patch
+Patch119:	406-binutils-ata5831.patch
+Patch120:	407-binutils-attiny841.patch
+Patch121:	408-binutils-atmegarfa2.patch
+Patch122:	409-binutils-ata5790n.patch
+Patch123:	410-binutils-atmega64hve2.patch
+Patch124:	411-binutils-attiny474.patch
+Patch125:	412-binutils-atmxts200.patch
+Patch126:	500-binutils-avrtc530-backported.patch
 License:	GPL
 Group:		Development/Tools
 Source0:	ftp://ftp.gnu.org/gnu/binutils/binutils-%{version}.tar.bz2
-# Source0-md5:	ee0f10756c84979622b992a4a61ea3f5
+# Source0-md5:	33adb18c3048d057ac58d07a3f1adb38
 URL:		http://sources.redhat.com/binutils/
 BuildRequires:	automake
 BuildRequires:	bash
@@ -135,29 +113,6 @@ Ten pakiet zawiera wersję skrośną generującą kod dla Atmel AVR.
 %patch124 -p0
 %patch125 -p0
 %patch126 -p0
-%patch127 -p0
-%patch128 -p0
-%patch129 -p0
-%patch130 -p0
-%patch131 -p0
-%patch132 -p0
-%patch133 -p0
-%patch134 -p0
-%patch135 -p0
-%patch136 -p0
-%patch137 -p0
-%patch138 -p0
-%patch139 -p0
-%patch140 -p0
-%patch141 -p0
-%patch142 -p0
-%patch143 -p0
-%patch144 -p0
-%patch145 -p0
-%patch146 -p0
-%patch147 -p0
-%patch148 -p0
-%patch149 -p0
 
 # Remove hacks for specific autoconf version.
 echo > config/override.m4
diff --git a/001-xmega-Makefile_am-typo.patch b/001-xmega-Makefile_am-typo.patch
new file mode 100644
index 0000000..9e6e965
--- /dev/null
+++ b/001-xmega-Makefile_am-typo.patch
@@ -0,0 +1,23 @@
+--- ld/Makefile.am	2012-08-23 11:16:38.000000000 +0530
++++ ld/Makefile.am	2012-08-24 15:39:45.000000000 +0530
+@@ -165,13 +165,13 @@ ALL_EMULATION_SOURCES = \
+ 	eavr5.c \
+ 	eavr51.c \
+ 	eavr6.c \
+-	eavrxmega1.o \
+-	eavrxmega2.o \
+-	eavrxmega3.o \
+-	eavrxmega4.o \
+-	eavrxmega5.o \
+-	eavrxmega6.o \
+-	eavrxmega7.o \
++	eavrxmega1.c \
++	eavrxmega2.c \
++	eavrxmega3.c \
++	eavrxmega4.c \
++	eavrxmega5.c \
++	eavrxmega6.c \
++	eavrxmega7.c \
+ 	ecoff_i860.c \
+ 	ecoff_sparc.c \
+ 	ecrisaout.c \
diff --git a/002-tinycore-support.patch b/002-tinycore-support.patch
new file mode 100644
index 0000000..5cd3b9b
--- /dev/null
+++ b/002-tinycore-support.patch
@@ -0,0 +1,702 @@
+diff -Naurp bfd/archures.c bfd/archures.c
+--- bfd/archures.c	2012-09-04 18:23:41.000000000 +0530
++++ bfd/archures.c	2012-12-21 14:14:42.000000000 +0530
+@@ -391,6 +391,7 @@ DESCRIPTION
+ .#define bfd_mach_avr5		5
+ .#define bfd_mach_avr51		51
+ .#define bfd_mach_avr6		6
++.#define bfd_mach_avrtiny   90
+ .#define bfd_mach_avrxmega1 101
+ .#define bfd_mach_avrxmega2 102
+ .#define bfd_mach_avrxmega3 103
+diff -Naurp bfd/cpu-avr.c bfd/cpu-avr.c
+--- bfd/cpu-avr.c	2012-01-31 23:24:35.000000000 +0530
++++ bfd/cpu-avr.c	2012-12-21 14:14:42.000000000 +0530
+@@ -135,24 +135,27 @@ static const bfd_arch_info_type arch_inf
+ 
+   /* 3-Byte PC.  */
+   N (22, bfd_mach_avr6, "avr:6", FALSE, & arch_info_struct[10]),
+-  
++
++  /* Tiny core (ATTiny10 & similar) */
++  N (16, bfd_mach_avrtiny, "avr:90", FALSE, & arch_info_struct[11]),
++
+   /* Xmega 1 */
+-  N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[11]),
++  N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[12]),
+ 
+   /* Xmega 2 */
+-  N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[12]),
++  N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[13]),
+   
+   /* Xmega 3 */
+-  N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[13]),
++  N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[14]),
+   
+   /* Xmega 4 */
+-  N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[14]),
++  N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[15]),
+   
+   /* Xmega 5 */
+-  N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[15]),
++  N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[16]),
+   
+   /* Xmega 6 */
+-  N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[16]),
++  N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[17]),
+   
+   /* Xmega 7 */
+   N (24, bfd_mach_avrxmega7, "avr:107", FALSE, NULL)
+diff -Naurp bfd/elf32-avr.c bfd/elf32-avr.c
+--- bfd/elf32-avr.c	2012-07-25 03:14:44.000000000 +0530
++++ bfd/elf32-avr.c	2012-12-21 14:14:42.000000000 +0530
+@@ -559,6 +559,20 @@ static reloc_howto_type elf_avr_howto_ta
+ 	 0xffffff,		/* src_mask */
+ 	 0xffffff,		/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
++  /* 7 bit immediate for LDS/STS in Tiny core */
++  HOWTO (R_AVR_7_LDS16,         /* type */
++         0,                     /* rightshift */
++         1,                     /* size (0 = byte, 1 = short, 2 = long) */
++         7,                     /* bitsize */  
++         FALSE,                 /* pc_relative */
++         0,                     /* bitpos */
++         complain_overflow_dont,/* complain_on_overflow */
++         bfd_elf_generic_reloc, /* special_function */
++         "R_AVR_7_LDS16",       /* name */
++         FALSE,                 /* partial_inplace */
++         0xffff,                /* src_mask */
++         0xffff,                /* dst_mask */
++         FALSE),                /* pcrel_offset */
+ };
+ 
+ /* Map BFD reloc types to AVR ELF reloc types.  */
+@@ -600,7 +614,8 @@ static const struct avr_reloc_map avr_re
+   { BFD_RELOC_8,                    R_AVR_8 },
+   { BFD_RELOC_AVR_8_LO,             R_AVR_8_LO8 },
+   { BFD_RELOC_AVR_8_HI,             R_AVR_8_HI8 },
+-  { BFD_RELOC_AVR_8_HLO,            R_AVR_8_HLO8 }
++  { BFD_RELOC_AVR_8_HLO,            R_AVR_8_HLO8 },
++  { BFD_RELOC_AVR_7_LDS16,          R_AVR_7_LDS16 }
+ };
+ 
+ /* Meant to be filled one day with the wrap around address for the
+@@ -1131,6 +1146,17 @@ avr_final_link_relocate (reloc_howto_typ
+       bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
+       break;
+ 
++    case R_AVR_7_LDS16:
++      contents += rel->r_offset;
++      srel = (bfd_signed_vma) relocation + rel->r_addend;
++      if ((srel & 0xFFFF) < 0x40 || (srel & 0xFFFF) > 0xbf)
++        return bfd_reloc_outofrange;
++      srel = srel & 0x7f;
++      x = bfd_get_16 (input_bfd, contents);
++      x |= (srel & 0x0f) | ((srel & 0x30) << 5) | ((srel & 0x40) << 2);
++      bfd_put_16 (input_bfd, x, contents);
++      break;
++
+     case R_AVR_16_PM:
+       use_stubs = (!htab->no_stubs);
+       contents += rel->r_offset;
+@@ -1372,6 +1398,10 @@ bfd_elf_avr_final_write_processing (bfd 
+     case bfd_mach_avrxmega7:
+       val = E_AVR_MACH_XMEGA7;
+       break;
++
++    case bfd_mach_avrtiny:
++      val = E_AVR_MACH_AVRTINY;
++      break;
+     }
+ 
+   elf_elfheader (abfd)->e_machine = EM_AVR;
+@@ -1462,6 +1492,10 @@ elf32_avr_object_p (bfd *abfd)
+ 	case E_AVR_MACH_XMEGA7:
+ 	  e_set = bfd_mach_avrxmega7;
+ 	  break;
++
++	case E_AVR_MACH_AVRTINY:
++	  e_set = bfd_mach_avrtiny;
++	  break;
+ 	}
+     }
+   return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
+diff -Naurp bfd/reloc.c bfd/reloc.c
+--- bfd/reloc.c	2012-09-04 18:23:42.000000000 +0530
++++ bfd/reloc.c	2012-12-21 14:14:42.000000000 +0530
+@@ -4409,6 +4409,11 @@ ENUM
+ ENUMDOC
+   This is a 8 bit reloc for the AVR that stores bits 16..23 of a symbol
+   in .byte hlo8(symbol)
++ENUM
++  BFD_RELOC_AVR_7_LDS16
++ENUMDOC
++  This is a 7 bit reloc for the AVR that stores offset for 16bit sts/lds
++  instructions supported only by Tiny core
+ 
+ ENUM
+   BFD_RELOC_RL78_NEG8
+diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
+--- gas/config/tc-avr.c	2012-06-11 19:56:41.000000000 +0530
++++ gas/config/tc-avr.c	2012-12-21 14:14:42.000000000 +0530
+@@ -89,6 +89,7 @@ static struct mcu_type_s mcu_types[] =
+   {"avrxmega5",  AVR_ISA_XMEGA,   bfd_mach_avrxmega5},
+   {"avrxmega6",  AVR_ISA_XMEGA,   bfd_mach_avrxmega6},
+   {"avrxmega7",  AVR_ISA_XMEGA,   bfd_mach_avrxmega7},
++  {"avrtiny",    AVR_ISA_AVRTINY, bfd_mach_avrtiny},
+   {"at90s1200",  AVR_ISA_1200,    bfd_mach_avr1},
+   {"attiny11",   AVR_ISA_AVR1,    bfd_mach_avr1},
+   {"attiny12",   AVR_ISA_AVR1,    bfd_mach_avr1},
+@@ -274,6 +275,12 @@ static struct mcu_type_s mcu_types[] =
+   {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+   {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
+   {"atxmega128a1u", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
++  {"attiny4",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
++  {"attiny5",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
++  {"attiny9",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
++  {"attiny10",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
++  {"attiny20",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
++  {"attiny40",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
+   {NULL, 0, 0}
+ };
+ 
+@@ -455,6 +462,7 @@ md_show_usage (FILE *stream)
+ 	"                   avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
+ 	"                   avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
+ 	"                   avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
++	"                   avrtiny   - AVR Tiny core\n"
+ 	"                   or immediate microcontroller name.\n"));
+   fprintf (stream,
+       _("  -mall-opcodes    accept all AVR opcodes, even if not supported by MCU\n"
+@@ -803,6 +811,12 @@ avr_operand (struct avr_opcodes_s *opcod
+ 	  str = input_line_pointer;
+ 	}
+ 
++      if (avr_mcu->mach == bfd_mach_avrtiny)
++        {
++          if (op_mask < 16 || op_mask > 31)
++            as_bad (_("register not supported"));
++        }
++
+       if (op_mask <= 31)
+ 	{
+ 	  switch (*op)
+@@ -941,6 +955,12 @@ avr_operand (struct avr_opcodes_s *opcod
+ 		   &op_expr, FALSE, BFD_RELOC_16);
+       break;
+ 
++    case 'j':
++      str = parse_exp (str, &op_expr);
++      fix_new_exp (frag_now, where, opcode->insn_size * 2,
++                   &op_expr, FALSE, BFD_RELOC_AVR_7_LDS16);
++      break;
++
+     case 'M':
+       {
+ 	bfd_reloc_code_real_type r_type;
+@@ -1249,6 +1269,17 @@ md_apply_fix (fixS *fixP, valueT * valP,
+ 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
+ 	  break;
+ 
++        case BFD_RELOC_AVR_7_LDS16:
++          if ((value < 0x40) || (value > 0xBF))
++            as_warn_where (fixP->fx_file, fixP->fx_line,
++                           _("operand out of range: 0x%lx"), 
++                           (unsigned long)value);
++          insn |= value & 0xF;
++          insn |= (value & 0x30) << 5;
++          insn |= (value & 0x40) << 2;
++          bfd_putl16 ((bfd_vma) insn, where);
++          break;
++
+ 	case BFD_RELOC_AVR_6:
+ 	  if ((value > 63) || (value < 0))
+ 	    as_bad_where (fixP->fx_file, fixP->fx_line,
+@@ -1448,6 +1479,28 @@ md_assemble (char *str)
+ 
+   opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
+ 
++  if (opcode && !avr_opt.all_opcodes)
++    {
++      /* Check if the instruction's ISA bit is ON in the ISA bits of the part 
++         specified by the user. If not look for other instructions specifica-
++         -tions with same mnemonic who's ISA bits matches. 
++
++         This requires include/opcode/avr.h to have the instructions with
++         same mnenomic to be specified in sequence. */
++
++      while ((opcode->isa & avr_mcu->isa) != opcode->isa)
++        {
++          opcode++;
++     
++          if (opcode->name && strcmp(op, opcode->name))
++            {
++              as_bad (_("illegal opcode %s for mcu %s"), 
++                      opcode->name, avr_mcu->name);
++              return;
++            }
++        }
++    } 
++
+   if (opcode == NULL)
+     {
+       as_bad (_("unknown opcode `%s'"), op);
+@@ -1460,9 +1513,6 @@ md_assemble (char *str)
+   if (*str && *opcode->constraints == '?')
+     ++opcode;
+ 
+-  if (!avr_opt.all_opcodes && (opcode->isa & avr_mcu->isa) != opcode->isa)
+-    as_bad (_("illegal opcode %s for mcu %s"), opcode->name, avr_mcu->name);
+-
+   dwarf2_emit_insn (0);
+ 
+   /* We used to set input_line_pointer to the result of get_operands,
+diff -Naurp include/elf/avr.h include/elf/avr.h
+--- include/elf/avr.h	2012-05-16 20:22:16.000000000 +0530
++++ include/elf/avr.h	2012-12-21 14:14:42.000000000 +0530
+@@ -41,13 +41,14 @@
+ #define E_AVR_MACH_AVR5     5
+ #define E_AVR_MACH_AVR51   51
+ #define E_AVR_MACH_AVR6     6 
+-#define E_AVR_MACH_XMEGA1 101
+-#define E_AVR_MACH_XMEGA2 102
+-#define E_AVR_MACH_XMEGA3 103
+-#define E_AVR_MACH_XMEGA4 104
+-#define E_AVR_MACH_XMEGA5 105
+-#define E_AVR_MACH_XMEGA6 106
+-#define E_AVR_MACH_XMEGA7 107
++#define E_AVR_MACH_AVRTINY 90
++#define E_AVR_MACH_XMEGA1  101
++#define E_AVR_MACH_XMEGA2  102
++#define E_AVR_MACH_XMEGA3  103
++#define E_AVR_MACH_XMEGA4  104
++#define E_AVR_MACH_XMEGA5  105
++#define E_AVR_MACH_XMEGA6  106
++#define E_AVR_MACH_XMEGA7  107
+ 
+ /* Relocations.  */
+ START_RELOC_NUMBERS (elf_avr_reloc_type)
+@@ -81,6 +82,7 @@ START_RELOC_NUMBERS (elf_avr_reloc_type)
+      RELOC_NUMBER (R_AVR_8_LO8,                27)
+      RELOC_NUMBER (R_AVR_8_HI8,                28)
+      RELOC_NUMBER (R_AVR_8_HLO8,               29)
++     RELOC_NUMBER (R_AVR_7_LDS16,              30)
+ END_RELOC_NUMBERS (R_AVR_max)
+ 
+ #endif /* _ELF_AVR_H */
+diff -Naurp include/opcode/avr.h include/opcode/avr.h
+--- include/opcode/avr.h	2012-06-07 22:13:36.000000000 +0530
++++ include/opcode/avr.h	2012-12-21 14:14:42.000000000 +0530
+@@ -22,6 +22,7 @@
+ #define AVR_ISA_LPM   0x0002 /* device has LPM */
+ #define AVR_ISA_LPMX  0x0004 /* device has LPM Rd,Z[+] */
+ #define AVR_ISA_SRAM  0x0008 /* device has SRAM (LD, ST, PUSH, POP, ...) */
++#define AVR_ISA_TINY  0x0010 /* device has Tiny core specific encodings */
+ #define AVR_ISA_MEGA  0x0020 /* device has >8K program memory (JMP and CALL
+ 				supported, no 8K wrap on RJMP and RCALL) */
+ #define AVR_ISA_MUL   0x0040 /* device has new core (MUL, FMUL, ...) */
+@@ -37,6 +38,7 @@
+ 
+ #define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM)
+ #define AVR_ISA_2xxx  (AVR_ISA_TINY1 | AVR_ISA_SRAM)
++#define AVR_ISA_2xxxa (AVR_ISA_1200 | AVR_ISA_SRAM)
+ /* For the attiny26 which is missing LPM Rd,Z+.  */
+ #define AVR_ISA_2xxe  (AVR_ISA_2xxx | AVR_ISA_LPMX)
+ #define AVR_ISA_RF401 (AVR_ISA_2xxx | AVR_ISA_MOVW | AVR_ISA_LPMX)
+@@ -71,6 +73,9 @@
+                         AVR_ISA_ELPM | AVR_ISA_ELPMX | AVR_ISA_SPM | \
+                         AVR_ISA_BRK | AVR_ISA_EIND | AVR_ISA_MOVW)
+ 
++#define AVR_ISA_AVRTINY (AVR_ISA_1200 | AVR_ISA_BRK | AVR_ISA_SRAM | \
++                         AVR_ISA_TINY)
++
+ #define REGISTER_P(x) ((x) == 'r'		\
+ 		       || (x) == 'd'		\
+ 		       || (x) == 'w'		\
+@@ -109,6 +114,7 @@
+    p - Port address value from 0 to 31. (cbi, sbi, sbic, sbis)
+    K - immediate value from 0 to 63 (used in `adiw', `sbiw')
+    i - immediate value
++   j - 7 bit immediate value from 0x40 to 0xBF (for 16-bit 'lds'/'sts')
+    l - signed pc relative offset from -64 to 63
+    L - signed pc relative offset from -2048 to 2047
+    h - absolute code address (call, jmp)
+@@ -159,8 +165,8 @@ AVR_INSN (sez,  "",    "1001010000011000
+ AVR_INSN (bclr, "S",   "100101001SSS1000", 1, AVR_ISA_1200, 0x9488)
+ AVR_INSN (bset, "S",   "100101000SSS1000", 1, AVR_ISA_1200, 0x9408)
+ 
+-AVR_INSN (icall,"",    "1001010100001001", 1, AVR_ISA_2xxx, 0x9509)
+-AVR_INSN (ijmp, "",    "1001010000001001", 1, AVR_ISA_2xxx, 0x9409)
++AVR_INSN (icall,"",    "1001010100001001", 1, AVR_ISA_2xxxa,0x9509)
++AVR_INSN (ijmp, "",    "1001010000001001", 1, AVR_ISA_2xxxa,0x9409)
+ 
+ AVR_INSN (lpm,  "?",   "1001010111001000", 1, AVR_ISA_TINY1,0x95c8)
+ AVR_INSN (lpm,  "r,z", "1001000ddddd010+", 1, AVR_ISA_LPMX, 0x9004)
+@@ -260,8 +266,8 @@ AVR_INSN (dec,  "r",   "1001010rrrrr1010
+ AVR_INSN (inc,  "r",   "1001010rrrrr0011", 1, AVR_ISA_1200, 0x9403)
+ AVR_INSN (lsr,  "r",   "1001010rrrrr0110", 1, AVR_ISA_1200, 0x9406)
+ AVR_INSN (neg,  "r",   "1001010rrrrr0001", 1, AVR_ISA_1200, 0x9401)
+-AVR_INSN (pop,  "r",   "1001000rrrrr1111", 1, AVR_ISA_2xxx, 0x900f)
+-AVR_INSN (push, "r",   "1001001rrrrr1111", 1, AVR_ISA_2xxx, 0x920f)
++AVR_INSN (pop,  "r",   "1001000rrrrr1111", 1, AVR_ISA_2xxxa,0x900f)
++AVR_INSN (push, "r",   "1001001rrrrr1111", 1, AVR_ISA_2xxxa,0x920f)
+ AVR_INSN (ror,  "r",   "1001010rrrrr0111", 1, AVR_ISA_1200, 0x9407)
+ AVR_INSN (swap, "r",   "1001010rrrrr0010", 1, AVR_ISA_1200, 0x9402)
+ 
+@@ -279,8 +285,10 @@ AVR_INSN (fmul, "a,a", "000000110ddd1rrr
+ AVR_INSN (fmuls,"a,a", "000000111ddd0rrr", 1, AVR_ISA_MUL,  0x0380)
+ AVR_INSN (fmulsu,"a,a","000000111ddd1rrr", 1, AVR_ISA_MUL,  0x0388)
+ 
+-AVR_INSN (sts,  "i,r", "1001001ddddd0000", 2, AVR_ISA_2xxx, 0x9200)
+-AVR_INSN (lds,  "r,i", "1001000ddddd0000", 2, AVR_ISA_2xxx, 0x9000)
++AVR_INSN (sts, "j,d", "10101kkkddddkkkk", 1, AVR_ISA_TINY, 0xA800)
++AVR_INSN (sts, "i,r", "1001001ddddd0000", 2, AVR_ISA_2xxx, 0x9200)
++AVR_INSN (lds, "d,j", "10100kkkddddkkkk", 1, AVR_ISA_TINY, 0xA000)
++AVR_INSN (lds, "r,i", "1001000ddddd0000", 2, AVR_ISA_2xxx, 0x9000)
+ 
+    /* Special case for b+0, `e' must be next entry after `b',
+       b={Y=1,Z=0}, ee={X=11,Y=10,Z=00}, !=1 if -e or e+ or X.  */
+diff -Naurp ld/configure.tgt ld/configure.tgt
+--- ld/configure.tgt	2012-09-04 18:23:47.000000000 +0530
++++ ld/configure.tgt	2012-12-21 14:14:42.000000000 +0530
+@@ -118,7 +118,7 @@ arm*-*-uclinux*)	targ_emul=armelf_linux
+ arm-*-vxworks)		targ_emul=armelf_vxworks ;;
+ arm*-*-conix*)		targ_emul=armelf ;;
+ avr-*-*)		targ_emul=avr2
+-			targ_extra_emuls="avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7"
++			targ_extra_emuls="avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny"
+ 			;;
+ bfin-*-elf)		targ_emul=elf32bfin;
+ 			targ_extra_emuls="elf32bfinfd"
+diff -Naurp ld/emulparams/avrtiny.sh ld/emulparams/avrtiny.sh
+--- ld/emulparams/avrtiny.sh	1970-01-01 05:30:00.000000000 +0530
++++ ld/emulparams/avrtiny.sh	2012-12-21 14:14:42.000000000 +0530
+@@ -0,0 +1,13 @@
++ARCH=avr:90
++MACHINE=
++SCRIPT_NAME=avrtiny
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_ORIGIN=0x0
++TEXT_LENGTH=4K
++DATA_ORIGIN=0x0800040
++DATA_LENGTH=0x100
++EXTRA_EM_FILE=avrelf
+diff -Naurp ld/Makefile.am ld/Makefile.am
+--- ld/Makefile.am	2012-12-21 14:15:39.000000000 +0530
++++ ld/Makefile.am	2012-12-21 14:14:42.000000000 +0530
+@@ -172,6 +172,7 @@ ALL_EMULATION_SOURCES = \
+ 	eavrxmega5.c \
+ 	eavrxmega6.c \
+ 	eavrxmega7.c \
++	eavrtiny.c   \
+ 	ecoff_i860.c \
+ 	ecoff_sparc.c \
+ 	ecrisaout.c \
+@@ -844,9 +845,13 @@ eavrxmega6.c: $(srcdir)/emulparams/avrxm
+   ${GEN_DEPENDS}
+ 	${GENSCRIPTS} avrxmega6 "$(tdir_avr2)"
+ eavrxmega7.c: $(srcdir)/emulparams/avrxmega7.sh \
+-  $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
++  $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avrtiny.sc \
+   ${GEN_DEPENDS}
+ 	${GENSCRIPTS} avrxmega7 "$(tdir_avr2)"
++eavrtiny.c: $(srcdir)/emulparams/avrtiny.sh \
++  $(srcdir)/emultempl/avrelf.em $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
++  ${GEN_DEPENDS}
++	${GENSCRIPTS} avrtiny "$(tdir_avr2)"
+ ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
+   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i860coff.sc ${GEN_DEPENDS}
+ 	${GENSCRIPTS} coff_i860 "$(tdir_coff_i860)"
+diff -Naurp ld/scripttempl/avrtiny.sc ld/scripttempl/avrtiny.sc
+--- ld/scripttempl/avrtiny.sc	1970-01-01 05:30:00.000000000 +0530
++++ ld/scripttempl/avrtiny.sc	2012-12-21 14:14:42.000000000 +0530
+@@ -0,0 +1,250 @@
++cat <<EOF
++OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
++OUTPUT_ARCH(${ARCH})
++
++MEMORY
++{
++  text   (rx)   : ORIGIN = $TEXT_ORIGIN, LENGTH = $TEXT_LENGTH
++  data   (rw!x) : ORIGIN = $DATA_ORIGIN, LENGTH = $DATA_LENGTH
++
++  /* Provide offsets for config, lock and signature to match
++     production file format. Ignore offsets in datasheet.  */
++
++  config(rw!x)     : ORIGIN = 0x820000, LENGTH = 2
++  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 2
++  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 4
++}
++
++SECTIONS
++{
++  /* Read-only sections, merged into text segment: */
++  ${TEXT_DYNAMIC+${DYNAMIC}}
++  .hash        ${RELOCATING-0} : { *(.hash)		}
++  .dynsym      ${RELOCATING-0} : { *(.dynsym)		}
++  .dynstr      ${RELOCATING-0} : { *(.dynstr)		}
++  .gnu.version ${RELOCATING-0} : { *(.gnu.version)	}
++  .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d)	}
++  .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r)	}
++
++  .rel.init    ${RELOCATING-0} : { *(.rel.init)	}
++  .rela.init   ${RELOCATING-0} : { *(.rela.init)	}
++  .rel.text    ${RELOCATING-0} :
++    {
++      *(.rel.text)
++      ${RELOCATING+*(.rel.text.*)}
++      ${RELOCATING+*(.rel.gnu.linkonce.t*)}
++    }
++  .rela.text   ${RELOCATING-0} :
++    {
++      *(.rela.text)
++      ${RELOCATING+*(.rela.text.*)}
++      ${RELOCATING+*(.rela.gnu.linkonce.t*)}
++    }
++  .rel.fini    ${RELOCATING-0} : { *(.rel.fini)	}
++  .rela.fini   ${RELOCATING-0} : { *(.rela.fini)	}
++  .rel.rodata  ${RELOCATING-0} :
++    {
++      *(.rel.rodata)
++      ${RELOCATING+*(.rel.rodata.*)}
++      ${RELOCATING+*(.rel.gnu.linkonce.r*)}
++    }
++  .rela.rodata ${RELOCATING-0} :
++    {
++      *(.rela.rodata)
++      ${RELOCATING+*(.rela.rodata.*)}
++      ${RELOCATING+*(.rela.gnu.linkonce.r*)}
++    }
++  .rel.data    ${RELOCATING-0} :
++    {
++      *(.rel.data)
++      ${RELOCATING+*(.rel.data.*)}
++      ${RELOCATING+*(.rel.gnu.linkonce.d*)}
++    }
++  .rela.data   ${RELOCATING-0} :
++    {
++      *(.rela.data)
++      ${RELOCATING+*(.rela.data.*)}
++      ${RELOCATING+*(.rela.gnu.linkonce.d*)}
++    }
++  .rel.ctors   ${RELOCATING-0} : { *(.rel.ctors)	}
++  .rela.ctors  ${RELOCATING-0} : { *(.rela.ctors)	}
++  .rel.dtors   ${RELOCATING-0} : { *(.rel.dtors)	}
++  .rela.dtors  ${RELOCATING-0} : { *(.rela.dtors)	}
++  .rel.got     ${RELOCATING-0} : { *(.rel.got)		}
++  .rela.got    ${RELOCATING-0} : { *(.rela.got)	}
++  .rel.bss     ${RELOCATING-0} : { *(.rel.bss)		}
++  .rela.bss    ${RELOCATING-0} : { *(.rela.bss)	}
++  .rel.plt     ${RELOCATING-0} : { *(.rel.plt)		}
++  .rela.plt    ${RELOCATING-0} : { *(.rela.plt)	}
++
++  /* Internal text space or external memory.  */
++  .text ${RELOCATING-0} : ${RELOCATING+ AT (0x0)}
++  {
++    *(.vectors)
++    KEEP(*(.vectors))
++
++    /* For data that needs to reside in the lower 64k of progmem.  */
++    *(.progmem.gcc*)
++    *(.progmem*)
++    ${RELOCATING+. = ALIGN(2);}
++
++    ${CONSTRUCTING+ __trampolines_start = . ; }
++    /* The jump trampolines for the 16-bit limited relocs will reside here.  */
++    *(.trampolines)
++    *(.trampolines*)
++    ${CONSTRUCTING+ __trampolines_end = . ; }
++
++    /* For future tablejump instruction arrays for 3 byte pc devices.
++       We don't relax jump/call instructions within these sections.  */
++    *(.jumptables) 
++    *(.jumptables*) 
++
++    /* For code that needs to reside in the lower 128k progmem.  */
++    *(.lowtext)
++    *(.lowtext*)
++
++    ${CONSTRUCTING+ __ctors_start = . ; }
++    ${CONSTRUCTING+ *(.ctors) }
++    ${CONSTRUCTING+ __ctors_end = . ; }
++    ${CONSTRUCTING+ __dtors_start = . ; }
++    ${CONSTRUCTING+ *(.dtors) }
++    ${CONSTRUCTING+ __dtors_end = . ; }
++    KEEP(SORT(*)(.ctors))
++    KEEP(SORT(*)(.dtors))
++
++    /* From this point on, we don't bother about wether the insns are
++       below or above the 16 bits boundary.  */
++    *(.init0)  /* Start here after reset.  */
++    KEEP (*(.init0))
++    *(.init1)
++    KEEP (*(.init1))
++    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */
++    KEEP (*(.init2))
++    *(.init3)
++    KEEP (*(.init3))
++    *(.init4)  /* Initialize data and BSS.  */
++    KEEP (*(.init4))
++    *(.init5)
++    KEEP (*(.init5))
++    *(.init6)  /* C++ constructors.  */
++    KEEP (*(.init6))
++    *(.init7)
++    KEEP (*(.init7))
++    *(.init8)
++    KEEP (*(.init8))
++    *(.init9)  /* Call main().  */
++    KEEP (*(.init9))
++    *(.text)
++    ${RELOCATING+. = ALIGN(2);}
++    *(.text.*)
++    ${RELOCATING+. = ALIGN(2);}
++    *(.fini9)  /* _exit() starts here.  */
++    KEEP (*(.fini9))
++    *(.fini8)
++    KEEP (*(.fini8))
++    *(.fini7)
++    KEEP (*(.fini7))
++    *(.fini6)  /* C++ destructors.  */
++    KEEP (*(.fini6))
++    *(.fini5)
++    KEEP (*(.fini5))
++    *(.fini4)
++    KEEP (*(.fini4))
++    *(.fini3)
++    KEEP (*(.fini3))
++    *(.fini2)
++    KEEP (*(.fini2))
++    *(.fini1)
++    KEEP (*(.fini1))
++    *(.fini0)  /* Infinite loop after program termination.  */
++    KEEP (*(.fini0))
++    ${RELOCATING+ _etext = . ; }
++  } ${RELOCATING+ > text}
++
++  .data	${RELOCATING-0} : ${RELOCATING+AT (ADDR (.text) + SIZEOF (.text))}
++  {
++    ${RELOCATING+ PROVIDE (__data_start = .) ; }
++    *(.data)
++    KEEP (*(.data))
++    *(.data*)
++    *(.rodata)  /* We need to include .rodata here if gcc is used */
++    *(.rodata*) /* with -fdata-sections.  */
++    *(.gnu.linkonce.d*)
++    ${RELOCATING+. = ALIGN(2);}
++    ${RELOCATING+ _edata = . ; }
++    ${RELOCATING+ PROVIDE (__data_end = .) ; }
++  } ${RELOCATING+ > data}
++
++  .bss ${RELOCATING-0} :${RELOCATING+ AT (ADDR (.bss))}
++  {
++    ${RELOCATING+ PROVIDE (__bss_start = .) ; }
++    *(.bss)
++    *(.bss*)
++    *(COMMON)
++    ${RELOCATING+ PROVIDE (__bss_end = .) ; }
++  } ${RELOCATING+ > data}
++
++  ${RELOCATING+ __data_load_start = LOADADDR(.data); }
++  ${RELOCATING+ __data_load_end = __data_load_start + SIZEOF(.data); }
++
++  /* Global data not cleared after reset.  */
++  .noinit ${RELOCATING-0}:
++  {
++    ${RELOCATING+ PROVIDE (__noinit_start = .) ; }
++    *(.noinit*)
++    ${RELOCATING+ PROVIDE (__noinit_end = .) ; }
++    ${RELOCATING+ _end = . ;  }
++    ${RELOCATING+ PROVIDE (__heap_start = .) ; }
++  } ${RELOCATING+ > data}
++
++  .lock ${RELOCATING-0}:
++  {
++    KEEP(*(.lock*))
++  } ${RELOCATING+ > lock}
++
++  .signature ${RELOCATING-0}:
++  {
++    KEEP(*(.signature*))
++  } ${RELOCATING+ > signature}
++
++  .config ${RELOCATING-0}:
++  {
++    KEEP(*(.config*))
++  } ${RELOCATING+ > config}
++
++  /* Stabs debugging sections.  */
++  .stab 0 : { *(.stab) }
++  .stabstr 0 : { *(.stabstr) }
++  .stab.excl 0 : { *(.stab.excl) }
++  .stab.exclstr 0 : { *(.stab.exclstr) }
++  .stab.index 0 : { *(.stab.index) }
++  .stab.indexstr 0 : { *(.stab.indexstr) }
++  .comment 0 : { *(.comment) }
++ 
++  /* DWARF debug sections.
++     Symbols in the DWARF debugging sections are relative to the beginning
++     of the section so we begin them at 0.  */
++
++  /* DWARF 1 */
++  .debug          0 : { *(.debug) }
++  .line           0 : { *(.line) }
++
++  /* GNU DWARF 1 extensions */
++  .debug_srcinfo  0 : { *(.debug_srcinfo) }
++  .debug_sfnames  0 : { *(.debug_sfnames) }
++
++  /* DWARF 1.1 and DWARF 2 */
++  .debug_aranges  0 : { *(.debug_aranges) }
++  .debug_pubnames 0 : { *(.debug_pubnames) }
++
++  /* DWARF 2 */
++  .debug_info     0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
++  .debug_abbrev   0 : { *(.debug_abbrev) }
++  .debug_line     0 : { *(.debug_line) }
++  .debug_frame    0 : { *(.debug_frame) }
++  .debug_str      0 : { *(.debug_str) }
++  .debug_loc      0 : { *(.debug_loc) }
++  .debug_macinfo  0 : { *(.debug_macinfo) }
++}
++EOF
++
+diff -Naurp opcodes/avr-dis.c opcodes/avr-dis.c
+--- opcodes/avr-dis.c	2012-05-17 20:43:24.000000000 +0530
++++ opcodes/avr-dis.c	2012-12-21 14:15:31.000000000 +0530
+@@ -187,6 +187,16 @@ avr_operand (unsigned int insn, unsigned
+     case 'i':
+       sprintf (buf, "0x%04X", insn2);
+       break;
++
++    case 'j':
++      {
++        unsigned int val = ((insn & 0xf) | ((insn & 0x600) >> 5)
++                                         | ((insn & 0x100) >> 2));
++        if (val > 0 && !(insn & 0x100))
++          val |= 0x80;
++        sprintf (buf, "0x%02x", val);
++      }
++      break;
+       
+     case 'M':
+       sprintf (buf, "0x%02X", ((insn & 0xf00) >> 4) | (insn & 0xf));
+@@ -330,8 +340,12 @@ print_insn_avr (bfd_vma addr, disassembl
+   for (opcode = avr_opcodes, maskptr = avr_bin_masks;
+        opcode->name;
+        opcode++, maskptr++)
+-    if ((insn & *maskptr) == opcode->bin_opcode)
+-      break;
++    {
++      if ((opcode->isa == AVR_ISA_TINY) && (info->mach != bfd_mach_avrtiny))
++        continue;
++      if ((insn & *maskptr) == opcode->bin_opcode)
++        break;
++    }
+   
+   /* Special case: disassemble `ldd r,b+0' as `ld r,b', and
+      `std b+0,r' as `st b,r' (next entry in the table).  */
diff --git a/003-RMW-insn-constriant.patch b/003-RMW-insn-constriant.patch
new file mode 100644
index 0000000..fb71b0c
--- /dev/null
+++ b/003-RMW-insn-constriant.patch
@@ -0,0 +1,37 @@
+diff -Naurp include/opcode/avr.h include/opcode/avr.h
+--- include/opcode/avr.h	2012-12-17 19:28:09.000000000 +0530
++++ include/opcode/avr.h	2012-12-17 19:28:38.000000000 +0530
+@@ -34,7 +34,7 @@
+ #define AVR_ISA_MOVW  0x1000 /* device has MOVW */
+ #define AVR_ISA_SPMX  0x2000 /* device has SPM Z[+] */
+ #define AVR_ISA_DES   0x4000 /* device has DES */
+-#define AVR_ISA_XCH   0x8000 /* device has XCH, LAC, LAS, LAT */
++#define AVR_ISA_RMW   0x8000 /* device has RMW instructions XCH,LAC,LAS,LAT */
+ 
+ #define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM)
+ #define AVR_ISA_2xxx  (AVR_ISA_TINY1 | AVR_ISA_SRAM)
+@@ -55,7 +55,8 @@
+ #define AVR_ISA_M323  (AVR_ISA_M161 | AVR_ISA_BRK)
+ #define AVR_ISA_M128  (AVR_ISA_M323 | AVR_ISA_ELPM | AVR_ISA_ELPMX)
+ #define AVR_ISA_M256  (AVR_ISA_M128 | AVR_ISA_EIND)
+-#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES | AVR_ISA_XCH)
++#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES)
++#define AVR_ISA_XMEGAU (AVR_ISA_XMEGA | AVR_ISA_RMW)
+ 
+ #define AVR_ISA_AVR1   AVR_ISA_TINY1
+ #define AVR_ISA_AVR2   AVR_ISA_2xxx
+@@ -272,10 +273,10 @@ AVR_INSN (ror,  "r",   "1001010rrrrr0111
+ AVR_INSN (swap, "r",   "1001010rrrrr0010", 1, AVR_ISA_1200, 0x9402)
+ 
+    /* Atomic memory operations for XMEGA.  List before `sts'.  */
+-AVR_INSN (xch,  "z,r",   "1001001rrrrr0100", 1, AVR_ISA_XCH, 0x9204)
+-AVR_INSN (las,  "z,r",   "1001001rrrrr0101", 1, AVR_ISA_XCH, 0x9205)
+-AVR_INSN (lac,  "z,r",   "1001001rrrrr0110", 1, AVR_ISA_XCH, 0x9206)
+-AVR_INSN (lat,  "z,r",   "1001001rrrrr0111", 1, AVR_ISA_XCH, 0x9207)
++AVR_INSN (xch,  "z,r",   "1001001rrrrr0100", 1, AVR_ISA_RMW, 0x9204)
++AVR_INSN (las,  "z,r",   "1001001rrrrr0101", 1, AVR_ISA_RMW, 0x9205)
++AVR_INSN (lac,  "z,r",   "1001001rrrrr0110", 1, AVR_ISA_RMW, 0x9206)
++AVR_INSN (lat,  "z,r",   "1001001rrrrr0111", 1, AVR_ISA_RMW, 0x9207)
+ 
+    /* Known to be decoded as `nop' by the old core.  */
+ AVR_INSN (movw, "v,v", "00000001ddddrrrr", 1, AVR_ISA_MOVW, 0x0100)
diff --git a/004-new-part-supports.patch b/004-new-part-supports.patch
new file mode 100644
index 0000000..8744f11
--- /dev/null
+++ b/004-new-part-supports.patch
@@ -0,0 +1,257 @@
+--- gas/config/tc-avr.c	2012-09-05 16:01:12.000000000 +0530
++++ gas/config/tc-avr.c	2012-09-05 20:05:46.000000000 +0530
+@@ -107,6 +107,7 @@ static struct mcu_type_s mcu_types[] =
+   {"at90s8515",  AVR_ISA_AVR2,    bfd_mach_avr2},
+   {"at90c8534",  AVR_ISA_AVR2,    bfd_mach_avr2},
+   {"at90s8535",  AVR_ISA_AVR2,    bfd_mach_avr2},
++  {"ata5272",    AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"attiny13",   AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"attiny13a",  AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"attiny2313", AVR_ISA_AVR25,   bfd_mach_avr25},
+@@ -131,6 +132,7 @@ static struct mcu_type_s mcu_types[] =
+   {"attiny43u",  AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"attiny48",   AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"attiny88",   AVR_ISA_AVR25,   bfd_mach_avr25},
++  {"attiny828",  AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"at86rf401",  AVR_ISA_RF401,   bfd_mach_avr25},
+   {"ata6289",    AVR_ISA_AVR25,   bfd_mach_avr25},
+   {"at43usb355", AVR_ISA_AVR3,    bfd_mach_avr3},
+@@ -140,12 +142,18 @@ static struct mcu_type_s mcu_types[] =
+   {"attiny167",  AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"at90usb82",  AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"at90usb162", AVR_ISA_AVR35,   bfd_mach_avr35},
++  {"ata5505",    AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"atmega8u2",  AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"atmega16u2", AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"atmega32u2", AVR_ISA_AVR35,   bfd_mach_avr35},
++  {"attiny1634", AVR_ISA_AVR35,   bfd_mach_avr35},
+   {"atmega8",    AVR_ISA_M8,      bfd_mach_avr4},
++  {"atmega8a",   AVR_ISA_M8,      bfd_mach_avr4},
++  {"ata6285",    AVR_ISA_AVR4,    bfd_mach_avr4},
++  {"ata6286",    AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"atmega48",   AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"atmega48a",  AVR_ISA_AVR4,    bfd_mach_avr4},
++  {"atmega48pa", AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"atmega48p",  AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"atmega88",   AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"atmega88a",  AVR_ISA_AVR4,    bfd_mach_avr4},
+@@ -160,6 +168,9 @@ static struct mcu_type_s mcu_types[] =
+   {"at90pwm3",   AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"at90pwm3b",  AVR_ISA_AVR4,    bfd_mach_avr4},
+   {"at90pwm81",  AVR_ISA_AVR4,    bfd_mach_avr4},
++  {"at90pwm161", AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"ata5790",    AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"ata5795",    AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega16",   AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega16a",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega161",  AVR_ISA_M161,    bfd_mach_avr5},
+@@ -167,17 +178,21 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega163",  AVR_ISA_M161,    bfd_mach_avr5},
+   {"atmega164a", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega164p", AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega164pa",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega165",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega165a", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega165p", AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega165pa",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega168",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega168a", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega168p", AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega168pa",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega169",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega169a", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega169p", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega169pa",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega32",   AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega32a",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega323",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega324a", AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega324p", AVR_ISA_AVR5,    bfd_mach_avr5},
+@@ -202,6 +217,7 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega3290pa",AVR_ISA_AVR5,   bfd_mach_avr5},
+   {"atmega406",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega64",   AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega64a",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega640",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega644",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega644a", AVR_ISA_AVR5,    bfd_mach_avr5},
+@@ -220,7 +236,7 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega6490a",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega6490p",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega16hva",AVR_ISA_AVR5,    bfd_mach_avr5},
+-  {"atmega16hva2",AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega16hva2",AVR_ISA_AVR5,   bfd_mach_avr5},
+   {"atmega16hvb",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega16hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
+   {"atmega32hvb",AVR_ISA_AVR5,    bfd_mach_avr5},
+@@ -245,8 +261,10 @@ static struct mcu_type_s mcu_types[] =
+   {"at94k",      AVR_ISA_94K,     bfd_mach_avr5},
+   {"m3000",      AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega128",  AVR_ISA_AVR51,   bfd_mach_avr51},
++  {"atmega128a", AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega1280", AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega1281", AVR_ISA_AVR51,   bfd_mach_avr51},
++  {"atmega1284", AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega1284p",AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51},
+   {"at90can128", AVR_ISA_AVR51,   bfd_mach_avr51},
+@@ -255,26 +273,46 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega2560", AVR_ISA_AVR6,    bfd_mach_avr6},
+   {"atmega2561", AVR_ISA_AVR6,    bfd_mach_avr6},
+   {"atxmega16a4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
++  {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
++  {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+   {"atxmega16d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega16x1", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega32a4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
++  {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
++  {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+   {"atxmega32d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega32x1", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega64a3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
++  {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
++  {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
++  {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
++  {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
++  {"atxmega64c3", AVR_ISA_XMEGAU,  bfd_mach_avrxmega4},
+   {"atxmega64d3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
+   {"atxmega64a1", AVR_ISA_XMEGA,  bfd_mach_avrxmega5},
+-  {"atxmega64a1u",AVR_ISA_XMEGA,  bfd_mach_avrxmega5},
++  {"atxmega64a1u",AVR_ISA_XMEGAU,  bfd_mach_avrxmega5},
+   {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
+   {"atxmega128b1", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
++  {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
+   {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+   {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
++  {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
+   {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+   {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
+   {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+-  {"atxmega256a3bu",AVR_ISA_XMEGA,bfd_mach_avrxmega6},
++  {"atxmega256a3bu",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
++  {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
+   {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++  {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
++  {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+   {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
+-  {"atxmega128a1u", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
++  {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
++  {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
+   {"attiny4",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
+   {"attiny5",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
+   {"attiny9",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
+--- gas/doc/c-avr.texi	2012-09-05 15:59:12.000000000 +0530
++++ gas/doc/c-avr.texi	2012-09-05 20:03:45.000000000 +0530
+@@ -46,7 +46,7 @@ space plus the MOVW instruction (MCU typ
+ attiny2313a, attiny24, attiny24a, attiny4313, attiny44, attiny44a, attiny84,
+ attiny84a, attiny25, attiny45, attiny85, attiny261, attiny261a, attiny461,
+ attiny461a, attiny861, attiny861a, attiny87, attiny43u, attiny48, attiny88,
+-at86rf401, ata6289).
++attiny828, at86rf401, ata6289, ata5272).
+ 
+ Instruction set avr3 is for the classic AVR core with up to 128K program
+ memory space (MCU types: at43usb355, at76c711).
+@@ -55,59 +55,68 @@ Instruction set avr31 is for the classic
+ memory space (MCU types: atmega103, at43usb320).
+ 
+ Instruction set avr35 is for classic AVR core plus MOVW, CALL, and JMP
+-instructions (MCU types: attiny167, at90usb82, at90usb162, atmega8u2,
+-atmega16u2, atmega32u2).
++instructions (MCU types: attiny167, attiny1634, at90usb82, at90usb162,
++atmega8u2, atmega16u2, atmega32u2, ata5505).
+ 
+ Instruction set avr4 is for the enhanced AVR core with up to 8K program
+-memory space (MCU types: atmega48, atmega48a, atmega48p, atmega8, atmega88,
+-atmega88a, atmega88p, atmega88pa, atmega8515, atmega8535, atmega8hva, at90pwm1,
+-at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81).
++memory space (MCU types: atmega48, atmega48a, atmega48pa, atmega48p, atmega8, 
++atmega8a, atmega88, atmega88a, atmega88p, atmega88pa, atmega8515, atmega8535, 
++atmega8hva, at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81, 
++ata6285, ata6286).
+ 
+ Instruction set avr5 is for the enhanced AVR core with up to 128K program
+-memory space (MCU types: atmega16, atmega16a, atmega161, atmega162, atmega163,
+-atmega164a, atmega164p, atmega165, atmega165a, atmega165p, atmega168,
+-atmega168a, atmega168p, atmega169, atmega169a, atmega169p, atmega169pa,
+-atmega32, atmega323, atmega324a, atmega324p, atmega325, atmega325a, atmega325p,
+-atmega325pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, atmega328,
+-atmega328p, atmega329, atmega329a, atmega329p, atmega329pa, atmega3290,
+-atmega3290a, atmega3290p, atmega3290pa, atmega406, atmega64, atmega640,
+-atmega644, atmega644a, atmega644p, atmega644pa, atmega645, atmega645a,
+-atmega645p, atmega6450, atmega6450a, atmega6450p, atmega649, atmega649a,
+-atmega649p, atmega6490, atmega6490a, atmega6490p, atmega16hva, atmega16hva2,
+-atmega16hvb, atmega16hvbrevb, atmega32hvb, atmega32hvbrevb, atmega64hve,
+-at90can32, at90can64, at90pwm161, at90pwm216, at90pwm316, atmega32c1,
+-atmega64c1, atmega16m1, atmega32m1, atmega64m1, atmega16u4, atmega32u4,
+-atmega32u6, at90usb646, at90usb647, at94k, at90scr100).
++memory space (MCU types: at90pwm161, atmega16, atmega16a, atmega161, atmega162,
++atmega163, atmega164a, atmega164p, atmega164pa, atmega165, atmega165a, 
++atmega165p, atmega165pa, atmega168, atmega168a, atmega168p, atmega168pa, 
++atmega169, atmega169a, atmega169p, atmega169pa, atmega32, atmega323, atmega324a,
++atmega324p, atmega324pa, atmega325, atmega325a, atmega32, atmega32a, atmega323,
++atmega324a, atmega324p, atmega324pa, atmega325, atmega325a, atmega325p,
++atmega325p, atmega325pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, 
++atmega328, atmega328p, atmega329, atmega329a, atmega329p, atmega329pa, 
++atmega3290a, atmega3290p, atmega3290pa, atmega406, atmega64, atmega64a, 
++atmega640, atmega644, atmega644a, atmega644p, atmega644pa, atmega645, 
++atmega645a, atmega645p, atmega6450, atmega6450a, atmega6450p, atmega649, 
++atmega649a, atmega649p, atmega6490, atmega6490a, atmega6490p, atmega16hva, 
++atmega16hva2, atmega16hvb, atmega16hvbrevb, atmega32hvb, atmega32hvbrevb, 
++atmega64hve, at90can32, at90can64, at90pwm161, at90pwm216, at90pwm316, 
++atmega32c1, atmega64c1, atmega16m1, atmega32m1, atmega64m1, atmega16u4, 
++atmega32u4, atmega32u6, at90usb646, at90usb647, at94k, at90scr100,
++ata5790, ata5795).
+ 
+ Instruction set avr51 is for the enhanced AVR core with exactly 128K program
+-memory space (MCU types: atmega128, atmega1280, atmega1281, atmega1284p,
+-atmega128rfa1, at90can128, at90usb1286, at90usb1287, m3000).
++memory space (MCU types: atmega128, atmega128a, atmega1280, atmega1281, 
++atmega1284, atmega1284p, atmega128rfa1, at90can128, at90usb1286, at90usb1287,
++m3000).
+ 
+ Instruction set avr6 is for the enhanced AVR core with a 3-byte PC (MCU types:
+ atmega2560, atmega2561).
+ 
+ Instruction set avrxmega2 is for the XMEGA AVR core with 8K to 64K program
+-memory space and less than 64K data space (MCU types: atxmega16a4, atxmega16d4,
+-atxmega16x1, atxmega32a4, atxmega32d4, atxmega32x1).
++memory space and less than 64K data space (MCU types: atxmega16a4, atxmega16a4u,
++atxmega16c4, atxmega16d4, atxmega16x1, atxmega32a4, atxmega32a4u, atxmega32c4, 
++atxmega32d4, atxmega32x1).
+ 
+ Instruction set avrxmega3 is for the XMEGA AVR core with 8K to 64K program
+ memory space and greater than 64K data space (MCU types: none).
+ 
+ Instruction set avrxmega4 is for the XMEGA AVR core with up to 64K program
+-memory space and less than 64K data space (MCU types: atxmega64a3, atxmega64d3).
++memory space and less than 64K data space (MCU types: atxmega64a3, atxmega64a3u, 
++atxmega64a4u, atxmega64b1, atxmega64b3, atxmega64c3, atxmega64d3).
+ 
+ Instruction set avrxmega5 is for the XMEGA AVR core with up to 64K program 
+ memory space and greater than 64K data space (MCU types: atxmega64a1,
+ atxmega64a1u).
+ 
+-Instruction set avrxmega6 is for the XMEGA AVR core with up to 256K program
+-memory space and less than 64K data space (MCU types: atxmega128a3,
+-atxmega128d3, atxmega192a3, atxmega128b1, atxmega192d3, atxmega256a3, 
+-atxmega256a3b, atxmega256a3bu, atxmega192d3).
++Instruction set avrxmega6 is for the XMEGA AVR core with larger than 64K program
++memory space and less than 64K data space (MCU types: atxmega128a3, 
++atxmega128a3u, atxmega128c3, atxmega128d3, atxmega128d4, atxmega192a3, 
++atxmega192a3u, atxmega128b1, atxmega128b3, atxmega192c3, atxmega192d3, 
++atxmega256a3, atxmega256a3u, atxmega256a3b, atxmega256a3bu, atxmega256c3, 
++atxmega256d3, atxmega384c3, atxmega256d3).
+ 
+-Instruction set avrxmega7 is for the XMEGA AVR core with up to 256K program
++Instruction set avrxmega7 is for the XMEGA AVR core with larger than 64K program
+ memory space and greater than 64K data space (MCU types: atxmega128a1,
+-atxmega128a1u).
++atxmega128a1u, atxmega128a4u).
+ 
+ @cindex @code{-mall-opcodes} command line option, AVR
+ @item -mall-opcodes
diff --git a/005-additional-part-supports.patch b/005-additional-part-supports.patch
new file mode 100644
index 0000000..e2c9d8a
--- /dev/null
+++ b/005-additional-part-supports.patch
@@ -0,0 +1,105 @@
+diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
+--- gas/config/tc-avr.c	2013-02-06 16:41:25.000000000 +0530
++++ gas/config/tc-avr.c	2013-02-06 16:38:01.000000000 +0530
+@@ -216,6 +216,8 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega3290p",AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega3290pa",AVR_ISA_AVR5,   bfd_mach_avr5},
+   {"atmega406",  AVR_ISA_AVR5,    bfd_mach_avr5},
++  {"atmega64rfr2", AVR_ISA_AVR5,  bfd_mach_avr5},
++  {"atmega644rfr2",AVR_ISA_AVR5,  bfd_mach_avr5},
+   {"atmega64",   AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega64a",  AVR_ISA_AVR5,    bfd_mach_avr5},
+   {"atmega640",  AVR_ISA_AVR5,    bfd_mach_avr5},
+@@ -267,11 +269,15 @@ static struct mcu_type_s mcu_types[] =
+   {"atmega1284", AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega1284p",AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51},
++  {"atmega128rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
++  {"atmega1284rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
+   {"at90can128", AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"at90usb1286",AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"at90usb1287",AVR_ISA_AVR51,   bfd_mach_avr51},
+   {"atmega2560", AVR_ISA_AVR6,    bfd_mach_avr6},
+   {"atmega2561", AVR_ISA_AVR6,    bfd_mach_avr6},
++  {"atmega256rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
++  {"atmega2564rfr2",AVR_ISA_AVR6, bfd_mach_avr6},
+   {"atxmega16a4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+   {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+@@ -281,6 +287,9 @@ static struct mcu_type_s mcu_types[] =
+   {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+   {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
+   {"atxmega32d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
++  {"atxmega32e5", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
++  {"atxmega16e5", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
++  {"atxmega8e5",  AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega32x1", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+   {"atxmega64a3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
+   {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
+@@ -289,6 +298,7 @@ static struct mcu_type_s mcu_types[] =
+   {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
+   {"atxmega64c3", AVR_ISA_XMEGAU,  bfd_mach_avrxmega4},
+   {"atxmega64d3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
++  {"atxmega64d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
+   {"atxmega64a1", AVR_ISA_XMEGA,  bfd_mach_avrxmega5},
+   {"atxmega64a1u",AVR_ISA_XMEGAU,  bfd_mach_avrxmega5},
+   {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+diff -Naurp gas/doc/c-avr.texi gas/doc/c-avr.texi
+--- gas/doc/c-avr.texi	2013-02-06 16:41:25.000000000 +0530
++++ gas/doc/c-avr.texi	2013-02-06 16:40:55.000000000 +0530
+@@ -67,41 +67,41 @@ ata6285, ata6286).
+ Instruction set avr5 is for the enhanced AVR core with up to 128K program
+ memory space (MCU types: at90pwm161, atmega16, atmega16a, atmega161, atmega162,
+ atmega163, atmega164a, atmega164p, atmega164pa, atmega165, atmega165a, 
+-atmega165p, atmega165pa, atmega168, atmega168a, atmega168p, atmega168pa, 
++atmega165p, atmega165pa, atmega168, atmega168a, atmega168p, atmega168pa,
+ atmega169, atmega169a, atmega169p, atmega169pa, atmega32, atmega323, atmega324a,
+ atmega324p, atmega324pa, atmega325, atmega325a, atmega32, atmega32a, atmega323,
+ atmega324a, atmega324p, atmega324pa, atmega325, atmega325a, atmega325p,
+ atmega325p, atmega325pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, 
+ atmega328, atmega328p, atmega329, atmega329a, atmega329p, atmega329pa, 
+ atmega3290a, atmega3290p, atmega3290pa, atmega406, atmega64, atmega64a, 
+-atmega640, atmega644, atmega644a, atmega644p, atmega644pa, atmega645, 
+-atmega645a, atmega645p, atmega6450, atmega6450a, atmega6450p, atmega649, 
+-atmega649a, atmega649p, atmega6490, atmega6490a, atmega6490p, atmega16hva, 
+-atmega16hva2, atmega16hvb, atmega16hvbrevb, atmega32hvb, atmega32hvbrevb, 
+-atmega64hve, at90can32, at90can64, at90pwm161, at90pwm216, at90pwm316, 
+-atmega32c1, atmega64c1, atmega16m1, atmega32m1, atmega64m1, atmega16u4, 
+-atmega32u4, atmega32u6, at90usb646, at90usb647, at94k, at90scr100,
+-ata5790, ata5795).
++atmega64rfr2, atmega644rfr2, atmega640, atmega644, atmega644a, atmega644p,
++atmega644pa, atmega645, atmega645a, atmega645p, atmega6450, atmega6450a,
++atmega6450p, atmega649, atmega649a, atmega649p, atmega6490, atmega6490a,
++atmega6490p, atmega16hva, atmega16hva2, atmega16hvb, atmega16hvbrevb, 
++atmega32hvb, atmega32hvbrevb, atmega64hve, at90can32, at90can64, at90pwm161,
++at90pwm216, at90pwm316, atmega32c1, atmega64c1, atmega16m1, atmega32m1,
++atmega64m1, atmega16u4, atmega32u4, atmega32u6, at90usb646, at90usb647, at94k,
++at90scr100, ata5790, ata5795).
+ 
+ Instruction set avr51 is for the enhanced AVR core with exactly 128K program
+ memory space (MCU types: atmega128, atmega128a, atmega1280, atmega1281, 
+-atmega1284, atmega1284p, atmega128rfa1, at90can128, at90usb1286, at90usb1287,
+-m3000).
++atmega1284, atmega1284p, atmega128rfa1, atmega128rfr2, atmega1284rfr2,
++at90can128, at90usb1286, at90usb1287, m3000).
+ 
+ Instruction set avr6 is for the enhanced AVR core with a 3-byte PC (MCU types:
+-atmega2560, atmega2561).
++atmega2560, atmega2561, atmega256rfr2, atmega2564rfr2).
+ 
+ Instruction set avrxmega2 is for the XMEGA AVR core with 8K to 64K program
+ memory space and less than 64K data space (MCU types: atxmega16a4, atxmega16a4u,
+ atxmega16c4, atxmega16d4, atxmega16x1, atxmega32a4, atxmega32a4u, atxmega32c4, 
+-atxmega32d4, atxmega32x1).
++atxmega32d4, atxmega16e5, atxmega8e5, atxmega32e5, atxmega32x1).
+ 
+ Instruction set avrxmega3 is for the XMEGA AVR core with 8K to 64K program
+ memory space and greater than 64K data space (MCU types: none).
+ 
+ Instruction set avrxmega4 is for the XMEGA AVR core with up to 64K program
+ memory space and less than 64K data space (MCU types: atxmega64a3, atxmega64a3u, 
+-atxmega64a4u, atxmega64b1, atxmega64b3, atxmega64c3, atxmega64d3).
++atxmega64a4u, atxmega64b1, atxmega64b3, atxmega64c3, atxmega64d3, atxmega64d4).
+ 
+ Instruction set avrxmega5 is for the XMEGA AVR core with up to 64K program 
+ memory space and greater than 64K data space (MCU types: atxmega64a1,
diff --git a/006-xmega-showuage-typo.patch b/006-xmega-showuage-typo.patch
new file mode 100644
index 0000000..508428c
--- /dev/null
+++ b/006-xmega-showuage-typo.patch
@@ -0,0 +1,11 @@
+diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
+--- gas/config/tc-avr.c	2012-12-17 19:31:00.000000000 +0530
++++ gas/config/tc-avr.c	2012-12-17 19:34:49.000000000 +0530
+@@ -505,6 +505,7 @@ md_show_usage (FILE *stream)
+ 	"                   avr5  - enhanced AVR core with up to 64K program memory\n"
+ 	"                   avr51 - enhanced AVR core with up to 128K program memory\n"
+ 	"                   avr6  - enhanced AVR core with up to 256K program memory\n"
++	"                   avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n"
+ 	"                   avrxmega3 - XMEGA, > 8K, <= 64K FLASH, > 64K RAM\n"
+ 	"                   avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
+ 	"                   avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
diff --git a/505-binutils-avrtc446.patch b/007-ata6289-architecture-correction.patch
similarity index 60%
rename from 505-binutils-avrtc446.patch
rename to 007-ata6289-architecture-correction.patch
index 2f74476..c300fbf 100644
--- a/505-binutils-avrtc446.patch
+++ b/007-ata6289-architecture-correction.patch
@@ -1,15 +1,15 @@
 diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
---- gas/config/tc-avr.c	2012-10-25 12:02:42.000000000 +0530
-+++ gas/config/tc-avr.c	2012-10-25 12:41:44.000000000 +0530
-@@ -137,7 +137,6 @@ static struct mcu_type_s mcu_types[] =
+--- gas/config/tc-avr.c	2012-12-21 12:07:55.000000000 +0530
++++ gas/config/tc-avr.c	2012-12-21 12:06:22.000000000 +0530
+@@ -134,7 +134,6 @@ static struct mcu_type_s mcu_types[] =
    {"attiny88",   AVR_ISA_AVR25,   bfd_mach_avr25},
-   {"attiny828",  AVR_ISA_AVR25,   bfd_mach_avr25}, 
+   {"attiny828",  AVR_ISA_AVR25,   bfd_mach_avr25},
    {"at86rf401",  AVR_ISA_RF401,   bfd_mach_avr25},
 -  {"ata6289",    AVR_ISA_AVR25,   bfd_mach_avr25},
    {"at43usb355", AVR_ISA_AVR3,    bfd_mach_avr3},
    {"at76c711",   AVR_ISA_AVR3,    bfd_mach_avr3},
    {"atmega103",  AVR_ISA_AVR31,   bfd_mach_avr31},
-@@ -154,6 +153,7 @@ static struct mcu_type_s mcu_types[] =
+@@ -151,6 +150,7 @@ static struct mcu_type_s mcu_types[] =
    {"atmega8a",   AVR_ISA_M8,      bfd_mach_avr4},
    {"ata6285",    AVR_ISA_AVR4,    bfd_mach_avr4},
    {"ata6286",    AVR_ISA_AVR4,    bfd_mach_avr4},
@@ -18,23 +18,23 @@ diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
    {"atmega48a",  AVR_ISA_AVR4,    bfd_mach_avr4},
    {"atmega48pa", AVR_ISA_AVR4,    bfd_mach_avr4},
 diff -Naurp gas/doc/c-avr.texi gas/doc/c-avr.texi
---- gas/doc/c-avr.texi	2012-10-25 12:02:42.000000000 +0530
-+++ gas/doc/c-avr.texi	2012-10-25 13:04:59.000000000 +0530
+--- gas/doc/c-avr.texi	2012-12-21 12:07:54.000000000 +0530
++++ gas/doc/c-avr.texi	2012-12-21 12:07:18.000000000 +0530
 @@ -46,7 +46,7 @@ space plus the MOVW instruction (MCU typ
  attiny2313a, attiny24, attiny24a, attiny4313, attiny44, attiny44a, attiny84,
  attiny84a, attiny25, attiny45, attiny85, attiny261, attiny261a, attiny461,
  attiny461a, attiny861, attiny861a, attiny87, attiny43u, attiny48, attiny88,
--attiny828, attiny841, at86rf401, ata6289, ata5272).
-+attiny828, attiny841, at86rf401, ata5272).
+-attiny828, at86rf401, ata6289, ata5272).
++attiny828, at86rf401, ata5272).
  
  Instruction set avr3 is for the classic AVR core with up to 128K program
  memory space (MCU types: at43usb355, at76c711).
-@@ -61,7 +61,7 @@ atmega8u2, atmega16u2, atmega32u2, ata55
- Instruction set avr4 is for the enhanced AVR core with up to 8K program
- memory space (MCU types: atmega48, atmega48a, atmega48pa, atmega48p, atmega8, atmega8a
- atmega88, atmega88a, atmega88p, atmega88pa, atmega8515, atmega8535, atmega8hva,
--at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81, ata6285, ata6286).
-+at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81, ata6285, ata6286, ata6289).
+@@ -62,7 +62,7 @@ Instruction set avr4 is for the enhanced
+ memory space (MCU types: atmega48, atmega48a, atmega48pa, atmega48p, atmega8, 
+ atmega8a, atmega88, atmega88a, atmega88p, atmega88pa, atmega8515, atmega8535, 
+ atmega8hva, at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81, 
+-ata6285, ata6286).
++ata6285, ata6286, ata6289).
  
  Instruction set avr5 is for the enhanced AVR core with up to 128K program
  memory space (MCU types: at90pwm161, atmega16, atmega16a, atmega161, atmega162,
diff --git a/008-add-usersig-section.patch b/008-add-usersig-section.patch
new file mode 100644
index 0000000..84c0654
--- /dev/null
+++ b/008-add-usersig-section.patch
@@ -0,0 +1,22 @@
+--- ld/scripttempl/avr.sc	2012-12-26 16:10:01.000000000 +0530
++++ ld/scripttempl/avr.sc	2012-12-26 16:00:54.000000000 +0530
+@@ -10,6 +10,7 @@ MEMORY
+   fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K
+   lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K
+   signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K
++  user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = 1K
+ }
+ 
+ SECTIONS
+@@ -220,6 +221,11 @@ SECTIONS
+     KEEP(*(.signature*))
+   } ${RELOCATING+ > signature}
+ 
++  .user_signatures ${RELOCATING-0}:
++  {
++    KEEP(*(.user_signatures*))
++  } ${RELOCATING+ > user_signatures}
++
+   /* Stabs debugging sections.  */
+   .stab 0 : { *(.stab) }
+   .stabstr 0 : { *(.stabstr) }
diff --git a/009-dwarf-relax-fix.patch b/009-dwarf-relax-fix.patch
new file mode 100644
index 0000000..d678829
--- /dev/null
+++ b/009-dwarf-relax-fix.patch
@@ -0,0 +1,484 @@
+diff -Naurp bfd/elf32-avr.c bfd/elf32-avr.c
+--- bfd/elf32-avr.c	2013-01-02 16:27:32.000000000 +0530
++++ bfd/elf32-avr.c	2013-01-02 16:28:50.000000000 +0530
+@@ -34,6 +34,15 @@ static bfd_boolean debug_relax = FALSE;
+ /* Enable debugging printout at stdout with this variable.  */
+ static bfd_boolean debug_stubs = FALSE;
+ 
++static bfd_reloc_status_type
++bfd_elf_avr_diff_reloc (bfd *abfd,
++              arelent *reloc_entry,
++              asymbol *symbol,
++              void *data,
++              asection *input_section,
++              bfd *output_bfd,
++              char **error_message);
++
+ /* Hash table initialization and handling.  Code is taken from the hppa port
+    and adapted to the needs of AVR.  */
+ 
+@@ -573,6 +582,45 @@ static reloc_howto_type elf_avr_howto_ta
+          0xffff,                /* src_mask */
+          0xffff,                /* dst_mask */
+          FALSE),                /* pcrel_offset */
++  HOWTO (R_AVR_DIFF8,      /* type */
++     0,             /* rightshift */
++     0, 			/* size (0 = byte, 1 = short, 2 = long) */
++     8, 			/* bitsize */
++     FALSE,         /* pc_relative */
++     0,             /* bitpos */
++     complain_overflow_bitfield, /* complain_on_overflow */
++     bfd_elf_avr_diff_reloc, /* special_function */
++     "R_AVR_DIFF8",     /* name */ 
++     FALSE,         /* partial_inplace */ 
++     0,             /* src_mask */ 
++     0xff,          /* dst_mask */
++     FALSE),        /* pcrel_offset */
++  HOWTO (R_AVR_DIFF16,     /* type */
++     0,             /* rightshift */
++     1,			/* size (0 = byte, 1 = short, 2 = long) */
++     16,			/* bitsize */
++     FALSE,         /* pc_relative */
++     0,             /* bitpos */
++     complain_overflow_bitfield, /* complain_on_overflow */
++     bfd_elf_avr_diff_reloc, /* special_function */
++     "R_AVR_DIFF16",     /* name */ 
++     FALSE,         /* partial_inplace */ 
++     0,             /* src_mask */ 
++     0xffff,        /* dst_mask */
++     FALSE),        /* pcrel_offset */
++  HOWTO (R_AVR_DIFF32,    /* type */
++     0,             /* rightshift */
++     2,         /* size (0 = byte, 1 = short, 2 = long) */
++     32,        /* bitsize */
++     FALSE,         /* pc_relative */
++     0,             /* bitpos */
++     complain_overflow_bitfield, /* complain_on_overflow */
++     bfd_elf_avr_diff_reloc, /* special_function */
++     "R_AVR_DIFF32",     /* name */ 
++     FALSE,         /* partial_inplace */ 
++     0,             /* src_mask */ 
++     0xffffffff,    /* dst_mask */ 
++     FALSE)         /* pcrel_offset */
+ };
+ 
+ /* Map BFD reloc types to AVR ELF reloc types.  */
+@@ -615,7 +663,10 @@ static const struct avr_reloc_map avr_re
+   { BFD_RELOC_AVR_8_LO,             R_AVR_8_LO8 },
+   { BFD_RELOC_AVR_8_HI,             R_AVR_8_HI8 },
+   { BFD_RELOC_AVR_8_HLO,            R_AVR_8_HLO8 },
+-  { BFD_RELOC_AVR_7_LDS16,          R_AVR_7_LDS16 }
++  { BFD_RELOC_AVR_7_LDS16,          R_AVR_7_LDS16 },
++  { BFD_RELOC_AVR_DIFF8,            R_AVR_DIFF8 },
++  { BFD_RELOC_AVR_DIFF16,           R_AVR_DIFF16 },
++  { BFD_RELOC_AVR_DIFF32,           R_AVR_DIFF32 }
+ };
+ 
+ /* Meant to be filled one day with the wrap around address for the
+@@ -823,6 +874,22 @@ avr_get_stub_addr (bfd_vma srel,
+   return 0x020000;
+ }
+ 
++/* Perform a diff relocation. Nothing to do, as the difference value is already
++   written into the section's contents. */
++
++static bfd_reloc_status_type
++bfd_elf_avr_diff_reloc (bfd *abfd ATTRIBUTE_UNUSED,
++		      arelent *reloc_entry ATTRIBUTE_UNUSED,
++              asymbol *symbol ATTRIBUTE_UNUSED,
++              void *data ATTRIBUTE_UNUSED,
++              asection *input_section ATTRIBUTE_UNUSED,
++              bfd *output_bfd ATTRIBUTE_UNUSED,
++              char **error_message ATTRIBUTE_UNUSED)
++{
++  return bfd_reloc_ok;
++}
++
++
+ /* Perform a single relocation.  By default we use the standard BFD
+    routines, but a few relocs, we have to do them ourselves.  */
+ 
+@@ -1186,6 +1253,13 @@ avr_final_link_relocate (reloc_howto_typ
+       bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
+       break;
+ 
++    case R_AVR_DIFF8:
++    case R_AVR_DIFF16:
++    case R_AVR_DIFF32:
++      /* Nothing to do here, as contents already contains the diff value. */
++      r = bfd_reloc_ok;
++      break;
++
+     default:
+       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+ 				    contents, rel->r_offset,
+@@ -1502,6 +1576,99 @@ elf32_avr_object_p (bfd *abfd)
+ 				    e_set);
+ }
+ 
++/* Returns whether the relocation type passed is a diff reloc. */
++
++static bfd_boolean
++elf32_avr_is_diff_reloc (Elf_Internal_Rela *irel)
++{
++  return (ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF8
++          ||ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF16
++          || ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF32);
++}
++
++/* Reduce the value written in the section by count if the shrinked insn address
++   happens to fall between the two symbols for which this diff reloc was 
++   emitted. */
++
++static void
++elf32_avr_adjust_diff_reloc_value (bfd *abfd,
++                                   struct bfd_section *isec,
++                                   Elf_Internal_Rela *irel,
++                                   bfd_vma symval,
++                                   bfd_vma shrinked_insn_address,
++                                   int count)
++{
++  unsigned char *isec_contents = elf_section_data (isec)->this_hdr.contents;
++  if (isec_contents == NULL)
++  {
++    if (! bfd_malloc_and_get_section (abfd, isec, &isec_contents))
++      return;
++  }
++
++  isec_contents += irel->r_offset;
++
++  /* Read value written in object file. */
++ bfd_vma x = 0;
++  switch (ELF32_R_TYPE (irel->r_info))
++  {
++  case R_AVR_DIFF8:
++    {
++      x = *isec_contents;
++      break;
++    }
++  case R_AVR_DIFF16:
++    {
++      x = bfd_get_16 (abfd, isec_contents);
++      break;
++    }
++  case R_AVR_DIFF32:
++    {
++      x = bfd_get_32 (abfd, isec_contents);
++      break;
++    }
++  default:
++    {
++      BFD_FAIL();
++    }
++  }
++
++  /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
++     into the object file. sym2's value is represented as 
++     <start_of_section> + addend. Check if the shrinked insn falls between 
++     sym1 and sym2. */
++
++  bfd_vma end_address = symval + irel->r_addend;
++  bfd_vma start_address = end_address - x;
++
++  if (shrinked_insn_address >= start_address && 
++      shrinked_insn_address <= end_address)
++  {
++    switch (ELF32_R_TYPE (irel->r_info))
++    {
++    case R_AVR_DIFF8:
++      {
++        *isec_contents = (x - count);
++        break;
++      }
++    case R_AVR_DIFF16:
++      {
++        bfd_put_16 (abfd, (x - count) & 0xFFFF, isec_contents);
++        break;
++      }
++    case R_AVR_DIFF32:
++      {
++        bfd_put_32 (abfd, (x - count) & 0xFFFFFFFF, isec_contents);
++        break;
++      }
++    default:
++      {
++        BFD_FAIL();
++      }
++    }
++
++    elf_section_data (isec)->this_hdr.contents = isec_contents - irel->r_offset;
++  }
++}
+ 
+ /* Delete some bytes from a section while changing the size of an instruction.
+    The parameter "addr" denotes the section-relative offset pointing just
+@@ -1640,6 +1807,14 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
+                    if (symval <= shrinked_insn_address
+                        && (symval + irel->r_addend) > shrinked_insn_address)
+                      {
++                       if (elf32_avr_is_diff_reloc (irel))
++                         {
++                           elf32_avr_adjust_diff_reloc_value (abfd, isec, irel,
++                                                         symval, 
++                                                         shrinked_insn_address,
++                                                        count);
++                         }
++
+                        irel->r_addend -= count;
+ 
+                        if (debug_relax)
+diff -Naurp bfd/reloc.c bfd/reloc.c
+--- bfd/reloc.c	2013-01-02 16:27:32.000000000 +0530
++++ bfd/reloc.c	2013-01-02 16:28:50.000000000 +0530
+@@ -4414,6 +4414,19 @@ ENUM
+ ENUMDOC
+   This is a 7 bit reloc for the AVR that stores offset for 16bit sts/lds
+   instructions supported only by Tiny core
++ENUM
++  BFD_RELOC_AVR_DIFF8
++ENUMX
++  BFD_RELOC_AVR_DIFF16
++ENUMX
++  BFD_RELOC_AVR_DIFF32
++ENUMDOC
++  AVR relocations to mark the difference of two local symbols.
++  These are only needed to support linker relaxation and can be ignored
++  when not relaxing.  The field is set to the value of the difference
++  assuming no relaxation.  The relocation encodes the position of the
++  second symbol so the linker can determine whether to adjust the field
++  value.
+ 
+ ENUM
+   BFD_RELOC_RL78_NEG8
+diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
+--- gas/config/tc-avr.c	2013-01-02 16:28:02.000000000 +0530
++++ gas/config/tc-avr.c	2013-01-02 16:28:50.000000000 +0530
+@@ -342,9 +342,11 @@ struct avr_opt_s
+   int all_opcodes;  /* -mall-opcodes: accept all known AVR opcodes.  */
+   int no_skip_bug;  /* -mno-skip-bug: no warnings for skipping 2-word insns.  */
+   int no_wrap;      /* -mno-wrap: reject rjmp/rcall with 8K wrap-around.  */
++  int link_relax;   /* -mlink-relax: generate relocations for linker 
++                       relaxation. */
+ };
+ 
+-static struct avr_opt_s avr_opt = { 0, 0, 0 };
++static struct avr_opt_s avr_opt = { 0, 0, 0, 0 };
+ 
+ const char EXP_CHARS[] = "eE";
+ const char FLT_CHARS[] = "dD";
+@@ -404,7 +406,8 @@ enum options
+ {
+   OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
+   OPTION_NO_SKIP_BUG,
+-  OPTION_NO_WRAP
++  OPTION_NO_WRAP,
++  OPTION_LINK_RELAX
+ };
+ 
+ struct option md_longopts[] =
+@@ -413,6 +416,7 @@ struct option md_longopts[] =
+   { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
+   { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
+   { "mno-wrap",     no_argument, NULL, OPTION_NO_WRAP     },
++  { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
+   { NULL, no_argument, NULL, 0 }
+ };
+ 
+@@ -518,7 +522,9 @@ md_show_usage (FILE *stream)
+ 	"  -mno-skip-bug    disable warnings for skipping two-word instructions\n"
+ 	"                   (default for avr4, avr5)\n"
+ 	"  -mno-wrap        reject rjmp/rcall instructions with 8K wrap-around\n"
+-	"                   (default for avr3, avr5)\n"));
++	"                   (default for avr3, avr5)\n"
++    "  -mlink-relax     generate relocations for linker relaxation\n"
++    ));
+   show_mcu_list (stream);
+ }
+ 
+@@ -580,6 +586,9 @@ md_parse_option (int c, char *arg)
+     case OPTION_NO_WRAP:
+       avr_opt.no_wrap = 1;
+       return 1;
++    case OPTION_LINK_RELAX:
++      avr_opt.link_relax = 1;
++      return 1;
+     }
+ 
+   return 0;
+@@ -630,6 +639,7 @@ md_begin (void)
+     }
+ 
+   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
++  linkrelax = avr_opt.link_relax;
+ }
+ 
+ /* Resolve STR as a constant expression and return the result.
+@@ -1205,6 +1215,53 @@ md_pcrel_from_section (fixS *fixp, segT 
+   return fixp->fx_frag->fr_address + fixp->fx_where;
+ }
+ 
++static bfd_boolean
++relaxable_section (asection *sec)
++{
++  return (sec->flags & SEC_DEBUGGING) == 0;
++}
++
++/* Does whatever the xtensa port does. */
++int
++avr_validate_fix_sub (fixS *fix)
++{
++  segT add_symbol_segment, sub_symbol_segment;
++
++  /* The difference of two symbols should be resolved by the assembler when
++     linkrelax is not set.  If the linker may relax the section containing
++     the symbols, then an Xtensa DIFF relocation must be generated so that
++     the linker knows to adjust the difference value.  */
++  if (!linkrelax || fix->fx_addsy == NULL)
++    return 0;
++
++  /* Make sure both symbols are in the same segment, and that segment is
++     "normal" and relaxable.  If the segment is not "normal", then the
++     fix is not valid.  If the segment is not "relaxable", then the fix
++     should have been handled earlier.  */
++  add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
++  if (! SEG_NORMAL (add_symbol_segment) ||
++      ! relaxable_section (add_symbol_segment))
++    return 0;
++
++  sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
++  return (sub_symbol_segment == add_symbol_segment);
++}
++
++/* TC_FORCE_RELOCATION hook */
++
++/* If linkrelax is turned on, and the symbol to relocate
++   against is in a relaxable segment, don't compute the value -
++   generate a relocation instead. */
++int
++avr_force_relocation (fixS *fix)
++{
++  if (linkrelax && fix->fx_addsy
++      && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
++    return 1;
++
++  return generic_force_reloc (fix);
++}
++
+ /* GAS will call this for each fixup.  It should store the correct
+    value in the object file.  */
+ 
+@@ -1228,11 +1285,46 @@ md_apply_fix (fixS *fixP, valueT * valP,
+ 	  fixP->fx_done = 1;
+ 	}
+     }
++  else if (linkrelax && fixP->fx_subsy)
++    {
++      /* For a subtraction relocation expression, generate one
++         of the DIFF relocs, with the value being the difference.
++         Note that a sym1 - sym2 expression is adjusted into a 
++         section_start_sym + sym2_offset_from_section_start - sym1
++         expression. fixP->fx_addsy holds the section start symbol,
++         fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
++         holds sym1. Calculate and write value, but leave fx_offset
++         as is - during relaxation, fx_offset - value gives sym1's value */
++
++       switch (fixP->fx_r_type)
++         {
++           case BFD_RELOC_8:
++             fixP->fx_r_type = BFD_RELOC_AVR_DIFF8;
++             break;
++           case BFD_RELOC_16:
++             fixP->fx_r_type = BFD_RELOC_AVR_DIFF16;
++             break;
++           case BFD_RELOC_32:
++             fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
++             break;
++           default:
++             as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
++             break;
++         }
++
++      value = S_GET_VALUE (fixP->fx_addsy) + 
++          fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
+ 
++      fixP->fx_subsy = NULL;
++  }
+   /* We don't actually support subtracting a symbol.  */
+   if (fixP->fx_subsy != (symbolS *) NULL)
+     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ 
++  /* For the DIFF relocs, write the value into the object file while still
++     keeping fx_done FALSE, as both the difference (recorded in the object file)
++     and the sym offset (part of fixP) are needed at link relax time */
++  where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
+   switch (fixP->fx_r_type)
+     {
+     default:
+@@ -1242,6 +1334,19 @@ md_apply_fix (fixS *fixP, valueT * valP,
+     case BFD_RELOC_AVR_13_PCREL:
+     case BFD_RELOC_32:
+     case BFD_RELOC_16:
++      break;
++    case BFD_RELOC_AVR_DIFF8:
++      if (value > 255 || value < -128)
++        as_warn_where (fixP->fx_file, fixP->fx_line,
++                           _("operand out of range: %ld"), value);
++      *where = value;
++	  break;
++    case BFD_RELOC_AVR_DIFF16:
++      bfd_putl16 ((bfd_vma) value, where);
++      break;
++    case BFD_RELOC_AVR_DIFF32:
++      bfd_putl16 ((bfd_vma) value, where);
++      break;
+     case BFD_RELOC_AVR_CALL:
+       break;
+     }
+diff -Naurp gas/config/tc-avr.h gas/config/tc-avr.h
+--- gas/config/tc-avr.h	2011-03-29 23:46:15.000000000 +0530
++++ gas/config/tc-avr.h	2013-01-02 16:28:50.000000000 +0530
+@@ -93,6 +93,18 @@ extern void avr_cons_fix_new (fragS *,in
+    visible symbols can be overridden.  */
+ #define EXTERN_FORCE_RELOC 0
+ 
++/* If defined, this macro allows control over whether fixups for a
++   given section will be processed when the linkrelax variable is
++   set. Define it to zero and handle things in md_apply_fix instead.*/
++#define TC_LINKRELAX_FIXUP(SEG) 0
++
++/* If this macro returns non-zero, it guarantees that a relocation will be emitted
++   even when the value can be resolved locally. Do that if linkrelax is turned on */
++#define TC_FORCE_RELOCATION(fix)	avr_force_relocation (fix)
++#define TC_FORCE_RELOCATION_SUB_SAME(fix, seg) \
++  (! SEG_NORMAL (seg) || avr_force_relocation (fix))
++extern int avr_force_relocation (struct fix *);
++
+ /* Values passed to md_apply_fix don't include the symbol value.  */
+ #define MD_APPLY_SYM_VALUE(FIX) 0
+ 
+@@ -144,6 +156,12 @@ extern long md_pcrel_from_section (struc
+     {                                                        \
+       goto SKIP;                                             \
+    }
++  
++/* This macro is evaluated for any fixup with a fx_subsy that
++   fixup_segment cannot reduce to a number.  If the macro returns
++   false an error will be reported. */
++#define TC_VALIDATE_FIX_SUB(fix, seg)   avr_validate_fix_sub (fix)                                                                    
++extern int avr_validate_fix_sub (struct fix *);
+ 
+ /* This target is buggy, and sets fix size too large.  */
+ #define TC_FX_SIZE_SLACK(FIX) 2
+diff -Naurp include/elf/avr.h include/elf/avr.h
+--- include/elf/avr.h	2013-01-02 16:27:32.000000000 +0530
++++ include/elf/avr.h	2013-01-02 16:28:50.000000000 +0530
+@@ -83,6 +83,9 @@ START_RELOC_NUMBERS (elf_avr_reloc_type)
+      RELOC_NUMBER (R_AVR_8_HI8,                28)
+      RELOC_NUMBER (R_AVR_8_HLO8,               29)
+      RELOC_NUMBER (R_AVR_7_LDS16,              30)
++     RELOC_NUMBER (R_AVR_DIFF8,                31)
++     RELOC_NUMBER (R_AVR_DIFF16,               32)
++     RELOC_NUMBER (R_AVR_DIFF32,               33)
+ END_RELOC_NUMBERS (R_AVR_max)
+ 
+ #endif /* _ELF_AVR_H */
diff --git a/010-disable-demand-paging.patch b/010-disable-demand-paging.patch
new file mode 100644
index 0000000..5315553
--- /dev/null
+++ b/010-disable-demand-paging.patch
@@ -0,0 +1,28 @@
+diff --git ld/emultempl/avrelf.em ld/emultempl/avrelf.em
+index e0d6357..7f7dcf0 100644
+--- ld/emultempl/avrelf.em
++++ ld/emultempl/avrelf.em
+@@ -166,6 +166,15 @@ avr_elf_after_allocation (void)
+     }
+ }
+ 
++static void
++avr_elf_before_parse (void)
++{
++  /* Don't create a demand-paged executable, since this feature isn't
++     meaninful in AVR. */
++  config.magic_demand_paged = FALSE;
++
++  gld${EMULATION_NAME}_before_parse ();
++}
+ 
+ EOF
+ 
+@@ -262,6 +271,7 @@ PARSE_AND_LIST_ARGS_CASES='
+ #
+ # Put these extra avr-elf routines in ld_${EMULATION_NAME}_emulation
+ #
++LDEMUL_BEFORE_PARSE=avr_elf_before_parse
+ LDEMUL_BEFORE_ALLOCATION=avr_elf_${EMULATION_NAME}_before_allocation
+ LDEMUL_AFTER_ALLOCATION=avr_elf_after_allocation
+ LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=avr_elf_create_output_section_statements
diff --git a/300-binutils-avr-size.patch b/200-binutils-avr-size.patch
similarity index 72%
rename from 300-binutils-avr-size.patch
rename to 200-binutils-avr-size.patch
index 047fb2e..71176e6 100644
--- a/300-binutils-avr-size.patch
+++ b/200-binutils-avr-size.patch
@@ -1,7 +1,6 @@
-AVR specific only
-===========================================================
---- binutils/size.c	2007-08-06 13:56:14.000000000 -0600
-+++ binutils/size.c	2007-09-13 09:13:10.281250000 -0600
+diff -Naurp binutils/size.c binutils/size.c
+--- binutils/size.c	2013-02-06 16:32:42.000000000 +0530
++++ binutils/size.c	2013-02-06 16:53:39.000000000 +0530
 @@ -36,10 +36,31 @@
  #include "getopt.h"
  #include "bucomm.h"
@@ -47,7 +46,7 @@ AVR specific only
  static int show_version = 0;
  static int show_help = 0;
  static int show_totals = 0;
-@@ -64,6 +84,246 @@ static bfd_size_type total_textsize;
+@@ -64,6 +84,308 @@ static bfd_size_type total_textsize;
  /* Program exit status.  */
  static int return_code = 0;
  
@@ -58,6 +57,7 @@ AVR specific only
 +#define AVR128 128UL
 +#define AVR256 256UL
 +#define AVR512 512UL
++#define AVR2112 2112UL
 +#define AVR1K 1024UL
 +#define AVR2K 2048UL
 +#define AVR4K 4096UL
@@ -75,6 +75,8 @@ AVR specific only
 +#define AVR200K 204800UL
 +#define AVR256K 262144UL
 +#define AVR264K 270336UL
++#define AVR384K 393216UL
++#define AVR392K 401408UL
 +
 +typedef struct
 +{
@@ -86,42 +88,79 @@ AVR specific only
 +
 +avr_device_t avr[] =
 +{
-+	{"atxmega256a3",  AVR264K, AVR16K, AVR4K},
-+	{"atxmega256a3b", AVR264K, AVR16K, AVR4K},
-+	{"atxmega256d3",  AVR264K, AVR16K, AVR4K},
-+
-+	{"atmega2560",    AVR256K, AVR8K,  AVR4K},
-+	{"atmega2561",    AVR256K, AVR8K,  AVR4K},
-+
-+	{"atxmega192a3",  AVR200K, AVR16K, AVR2K},
-+	{"atxmega192d3",  AVR200K, AVR16K, AVR2K},
-+
-+	{"atxmega128a1",  AVR136K, AVR8K,  AVR2K},
-+	{"atxmega128a1u", AVR136K, AVR8K,  AVR2K},
-+	{"atxmega128a3",  AVR136K, AVR8K,  AVR2K},
-+	{"atxmega128d3",  AVR136K, AVR8K,  AVR2K},
-+
-+	{"at43usb320",    AVR128K, 608UL,  0UL},
-+	{"at90can128",    AVR128K, AVR4K,  AVR4K},
-+	{"at90usb1286",   AVR128K, AVR8K,  AVR4K},
-+	{"at90usb1287",   AVR128K, AVR8K,  AVR4K},
-+	{"atmega128",     AVR128K, AVR4K,  AVR4K},
-+	{"atmega1280",    AVR128K, AVR8K,  AVR4K},
-+	{"atmega1281",    AVR128K, AVR8K,  AVR4K},
-+	{"atmega1284p",   AVR128K, AVR16K, AVR4K},
-+	{"atmega128rfa1", AVR128K, AVR16K, AVR4K},
-+	{"atmega103",     AVR128K, 4000UL, AVR4K},
++  	{"atxmega384c3",  AVR392K, AVR32K, AVR4K},
++ 
++ 	{"atxmega384d3",  AVR384K, AVR16K, AVR4K},
++  
++ 	{"atmega256rfr2", AVR256K, AVR32K, AVR8K},
++ 	{"atmega2564rfr2",AVR256K, AVR32K, AVR8K},
++ 
++  	{"atxmega256a3",  AVR264K, AVR16K, AVR4K},
++ 	{"atxmega256a3u", AVR264K, AVR16K, AVR4K},
++  	{"atxmega256a3b", AVR264K, AVR16K, AVR4K},
++ 	{"atxmega256a3bu",AVR264K, AVR16K, AVR4K},
++ 	{"atxmega256c3",  AVR264K, AVR16K, AVR4K},
++  	{"atxmega256d3",  AVR264K, AVR16K, AVR4K},
++  
++  	{"atmega2560",    AVR256K, AVR8K,  AVR4K},
++  	{"atmega2561",    AVR256K, AVR8K,  AVR4K},
++  
++  	{"atxmega192a3",  AVR200K, AVR16K, AVR2K},
++ 	{"atxmega192a3u", AVR200K, AVR16K, AVR2K},
++ 	{"atxmega192c3",  AVR200K, AVR16K, AVR2K},
++  	{"atxmega192d3",  AVR200K, AVR16K, AVR2K},
++  
++ 	{"atmega128rfr2", AVR128K, AVR16K, AVR4K},
++ 	{"atmega1284rfr2",AVR128K, AVR16K, AVR4K},
++ 
++  	{"atxmega128a1",  AVR136K, AVR8K,  AVR2K},
++  	{"atxmega128a1u", AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128a4u", AVR136K, AVR8K,  AVR2K},
++  	{"atxmega128a3",  AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128a3u", AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128b1",  AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128b3",  AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128c3",  AVR136K, AVR8K,  AVR2K},
++  	{"atxmega128d3",  AVR136K, AVR8K,  AVR2K},
++ 	{"atxmega128d4",  AVR136K, AVR8K,  AVR2K},
++  
++  	{"at43usb320",    AVR128K, 608UL,  0UL},
++  	{"at90can128",    AVR128K, AVR4K,  AVR4K},
++  	{"at90usb1286",   AVR128K, AVR8K,  AVR4K},
++  	{"at90usb1287",   AVR128K, AVR8K,  AVR4K},
++  	{"atmega128",     AVR128K, AVR4K,  AVR4K},
++ 	{"atmega128a",    AVR128K, AVR4K,  AVR4K},
++  	{"atmega1280",    AVR128K, AVR8K,  AVR4K},
++  	{"atmega1281",    AVR128K, AVR8K,  AVR4K},
++ 	{"atmega1284",    AVR128K, AVR16K, AVR4K},
++  	{"atmega1284p",   AVR128K, AVR16K, AVR4K},
++  	{"atmega128rfa1", AVR128K, AVR16K, AVR4K},
++  	{"atmega103",     AVR128K, 4000UL, AVR4K},
 +
 +	{"atxmega64a1",   AVR68K,  AVR4K,  AVR2K},
 +	{"atxmega64a1u",  AVR68K,  AVR4K,  AVR2K},
 +	{"atxmega64a3",   AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64a3u",  AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64a4u",  AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64b1",   AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64b3",   AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64c3",   AVR68K,  AVR4K,  AVR2K},
 +	{"atxmega64d3",   AVR68K,  AVR4K,  AVR2K},
++	{"atxmega64d4",   AVR68K,  AVR4K,  AVR2K},
++
++	{"atmega64rfr2",  AVR64K,  AVR8K,  AVR2K},
++	{"atmega644rfr2", AVR64K,  AVR8K,  AVR2K},
 +
 +	{"at90can64",     AVR64K,  AVR4K,  AVR2K},
 +	{"at90scr100",    AVR64K,  AVR4K,  AVR2K},
 +	{"at90usb646",    AVR64K,  AVR4K,  AVR2K},
 +	{"at90usb647",    AVR64K,  AVR4K,  AVR2K},
++	{"ata5505",       AVR16K,  AVR512, AVR512},
++	{"ata5790",       AVR16K,  AVR512, AVR2112},
++	{"ata5795",       AVR8K,   AVR512, AVR2112},
++	{"ata5272",       AVR8K,   AVR512, AVR512},
 +	{"atmega64",      AVR64K,  AVR4K,  AVR2K},
++	{"atmega64a",     AVR64K,  AVR4K,  AVR2K},
 +	{"atmega640",     AVR64K,  AVR8K,  AVR4K},
 +	{"atmega644",     AVR64K,  AVR4K,  AVR2K},
 +	{"atmega644a",    AVR64K,  AVR4K,  AVR2K},
@@ -142,16 +181,22 @@ AVR specific only
 +	{"atmega64c1",    AVR64K,  AVR4K,  AVR2K},
 +	{"atmega64hve",   AVR64K,  AVR4K,  AVR1K},
 +	{"atmega64m1",    AVR64K,  AVR4K,  AVR2K},
-+   {"m3000",         AVR64K,  AVR4K,  0UL},
++	{"m3000",         AVR64K,  AVR4K,  0UL},
 +
 +	{"atmega406",     AVR40K,  AVR2K,  AVR512},
 +
 +	{"atxmega32a4",   AVR36K,  AVR4K,  AVR1K},
++	{"atxmega32a4u",  AVR36K,  AVR4K,  AVR1K},
++	{"atxmega32c4",   AVR36K,  AVR4K,  AVR1K},
 +	{"atxmega32d4",   AVR36K,  AVR4K,  AVR1K},
++	{"atxmega32e5",   AVR36K,  AVR4K,  AVR1K},
++	{"atxmega16e5",   AVR20K,  AVR2K,  AVR512},
++	{"atxmega8e5",	  AVR10K,  AVR1K,  AVR512},
 +
 +	{"at90can32",     AVR32K,  AVR2K,  AVR1K},
 +	{"at94k",         AVR32K,  AVR4K,  0UL},
 +	{"atmega32",      AVR32K,  AVR2K,  AVR1K},
++	{"atmega32a",     AVR32K,  AVR2K,  AVR1K},
 +	{"atmega323",     AVR32K,  AVR2K,  AVR1K},
 +	{"atmega324a",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega324p",    AVR32K,  AVR2K,  AVR1K},
@@ -159,9 +204,11 @@ AVR specific only
 +	{"atmega325",     AVR32K,  AVR2K,  AVR1K},
 +	{"atmega325a",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega325p",    AVR32K,  AVR2K,  AVR1K},
++	{"atmega325pa",   AVR32K,  AVR2K,  AVR1K},
 +	{"atmega3250",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega3250a",   AVR32K,  AVR2K,  AVR1K},
 +	{"atmega3250p",   AVR32K,  AVR2K,  AVR1K},
++	{"atmega3250pa",  AVR32K,  AVR2K,  AVR1K},
 +	{"atmega328",     AVR32K,  AVR2K,  AVR1K},
 +	{"atmega328p",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega329",     AVR32K,  AVR2K,  AVR1K},
@@ -171,9 +218,10 @@ AVR specific only
 +	{"atmega3290",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega3290a",   AVR32K,  AVR2K,  AVR1K},
 +	{"atmega3290p",   AVR32K,  AVR2K,  AVR1K},
++	{"atmega3290pa",  AVR32K,  AVR2K,  AVR1K},
 +	{"atmega32hvb",   AVR32K,  AVR2K,  AVR1K},
++	{"atmega32hvbrevb",AVR32K, AVR2K,  AVR1K},
 +	{"atmega32c1",    AVR32K,  AVR2K,  AVR1K},
-+   {"atmega32hvb",   AVR32K,  AVR2K,  AVR1K},
 +	{"atmega32m1",    AVR32K,  AVR2K,  AVR1K},
 +	{"atmega32u2",    AVR32K,  AVR1K,  AVR1K},
 +	{"atmega32u4",    AVR32K,  2560UL, AVR1K},
@@ -182,9 +230,12 @@ AVR specific only
 +	{"at43usb355",    AVR24K,  1120UL,   0UL},
 +
 +	{"atxmega16a4",   AVR20K,  AVR2K,  AVR1K},
++        {"atxmega16a4u",  AVR20K,  AVR2K,  AVR1K},
++	{"atxmega16c4",   AVR20K,  AVR2K,  AVR1K},
 +	{"atxmega16d4",   AVR20K,  AVR2K,  AVR1K},
 +
 +	{"at76c711",      AVR16K,  AVR2K,  0UL},
++	{"at90pwm161",    AVR16K,  AVR1K,  AVR512},
 +	{"at90pwm216",    AVR16K,  AVR1K,  AVR512},
 +	{"at90pwm316",    AVR16K,  AVR1K,  AVR512},
 +	{"at90usb162",    AVR16K,  AVR512, AVR512},
@@ -196,20 +247,25 @@ AVR specific only
 +	{"atmega164",     AVR16K,  AVR1K,  AVR512},
 +	{"atmega164a",    AVR16K,  AVR1K,  AVR512},
 +	{"atmega164p",    AVR16K,  AVR1K,  AVR512},
++	{"atmega164pa",   AVR16K,  AVR1K,  AVR512},
 +	{"atmega165a",    AVR16K,  AVR1K,  AVR512},
 +	{"atmega165",     AVR16K,  AVR1K,  AVR512},
 +	{"atmega165p",    AVR16K,  AVR1K,  AVR512},
++	{"atmega165pa",   AVR16K,  AVR1K,  AVR512},
 +	{"atmega168",     AVR16K,  AVR1K,  AVR512},
 +	{"atmega168a",    AVR16K,  AVR1K,  AVR512},
 +	{"atmega168p",    AVR16K,  AVR1K,  AVR512},
++	{"atmega168pa",   AVR16K,  AVR1K,  AVR512},
 +	{"atmega169",     AVR16K,  AVR1K,  AVR512},
 +	{"atmega169a",    AVR16K,  AVR1K,  AVR512},
 +	{"atmega169p",    AVR16K,  AVR1K,  AVR512},
 +	{"atmega169pa",   AVR16K,  AVR1K,  AVR512},
 +	{"atmega16hva",   AVR16K,  768UL,  AVR256},
 +	{"atmega16hva2",  AVR16K,  AVR1K,  AVR256},
-+   {"atmega16hvb",   AVR16K,  AVR1K,  AVR512},
++        {"atmega16hvb",   AVR16K,  AVR1K,  AVR512},
++        {"atmega16hvbrevb",AVR16K, AVR1K,  AVR512},
 +	{"atmega16m1",    AVR16K,  AVR1K,  AVR512},
++	{"attiny1634",    AVR16K,  AVR1K,  AVR256},
 +	{"atmega16u2",    AVR16K,  AVR512, AVR512},
 +	{"atmega16u4",    AVR16K,  1280UL, AVR512},
 +	{"attiny167",     AVR16K,  AVR512, AVR512},
@@ -224,8 +280,11 @@ AVR specific only
 +	{"at90s8515",     AVR8K,   AVR512, AVR512},
 +	{"at90s8535",     AVR8K,   AVR512, AVR512},
 +	{"at90usb82",     AVR8K,   AVR512, AVR512},
++	{"ata6285",       AVR8K,   AVR512, 320UL},
++	{"ata6286",       AVR8K,   AVR512, 320UL},
 +	{"ata6289",       AVR8K,   AVR512, 320UL},
 +	{"atmega8",       AVR8K,   AVR1K,  AVR512},
++	{"atmega8a",      AVR8K,   AVR1K,  AVR512},
 +	{"atmega8515",    AVR8K,   AVR512, AVR512},
 +	{"atmega8535",    AVR8K,   AVR512, AVR512},
 +	{"atmega88",      AVR8K,   AVR1K,  AVR512},
@@ -247,6 +306,7 @@ AVR specific only
 +	{"at90s4434",     AVR4K,   352UL,  AVR256},
 +	{"atmega48",      AVR4K,   AVR512, AVR256},
 +	{"atmega48a",     AVR4K,   AVR512, AVR256},
++	{"atmega48pa",    AVR4K,   AVR512, AVR256},
 +	{"atmega48p",     AVR4K,   AVR512, AVR256},
 +	{"attiny4313",    AVR4K,   AVR256, AVR256},
 +	{"attiny43u",     AVR4K,   AVR256, AVR64},
@@ -256,13 +316,14 @@ AVR specific only
 +	{"attiny461",     AVR4K,   AVR256, AVR256},
 +	{"attiny461a",    AVR4K,   AVR256, AVR256},
 +	{"attiny48",      AVR4K,   AVR256, AVR64},
++	{"attiny828",     AVR8K,   AVR512, AVR256},
 +
 +	{"at86rf401",     AVR2K,   224UL,  AVR128},
 +	{"at90s2313",     AVR2K,   AVR128, AVR128},
 +	{"at90s2323",     AVR2K,   AVR128, AVR128},
 +	{"at90s2333",     AVR2K,   224UL,  AVR128},
 +	{"at90s2343",     AVR2K,   AVR128, AVR128},
-+   {"attiny20",      AVR2K,   AVR128, 0UL},
++	{"attiny20",      AVR2K,   AVR128, 0UL},
 +	{"attiny22",      AVR2K,   224UL,  AVR128},
 +	{"attiny2313",    AVR2K,   AVR128, AVR128},
 +	{"attiny2313a",   AVR2K,   AVR128, AVR128},
@@ -273,19 +334,19 @@ AVR specific only
 +	{"attiny261",     AVR2K,   AVR128, AVR128},
 +	{"attiny261a",    AVR2K,   AVR128, AVR128},
 +	{"attiny28",      AVR2K,   0UL,    0UL},
-+   {"attiny40",      AVR2K,   AVR256, 0UL},
++	{"attiny40",      AVR2K,   AVR256, 0UL},
 +
 +	{"at90s1200",     AVR1K,   0UL,    AVR64},
-+   {"attiny9",       AVR1K,   32UL,   0UL},
-+   {"attiny10",      AVR1K,   32UL,   0UL},
++	{"attiny9",       AVR1K,   32UL,   0UL},
++	{"attiny10",      AVR1K,   32UL,   0UL},
 +	{"attiny11",      AVR1K,   0UL,    AVR64},
 +	{"attiny12",      AVR1K,   0UL,    AVR64},
 +	{"attiny13",      AVR1K,   AVR64,  AVR64},
 +	{"attiny13a",     AVR1K,   AVR64,  AVR64},
 +	{"attiny15",      AVR1K,   0UL,    AVR64},
 +
-+   {"attiny4",       AVR512,  32UL,   0UL},
-+   {"attiny5",       AVR512,  32UL,   0UL},
++	{"attiny4",       AVR512,  32UL,   0UL},
++	{"attiny5",       AVR512,  32UL,   0UL},
 +};
 +
 +static char *avrmcu = NULL;
@@ -294,17 +355,18 @@ AVR specific only
  static char *target = NULL;
  
  /* Forward declarations.  */
-@@ -79,7 +337,8 @@ usage (FILE *stream, int status)
+@@ -79,7 +401,9 @@ usage (FILE *stream, int status)
    fprintf (stream, _(" Displays the sizes of sections inside binary files\n"));
    fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n"));
    fprintf (stream, _(" The options are:\n\
 -  -A|-B     --format={sysv|berkeley}  Select output style (default is %s)\n\
 +  -A|-B|-C  --format={sysv|berkeley|avr}  Select output style (default is %s)\n\
 +            --mcu=<avrmcu>            MCU name for AVR format only\n\
++            --mlist-devices           List all supported MCUs\n\
    -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex\n\
    -t        --totals                  Display the total sizes (Berkeley only)\n\
              --common                  Display total size for *COM* syms\n\
-@@ -88,11 +337,7 @@ usage (FILE *stream, int status)
+@@ -88,11 +412,7 @@ usage (FILE *stream, int status)
    -h        --help                    Display this information\n\
    -v        --version                 Display the program's version\n\
  \n"),
@@ -317,23 +379,55 @@ AVR specific only
  );
    list_supported_targets (program_name, stream);
    if (REPORT_BUGS_TO[0] && status == 0)
-@@ -103,6 +359,7 @@ usage (FILE *stream, int status)
+@@ -103,6 +423,8 @@ usage (FILE *stream, int status)
  #define OPTION_FORMAT (200)
  #define OPTION_RADIX (OPTION_FORMAT + 1)
  #define OPTION_TARGET (OPTION_RADIX + 1)
 +#define OPTION_MCU (OPTION_TARGET + 1) 
++#define OPTION_MLIST_DEVICES (OPTION_MCU + 1)
  
  static struct option long_options[] =
  {
-@@ -110,6 +368,7 @@ static struct option long_options[] =
+@@ -110,12 +432,38 @@ static struct option long_options[] =
    {"format", required_argument, 0, OPTION_FORMAT},
    {"radix", required_argument, 0, OPTION_RADIX},
    {"target", required_argument, 0, OPTION_TARGET},
 +  {"mcu", required_argument, 0, 203},
++  {"mlist-devices", no_argument, 0, OPTION_MLIST_DEVICES},
    {"totals", no_argument, &show_totals, 1},
    {"version", no_argument, &show_version, 1},
    {"help", no_argument, &show_help, 1},
-@@ -141,7 +399,7 @@ main (int argc, char **argv)
+   {0, no_argument, 0, 0}
+ };
+ 
++static void list_supported_devices (FILE *stream, int status)
++{
++  unsigned int i ;
++  int llen = 0;
++  fprintf (stream, _("List of supported devices:\n"));
++  for (i = 0; i < sizeof(avr) / sizeof(avr[0]); i++)
++  {
++    int slen = strlen(avr[i].name);
++    llen += slen + 1 ;
++    if (llen < 75)
++    {
++      fprintf (stream, _(" %s"), avr[i].name);
++    }
++    else
++    {
++      fprintf (stream, _("\n %s"), avr[i].name);
++      llen = slen + 2 ;
++    }
++  }
++  fprintf (stream, "\n");
++
++  exit (status);
++}
++
+ int main (int, char **);
+ 
+ int
+@@ -141,7 +489,7 @@ main (int argc, char **argv)
    bfd_init ();
    set_default_bfd_target ();
  
@@ -342,7 +436,7 @@ AVR specific only
  			   (int *) 0)) != EOF)
      switch (c)
        {
-@@ -150,11 +409,15 @@ main (int argc, char **argv)
+@@ -150,11 +498,15 @@ main (int argc, char **argv)
  	  {
  	  case 'B':
  	  case 'b':
@@ -360,7 +454,7 @@ AVR specific only
  	    break;
  	  default:
  	    non_fatal (_("invalid argument to --format: %s"), optarg);
-@@ -162,6 +424,10 @@ main (int argc, char **argv)
+@@ -162,6 +514,14 @@ main (int argc, char **argv)
  	  }
  	break;
  
@@ -368,10 +462,14 @@ AVR specific only
 +	avrmcu = optarg;
 +	break;
 +
++      case OPTION_MLIST_DEVICES:
++	list_supported_devices (stdout, 1);
++	break;
++
        case OPTION_TARGET:
  	target = optarg;
  	break;
-@@ -190,11 +457,14 @@ main (int argc, char **argv)
+@@ -190,11 +550,14 @@ main (int argc, char **argv)
  	break;
  
        case 'A':
@@ -388,7 +486,7 @@ AVR specific only
        case 'v':
        case 'V':
  	show_version = 1;
-@@ -240,7 +509,7 @@ main (int argc, char **argv)
+@@ -240,7 +603,7 @@ main (int argc, char **argv)
      for (; optind < argc;)
        display_file (argv[optind++]);
  
@@ -397,7 +495,7 @@ AVR specific only
      {
        bfd_size_type total = total_textsize + total_datasize + total_bsssize;
  
-@@ -599,13 +869,117 @@ print_sysv_format (bfd *file)
+@@ -599,13 +962,117 @@ print_sysv_format (bfd *file)
    printf ("\n\n");
  }
  
diff --git a/303-binutils-dwarf2-AVRStudio-workaround.patch b/201-binutils-dwarf2-AVRStudio-workaround.patch
similarity index 80%
rename from 303-binutils-dwarf2-AVRStudio-workaround.patch
rename to 201-binutils-dwarf2-AVRStudio-workaround.patch
index 0813ff1..2d541c0 100644
--- a/303-binutils-dwarf2-AVRStudio-workaround.patch
+++ b/201-binutils-dwarf2-AVRStudio-workaround.patch
@@ -1,7 +1,7 @@
 diff -Naurp gas/dwarf2dbg.c gas/dwarf2dbg.c
---- gas/dwarf2dbg.c	2011-11-28 13:04:11.000000000 +0530
-+++ gas/dwarf2dbg.c	2011-11-28 16:33:02.000000000 +0530
-@@ -116,8 +116,11 @@
+--- gas/dwarf2dbg.c	2012-12-06 15:20:06.000000000 +0530
++++ gas/dwarf2dbg.c	2012-12-06 15:06:44.000000000 +0530
+@@ -126,8 +126,11 @@
     Note: If you want to change this, you'll have to update the
     "standard_opcode_lengths" table that is emitted below in
     out_debug_line().  */
@@ -14,7 +14,7 @@ diff -Naurp gas/dwarf2dbg.c gas/dwarf2dbg.c
  #ifndef DWARF2_LINE_BASE
    /* Minimum line offset in a special line info. opcode.  This value
       was chosen to give a reasonable range of values.  */
-@@ -1482,9 +1485,11 @@ out_debug_line (segT line_seg)
+@@ -1520,9 +1523,11 @@ out_debug_line (segT line_seg)
    out_byte (0);			/* DW_LNS_set_basic_block */
    out_byte (0);			/* DW_LNS_const_add_pc */
    out_byte (1);			/* DW_LNS_fixed_advance_pc */
diff --git a/202-binutils-bug13113.patch b/202-binutils-bug13113.patch
new file mode 100644
index 0000000..ef59edd
--- /dev/null
+++ b/202-binutils-bug13113.patch
@@ -0,0 +1,48 @@
+diff -Naurp gas/config/tc-avr.c gas/config/tc-avr.c
+--- gas/config/tc-avr.c	2013-01-02 16:33:12.000000000 +0530
++++ gas/config/tc-avr.c	2013-01-02 16:44:28.000000000 +0530
+@@ -404,7 +404,8 @@ static struct hash_control *avr_mod_hash
+ #define OPTION_MMCU 'm'
+ enum options
+ {
+-  OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
++  OPTION_MLIST_DEVICES = OPTION_MD_BASE + 1,
++  OPTION_ALL_OPCODES,
+   OPTION_NO_SKIP_BUG,
+   OPTION_NO_WRAP,
+   OPTION_LINK_RELAX
+@@ -413,6 +414,7 @@ enum options
+ struct option md_longopts[] =
+ {
+   { "mmcu",   required_argument, NULL, OPTION_MMCU        },
++  { "mlist-devices", no_argument, NULL, OPTION_MLIST_DEVICES },
+   { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
+   { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
+   { "mno-wrap",     no_argument, NULL, OPTION_NO_WRAP     },
+@@ -518,14 +520,14 @@ md_show_usage (FILE *stream)
+ 	"                   avrtiny   - AVR Tiny core\n"
+ 	"                   or immediate microcontroller name.\n"));
+   fprintf (stream,
+-      _("  -mall-opcodes    accept all AVR opcodes, even if not supported by MCU\n"
++       _("  -mlist-devices   list all supported devices\n"
++    "  -mall-opcodes    accept all AVR opcodes, even if not supported by MCU\n"
+ 	"  -mno-skip-bug    disable warnings for skipping two-word instructions\n"
+ 	"                   (default for avr4, avr5)\n"
+ 	"  -mno-wrap        reject rjmp/rcall instructions with 8K wrap-around\n"
+ 	"                   (default for avr3, avr5)\n"
+     "  -mlink-relax     generate relocations for linker relaxation\n"
+     ));
+-  show_mcu_list (stream);
+ }
+ 
+ static void
+@@ -577,6 +579,9 @@ md_parse_option (int c, char *arg)
+ 		    avr_mcu->name, mcu_types[i].name);
+ 	return 1;
+       }
++    case OPTION_MLIST_DEVICES:
++      show_mcu_list(stdout);
++      exit (EXIT_SUCCESS);
+     case OPTION_ALL_OPCODES:
+       avr_opt.all_opcodes = 1;
+       return 1;
diff --git a/301-binutils-avr-coff.patch b/301-binutils-avr-coff.patch
deleted file mode 100644
index d3c2a17..0000000
--- a/301-binutils-avr-coff.patch
+++ /dev/null
@@ -1,5506 +0,0 @@
-diff -Naurp bfd/coff-avr.c bfd/coff-avr.c
---- bfd/coff-avr.c	1970-01-01 05:30:00.000000000 +0530
-+++ bfd/coff-avr.c	2011-11-30 12:59:26.000000000 +0530
-@@ -0,0 +1,613 @@
-+/* BFD back-end for Atmel AVR COFF files.
-+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2003
-+   Free Software Foundation, Inc.
-+   Created mostly by substituting "avr" for "i860" in coff-i860.c
-+
-+This file is part of BFD, the Binary File Descriptor library.
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2 of the License, or
-+(at your option) any later version.
-+
-+This program is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with this program; if not, write to the Free Software
-+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-+
-+#include "bfd.h"
-+#include "sysdep.h"
-+#include "libbfd.h"
-+
-+#include "coff/avr.h"
-+
-+#include "coff/internal.h"
-+
-+#include "libcoff.h"
-+
-+static bfd_reloc_status_type coff_avr_reloc
-+  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-+static reloc_howto_type *coff_avr_rtype_to_howto
-+  PARAMS ((bfd *, asection *, struct internal_reloc *,
-+	   struct coff_link_hash_entry *, struct internal_syment *,
-+	   bfd_vma *));
-+static const bfd_target * coff_avr_object_p PARAMS ((bfd *));
-+
-+#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
-+/* The page size is a guess based on ELF.  */
-+
-+#define COFF_PAGE_SIZE 0x1000
-+
-+/* For some reason when using avr COFF the value stored in the .text
-+   section for a reference to a common symbol is the value itself plus
-+   any desired offset.  Ian Taylor, Cygnus Support.  */
-+
-+/* If we are producing relocateable output, we need to do some
-+   adjustments to the object file that are not done by the
-+   bfd_perform_relocation function.  This function is called by every
-+   reloc type to make any required adjustments.  */
-+
-+static bfd_reloc_status_type
-+coff_avr_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
-+		 error_message)
-+     bfd *abfd;
-+     arelent *reloc_entry;
-+     asymbol *symbol;
-+     PTR data;
-+     asection *input_section ATTRIBUTE_UNUSED;
-+     bfd *output_bfd;
-+     char **error_message ATTRIBUTE_UNUSED;
-+{
-+  symvalue diff;
-+
-+  if (output_bfd == (bfd *) NULL)
-+    return bfd_reloc_continue;
-+
-+  if (bfd_is_com_section (symbol->section))
-+    {
-+      /* We are relocating a common symbol.  The current value in the
-+	 object file is ORIG + OFFSET, where ORIG is the value of the
-+	 common symbol as seen by the object file when it was compiled
-+	 (this may be zero if the symbol was undefined) and OFFSET is
-+	 the offset into the common symbol (normally zero, but may be
-+	 non-zero when referring to a field in a common structure).
-+	 ORIG is the negative of reloc_entry->addend, which is set by
-+	 the CALC_ADDEND macro below.  We want to replace the value in
-+	 the object file with NEW + OFFSET, where NEW is the value of
-+	 the common symbol which we are going to put in the final
-+	 object file.  NEW is symbol->value.  */
-+      diff = symbol->value + reloc_entry->addend;
-+    }
-+  else
-+    {
-+      /* For some reason bfd_perform_relocation always effectively
-+	 ignores the addend for a COFF target when producing
-+	 relocateable output.  This seems to be always wrong for 860
-+	 COFF, so we handle the addend here instead.  */
-+      diff = reloc_entry->addend;
-+    }
-+
-+#define DOIT(x) \
-+  x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
-+
-+    if (diff != 0)
-+      {
-+	reloc_howto_type *howto = reloc_entry->howto;
-+	unsigned char *addr = (unsigned char *) data + reloc_entry->address;
-+
-+	switch (howto->size)
-+	  {
-+	  case 0:
-+	    {
-+	      char x = bfd_get_8 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_8 (abfd, x, addr);
-+	    }
-+	    break;
-+
-+	  case 1:
-+	    {
-+	      short x = bfd_get_16 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_16 (abfd, (bfd_vma) x, addr);
-+	    }
-+	    break;
-+
-+	  case 2:
-+	    {
-+	      long x = bfd_get_32 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_32 (abfd, (bfd_vma) x, addr);
-+	    }
-+	    break;
-+
-+	  default:
-+	    abort ();
-+	  }
-+      }
-+
-+  /* Now let bfd_perform_relocation finish everything up.  */
-+  return bfd_reloc_continue;
-+}
-+
-+#ifndef PCRELOFFSET
-+#define PCRELOFFSET FALSE
-+#endif
-+
-+static reloc_howto_type howto_table[] =
-+{
-+  EMPTY_HOWTO (0),
-+  EMPTY_HOWTO (1),
-+  EMPTY_HOWTO (2),
-+  EMPTY_HOWTO (3),
-+  EMPTY_HOWTO (4),
-+  EMPTY_HOWTO (5),
-+  HOWTO (R_DIR32,               /* type */
-+	 0,	                /* rightshift */
-+	 2,	                /* size (0 = byte, 1 = short, 2 = long) */
-+	 32,	                /* bitsize */
-+	 FALSE,	                /* pc_relative */
-+	 0,	                /* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_avr_reloc,       /* special_function */
-+	 "dir32",               /* name */
-+	 TRUE,	                /* partial_inplace */
-+	 0xffffffff,            /* src_mask */
-+	 0xffffffff,            /* dst_mask */
-+	 TRUE),                /* pcrel_offset */
-+  /* {7}, */
-+  HOWTO (R_IMAGEBASE,            /* type */
-+	 0,	                /* rightshift */
-+	 2,	                /* size (0 = byte, 1 = short, 2 = long) */
-+	 32,	                /* bitsize */
-+	 FALSE,	                /* pc_relative */
-+	 0,	                /* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_avr_reloc,       /* special_function */
-+	 "rva32",	           /* name */
-+	 TRUE,	                /* partial_inplace */
-+	 0xffffffff,            /* src_mask */
-+	 0xffffffff,            /* dst_mask */
-+	 FALSE),                /* pcrel_offset */
-+  EMPTY_HOWTO (010),
-+  EMPTY_HOWTO (011),
-+  EMPTY_HOWTO (012),
-+  EMPTY_HOWTO (013),
-+  EMPTY_HOWTO (014),
-+  EMPTY_HOWTO (015),
-+  EMPTY_HOWTO (016),
-+  HOWTO (R_RELBYTE,		/* type */
-+	 0,			/* rightshift */
-+	 0,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 8,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "8",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x000000ff,		/* src_mask */
-+	 0x000000ff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_RELWORD,		/* type */
-+	 0,			/* rightshift */
-+	 1,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "16",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x0000ffff,		/* src_mask */
-+	 0x0000ffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_RELLONG,		/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 32,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "32",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0xffffffff,		/* src_mask */
-+	 0xffffffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRBYTE,		/* type */
-+	 0,			/* rightshift */
-+	 0,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 8,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "DISP8",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x000000ff,		/* src_mask */
-+	 0x000000ff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRWORD,		/* type */
-+	 0,			/* rightshift */
-+	 1,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "DISP16",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x0000ffff,		/* src_mask */
-+	 0x0000ffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRLONG,		/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 32,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_avr_reloc,	/* special_function */
-+	 "DISP32",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0xffffffff,		/* src_mask */
-+	 0xffffffff,		/* dst_mask */
-+	 PCRELOFFSET)		/* pcrel_offset */
-+};
-+
-+/* Turn a howto into a reloc  nunmber */
-+
-+#define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
-+#define BADMAG(x) AVRBADMAG(x)
-+#define AVR 1			/* Customize coffcode.h */
-+
-+#define RTYPE2HOWTO(cache_ptr, dst) \
-+	    (cache_ptr)->howto = howto_table + (dst)->r_type;
-+
-+/* For AVR COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
-+   library.  On some other COFF targets STYP_BSS is normally
-+   STYP_NOLOAD.  */
-+#define BSS_NOLOAD_IS_SHARED_LIBRARY
-+
-+/* Compute the addend of a reloc.  If the reloc is to a common symbol,
-+   the object file contains the value of the common symbol.  By the
-+   time this is called, the linker may be using a different symbol
-+   from a different object file with a different value.  Therefore, we
-+   hack wildly to locate the original symbol from this file so that we
-+   can make the correct adjustment.  This macro sets coffsym to the
-+   symbol from the original file, and uses it to set the addend value
-+   correctly.  If this is not a common symbol, the usual addend
-+   calculation is done, except that an additional tweak is needed for
-+   PC relative relocs.
-+   FIXME: This macro refers to symbols and asect; these are from the
-+   calling function, not the macro arguments.  */
-+
-+#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)		\
-+  {								\
-+    coff_symbol_type *coffsym = (coff_symbol_type *) NULL;	\
-+    if (ptr && bfd_asymbol_bfd (ptr) != abfd)			\
-+      coffsym = (obj_symbols (abfd)				\
-+	         + (cache_ptr->sym_ptr_ptr - symbols));		\
-+    else if (ptr)						\
-+      coffsym = coff_symbol_from (abfd, ptr);			\
-+    if (coffsym != (coff_symbol_type *) NULL			\
-+	&& coffsym->native->u.syment.n_scnum == 0)		\
-+      cache_ptr->addend = - coffsym->native->u.syment.n_value;	\
-+    else if (ptr && bfd_asymbol_bfd (ptr) == abfd		\
-+	     && ptr->section != (asection *) NULL)		\
-+      cache_ptr->addend = - (ptr->section->vma + ptr->value);	\
-+    else							\
-+      cache_ptr->addend = 0;					\
-+    if (ptr && howto_table[reloc.r_type].pc_relative)		\
-+      cache_ptr->addend += asect->vma;				\
-+  }
-+
-+/* We use the special COFF backend linker.  */
-+#define coff_relocate_section _bfd_coff_generic_relocate_section
-+
-+static reloc_howto_type *
-+coff_avr_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-+     bfd *abfd ATTRIBUTE_UNUSED;
-+     asection *sec;
-+     struct internal_reloc *rel;
-+     struct coff_link_hash_entry *h;
-+     struct internal_syment *sym;
-+     bfd_vma *addendp;
-+{
-+
-+  reloc_howto_type *howto;
-+
-+  howto = howto_table + rel->r_type;
-+
-+  if (howto->pc_relative)
-+    *addendp += sec->vma;
-+
-+  if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
-+    {
-+      /* This is a common symbol.  The section contents include the
-+	 size (sym->n_value) as an addend.  The relocate_section
-+	 function will be adding in the final value of the symbol.  We
-+	 need to subtract out the current size in order to get the
-+	 correct result.  */
-+
-+      BFD_ASSERT (h != NULL);
-+
-+      /* I think we *do* want to bypass this.  If we don't, I have seen some data
-+	 parameters get the wrong relcation address.  If I link two versions
-+	 with and without this section bypassed and then do a binary comparison,
-+	 the addresses which are different can be looked up in the map.  The
-+	 case in which this section has been bypassed has addresses which correspond
-+	 to values I can find in the map.  */
-+      *addendp -= sym->n_value;
-+    }
-+
-+  /* If the output symbol is common (in which case this must be a
-+     relocateable link), we need to add in the final size of the
-+     common symbol.  */
-+  if (h != NULL && h->root.type == bfd_link_hash_common)
-+    *addendp += h->root.u.c.size;
-+
-+  return howto;
-+}
-+
-+#define coff_rtype_to_howto coff_avr_rtype_to_howto
-+
-+#ifndef bfd_pe_print_pdata
-+#define bfd_pe_print_pdata	NULL
-+#endif
-+
-+#include "coffcode.h"
-+
-+static const bfd_target *
-+coff_avr_object_p(a)
-+     bfd *a;
-+{
-+  return coff_object_p (a);
-+}
-+
-+/* Handle all the abominations of AVR COFF:
-+
-+   Generic COFF always uses the D1 slot to indicate the "most
-+   important" derived type, and the D2...Dn slots for decreasing
-+   importance.  E. g., a function symbol will always have its DT_FCN
-+   element in D1, an array its DT_ARY (its first DT_ARY in a
-+   multi-dimensional array).  In contrast, AVR COFF expects this most
-+   important derived type specifier in the upmost Dn slot that is
-+   allocated at all (i. e. that is != 0).
-+
-+   Generic COFF says that "Any symbol that satisfies more than one
-+   condition [... for AUX entries] should have a union format in its
-+   auxiliary entry."  AVR COFF uses sepearate AUX entries for multiple
-+   derived types, and in some cases (like the ISFCN one), even puts
-+   the most important one into the last allocated AUX entry.  We
-+   join/split them here at the border as well.  Note that when
-+   generating AUX entries (where we need to split them), the n_numaux
-+   field must already have been set up properly (e. g. in
-+   binutils/wrcoff.c) since the entry renumbering and pointerization
-+   would not work otherwise.  Thus, we only split the information into
-+   multiple records if n_numaux > 1.  For similar reasons, we keep
-+   n_numaux > 1 on input to keep the appropriate AUX entries
-+   allocated, so a symbol can be reconstructed if it is being passed
-+   through one of the GNU tools.
-+
-+   Note that this adjustment is called after the symbol itself has
-+   been swapped in, but before the AUX entries are swapped in.  This
-+   is the only hook available that could swap (or merge) AUX entries
-+   at all, so we have to operate on the external AUX entries still. */
-+
-+void
-+avr_coff_adjust_sym_in_post (abfd, ext, in)
-+     bfd *abfd;
-+     PTR ext;
-+     PTR in;
-+{
-+  struct internal_syment *dst = (struct internal_syment *)in;
-+  unsigned short dt, bt, ndt;
-+  dt = dst->n_type & ~N_BTMASK;
-+  bt = BTYPE (dst->n_type);
-+
-+  /* Some AVR COFF producers seem to violate the COFF specs, and
-+     produce symbols for tag names that have the C_FOO filled in
-+     properly, but T_NULL as the base type value.  Patch up here,
-+     since some of our generic COFF tools (in particular
-+     binutils/rdcoff.c) rely on the correct data. */
-+  if (bt == T_NULL)
-+    switch (dst->n_sclass)
-+      {
-+      case C_STRTAG:
-+	bt = T_STRUCT;
-+	break;
-+
-+      case C_UNTAG:
-+	bt = T_UNION;
-+	break;
-+
-+      case C_ENTAG:
-+	bt = T_ENUM;
-+	break;
-+      }
-+
-+  /* Swap the derived type slots. */
-+  if (dt != 0)
-+    {
-+      ndt = 0;
-+      while (dt != 0)
-+	{
-+	  ndt = (ndt << N_TSHIFT) | (dt & (N_TMASK >> N_BTSHFT));
-+	  dt >>= N_TSHIFT;
-+	}
-+      dst->n_type = (ndt << N_BTSHFT) | bt;
-+    }
-+  else
-+    dst->n_type = bt;
-+
-+  /* If the derived type is function, and there is more than one AUX
-+     entry, swap the first and the last AUX entry, so the most
-+     interesting one will become the first.
-+
-+     If the fundamental type is a tagged type (struct/union/enum), try
-+     to find the AUX entry describing the tagged type (the one that
-+     has x_sym.x_tagndx filled in), and merge the tag index into the
-+     first AUX entry.  Depending on the actual input file, there might
-+     be further DT_PTR entries which we just ignore, since we could
-+     not handle that information anyway. */
-+  if (dst->n_numaux > 1 && dst->n_sclass != C_FILE)
-+    {
-+      AUXENT caux, *auxp1, *auxp2;
-+      size_t symesz;
-+      unsigned int i;
-+
-+      symesz = bfd_coff_symesz (abfd);
-+      i = dst->n_numaux;
-+
-+      auxp1 = (AUXENT *)((char *)ext + symesz);
-+      auxp2 = (AUXENT *)((char *)ext + i * symesz);
-+
-+      if (ISFCN (dst->n_type)
-+	  || (ISPTR(dst->n_type)
-+	      && (bt == T_STRUCT || bt == T_UNION || bt == T_ENUM)))
-+	{
-+	  caux = *auxp2;
-+	  *auxp2 = *auxp1;
-+	  *auxp1 = caux;
-+	}
-+      else
-+	caux = *auxp1;
-+
-+      if ((ISFCN (dst->n_type) || ISARY (dst->n_type))
-+	  && (bt == T_STRUCT || bt == T_UNION || bt == T_ENUM))
-+	{
-+	  while (i > 1)
-+	    {
-+	      auxp2 = (AUXENT *)((char *)ext + i * symesz);
-+
-+	      if (auxp2->x_sym.x_tagndx[0] != 0 || auxp2->x_sym.x_tagndx[1] != 0
-+		  || auxp2->x_sym.x_tagndx[2] != 0 || auxp2->x_sym.x_tagndx[3] != 0)
-+		{
-+		  memcpy (caux.x_sym.x_tagndx, auxp2->x_sym.x_tagndx,
-+			  4 * sizeof (char));
-+		  break;
-+		}
-+	      i--;
-+	    }
-+	  if (i > 1)
-+	    *auxp1 = caux;
-+	}
-+    }
-+}
-+
-+/* When exporting an AVR COFF file, just undo all that has been done
-+   above.  Again, we are called after the symbol itself has been
-+   swapped out, but before the AUX entries are being written.
-+   Unfortunately, we are only given a pointer to the symbol itself, so
-+   we have to derive the pointer to the respective aux entries from
-+   that address, which is a bit clumsy. */
-+void
-+avr_coff_adjust_sym_out_post (abfd, in, ext)
-+     bfd *abfd;
-+     PTR in;
-+     PTR ext;
-+{
-+  struct internal_syment *src = (struct internal_syment *)(in);
-+  struct external_syment *dst = (struct external_syment *)(ext);
-+  unsigned short dt, bt, ndt;
-+
-+  dt = src->n_type & ~N_BTMASK;
-+  bt = BTYPE (src->n_type);
-+
-+  if (dt != 0)
-+    {
-+      ndt = 0;
-+      while (dt != 0)
-+	{
-+	  ndt = (ndt << N_TSHIFT) | (dt & (N_TMASK >> N_BTSHFT));
-+	  dt >>= N_TSHIFT;
-+	}
-+      H_PUT_16 (abfd, (ndt << N_BTSHFT) | bt, dst->e_type);
-+    }
-+
-+  if (src->n_numaux > 1 && src->n_sclass != C_FILE)
-+    {
-+      combined_entry_type *srce, *dste;
-+      char *hackp;
-+      unsigned int i;
-+
-+      /* Recover the original combinend_entry_type *. */
-+      hackp = (char *)in;
-+      hackp -= offsetof(combined_entry_type, u.syment);
-+      srce = (combined_entry_type *)hackp;
-+      srce++;
-+
-+      /* We simply duplicate the first AUX entry as many times as
-+	 needed.  Since COFF itself normally uses just a single AUX
-+	 entry for all the information, this will work -- each COFF
-+	 consumer will then just pick the fields it is particularly
-+	 interested in.  This would not work for the AVR COFF specific
-+	 DT_PTR AUX entries, but we don't support them anyway. */
-+      for (i = 1; i < src->n_numaux; i++)
-+	{
-+	  dste = srce + i;
-+	  *dste = *srce;
-+	}
-+    }
-+}
-+
-+const bfd_target
-+#ifdef TARGET_SYM
-+  TARGET_SYM =
-+#else
-+  avrcoff_vec =
-+#endif
-+{
-+#ifdef TARGET_NAME
-+  TARGET_NAME,
-+#else
-+  "coff-avr",			/* name */
-+#endif
-+  bfd_target_coff_flavour,
-+  BFD_ENDIAN_LITTLE,		/* data byte order is little */
-+  BFD_ENDIAN_LITTLE,		/* header byte order is little */
-+
-+  (HAS_RELOC | EXEC_P |		/* object flags */
-+   HAS_LINENO | HAS_DEBUG |
-+   HAS_SYMS | HAS_LOCALS | WP_TEXT),
-+
-+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
-+  0,				/* leading char */
-+  '/',				/* ar_pad_char */
-+  15,				/* ar_max_namelen */
-+  0,				/* match_priority */
-+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
-+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-+
-+/* Note that we allow an object file to be treated as a core file as well.  */
-+    {_bfd_dummy_target, coff_avr_object_p, /* bfd_check_format */
-+       bfd_generic_archive_p, coff_avr_object_p},
-+    {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
-+       bfd_false},
-+    {bfd_false, coff_write_object_contents, /* bfd_write_contents */
-+       _bfd_write_archive_contents, bfd_false},
-+
-+     BFD_JUMP_TABLE_GENERIC (coff),
-+     BFD_JUMP_TABLE_COPY (coff),
-+     BFD_JUMP_TABLE_CORE (_bfd_nocore),
-+     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
-+     BFD_JUMP_TABLE_SYMBOLS (coff),
-+     BFD_JUMP_TABLE_RELOCS (coff),
-+     BFD_JUMP_TABLE_WRITE (coff),
-+     BFD_JUMP_TABLE_LINK (coff),
-+     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-+
-+  NULL,
-+
-+  COFF_SWAP_TABLE
-+};
-diff -Naurp bfd/coffcode.h bfd/coffcode.h
---- bfd/coffcode.h	2011-08-17 06:09:38.000000000 +0530
-+++ bfd/coffcode.h	2011-11-30 12:54:36.000000000 +0530
-@@ -1,3 +1,4 @@
-+
- /* Support for the generic parts of most COFF variants, for BFD.
-    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-@@ -1968,6 +1969,17 @@ coff_mkobject (bfd * abfd)
-   coff->relocbase = 0;
-   coff->local_toc_sym_map = 0;
- 
-+  /* These members communicate important constants about the symbol
-+     table to GDB's symbol-reading code.  These `constants'
-+     unfortunately vary among coff implementations...  */
-+  coff->local_n_btmask = N_BTMASK;
-+  coff->local_n_btshft = N_BTSHFT;
-+  coff->local_n_tmask = N_TMASK;
-+  coff->local_n_tshift = N_TSHIFT;
-+  coff->local_symesz = bfd_coff_symesz (abfd);
-+  coff->local_auxesz = bfd_coff_auxesz (abfd);
-+  coff->local_linesz = bfd_coff_linesz (abfd);
-+
- /*  make_abs_section(abfd);*/
- 
-   return TRUE;
-@@ -1992,17 +2004,6 @@ coff_mkobject_hook (bfd * abfd,
- 
-   coff->sym_filepos = internal_f->f_symptr;
- 
--  /* These members communicate important constants about the symbol
--     table to GDB's symbol-reading code.  These `constants'
--     unfortunately vary among coff implementations...  */
--  coff->local_n_btmask = N_BTMASK;
--  coff->local_n_btshft = N_BTSHFT;
--  coff->local_n_tmask = N_TMASK;
--  coff->local_n_tshift = N_TSHIFT;
--  coff->local_symesz = bfd_coff_symesz (abfd);
--  coff->local_auxesz = bfd_coff_auxesz (abfd);
--  coff->local_linesz = bfd_coff_linesz (abfd);
--
-   coff->timestamp = internal_f->f_timdat;
- 
-   obj_raw_syment_count (abfd) =
-@@ -2134,6 +2135,11 @@ coff_set_arch_mach_hook (bfd *abfd, void
- 	}
-       break;
- #endif
-+#ifdef AVRMAGIC
-+    case AVRMAGIC:
-+      arch = bfd_arch_avr;
-+      break;
-+#endif
- #ifdef MC68MAGIC
-     case MC68MAGIC:
-     case M68MAGIC:
-@@ -2913,6 +2919,13 @@ coff_set_flags (bfd * abfd,
-       return TRUE;
- #endif
- 
-+#ifdef AVRMAGIC
-+    case bfd_arch_avr:
-+      *magicp = AVRMAGIC;
-+      return TRUE;
-+      break;
-+#endif
-+
- #ifdef PPCMAGIC
-     case bfd_arch_powerpc:
-       *magicp = PPCMAGIC;
-@@ -3741,6 +3754,11 @@ coff_write_object_contents (bfd * abfd)
-       section.s_page = 0;
- #endif
- 
-+#ifdef AVR
-+      /* AVR uses s_paddr the way GNU uses s_vaddr, and effectively
-+	 ignores s_vaddr. */
-+      section.s_paddr = current->vma;
-+#endif
- #ifdef COFF_WITH_PE
-       section.s_paddr = 0;
- #endif
-@@ -4087,6 +4105,17 @@ coff_write_object_contents (bfd * abfd)
-     internal_a.magic = ZMAGIC;
- #endif
- 
-+#ifdef AVR
-+    /* a.out is a dummy for non-extended COFF */
-+    internal_a.magic = AVRAOUTMAGIC;
-+    /* Upper nibble of f_flags must be set for historical reasons.
-+       The upper byte remains blank on coff-avr, so undo the F_AR32WR
-+       setting performed above. */
-+    internal_f.f_flags |= F_JUNK;
-+    internal_f.f_flags &= ~F_UNUSED;
-+#define __A_MAGIC_SET__
-+#endif /* AVR */
-+
- #if defined(PPC_PE)
- #define __A_MAGIC_SET__
-     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
-@@ -4149,8 +4178,16 @@ coff_write_object_contents (bfd * abfd)
- #endif
-   }
- 
-+#ifdef AVR_EXT_COFF
-+    /* Note that we do not set F_PTRINFO because the GNU toolchain
-+       doesn't provide any information about the target of a pointer,
-+       so we cannot derive which section our pointer target would be
-+       in. */
-+  internal_a.vstamp = F_FULLPATHS | F_STRUCTINFO;
-+#else
-   /* FIXME: Does anybody ever set this to another value?  */
-   internal_a.vstamp = 0;
-+#endif
- 
-   /* Now should write relocs, strings, syms.  */
-   obj_sym_filepos (abfd) = sym_base;
-@@ -4708,6 +4745,10 @@ coff_slurp_symbol_table (bfd * abfd)
- 	    /* In PE, 0x69 (105) denotes a weak external symbol.  */
- 	    case C_NT_WEAK:
- #endif
-+#ifdef AVR
-+	    /* Some AVR COFF compilers handle EXTDEF like EXT. */
-+	    case C_EXTDEF:	/* external definition		 */
-+#endif
- 	      switch (coff_classify_symbol (abfd, &src->u.syment))
- 		{
- 		case COFF_SYMBOL_GLOBAL:
-@@ -4940,7 +4981,9 @@ coff_slurp_symbol_table (bfd * abfd)
-                 break;
- #endif
- 	      /* Fall through.  */
-+#if !defined(AVR)
- 	    case C_EXTDEF:	/* External definition.  */
-+#endif
- 	    case C_ULABEL:	/* Undefined label.  */
- 	    case C_USTATIC:	/* Undefined static.  */
- #ifndef COFF_WITH_PE
-diff -Naurp bfd/coff-ext-avr.c bfd/coff-ext-avr.c
---- bfd/coff-ext-avr.c	1970-01-01 05:30:00.000000000 +0530
-+++ bfd/coff-ext-avr.c	2011-11-30 15:09:15.000000000 +0530
-@@ -0,0 +1,428 @@
-+/* BFD back-end for Atmel AVR "extended" COFF files.
-+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2003
-+   Free Software Foundation, Inc.
-+   This is mostly the same as avr-coff, except of the presence of the
-+   COFF optional header.
-+
-+This file is part of BFD, the Binary File Descriptor library.
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2 of the License, or
-+(at your option) any later version.
-+
-+This program is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with this program; if not, write to the Free Software
-+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-+
-+#include "bfd.h"
-+#include "sysdep.h"
-+#include "libbfd.h"
-+
-+#define AVR_EXT_COFF 1
-+#include "coff/avr.h"
-+
-+#include "coff/internal.h"
-+
-+#include "libcoff.h"
-+
-+static bfd_reloc_status_type coff_ext_avr_reloc
-+  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
-+static reloc_howto_type *coff_ext_avr_rtype_to_howto
-+  PARAMS ((bfd *, asection *, struct internal_reloc *,
-+	   struct coff_link_hash_entry *, struct internal_syment *,
-+	   bfd_vma *));
-+static const bfd_target * coff_ext_avr_object_p PARAMS ((bfd *));
-+
-+#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
-+/* The page size is a guess based on ELF.  */
-+
-+#define COFF_PAGE_SIZE 0x1000
-+
-+/* For some reason when using avr COFF the value stored in the .text
-+   section for a reference to a common symbol is the value itself plus
-+   any desired offset.  Ian Taylor, Cygnus Support.  */
-+
-+/* If we are producing relocateable output, we need to do some
-+   adjustments to the object file that are not done by the
-+   bfd_perform_relocation function.  This function is called by every
-+   reloc type to make any required adjustments.  */
-+
-+static bfd_reloc_status_type
-+coff_ext_avr_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
-+		 error_message)
-+     bfd *abfd;
-+     arelent *reloc_entry;
-+     asymbol *symbol;
-+     PTR data;
-+     asection *input_section ATTRIBUTE_UNUSED;
-+     bfd *output_bfd;
-+     char **error_message ATTRIBUTE_UNUSED;
-+{
-+  symvalue diff;
-+
-+  if (output_bfd == (bfd *) NULL)
-+    return bfd_reloc_continue;
-+
-+  if (bfd_is_com_section (symbol->section))
-+    {
-+      /* We are relocating a common symbol.  The current value in the
-+	 object file is ORIG + OFFSET, where ORIG is the value of the
-+	 common symbol as seen by the object file when it was compiled
-+	 (this may be zero if the symbol was undefined) and OFFSET is
-+	 the offset into the common symbol (normally zero, but may be
-+	 non-zero when referring to a field in a common structure).
-+	 ORIG is the negative of reloc_entry->addend, which is set by
-+	 the CALC_ADDEND macro below.  We want to replace the value in
-+	 the object file with NEW + OFFSET, where NEW is the value of
-+	 the common symbol which we are going to put in the final
-+	 object file.  NEW is symbol->value.  */
-+      diff = symbol->value + reloc_entry->addend;
-+    }
-+  else
-+    {
-+      /* For some reason bfd_perform_relocation always effectively
-+	 ignores the addend for a COFF target when producing
-+	 relocateable output.  This seems to be always wrong for 860
-+	 COFF, so we handle the addend here instead.  */
-+      diff = reloc_entry->addend;
-+    }
-+
-+#define DOIT(x) \
-+  x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
-+
-+    if (diff != 0)
-+      {
-+	reloc_howto_type *howto = reloc_entry->howto;
-+	unsigned char *addr = (unsigned char *) data + reloc_entry->address;
-+
-+	switch (howto->size)
-+	  {
-+	  case 0:
-+	    {
-+	      char x = bfd_get_8 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_8 (abfd, x, addr);
-+	    }
-+	    break;
-+
-+	  case 1:
-+	    {
-+	      short x = bfd_get_16 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_16 (abfd, (bfd_vma) x, addr);
-+	    }
-+	    break;
-+
-+	  case 2:
-+	    {
-+	      long x = bfd_get_32 (abfd, addr);
-+	      DOIT (x);
-+	      bfd_put_32 (abfd, (bfd_vma) x, addr);
-+	    }
-+	    break;
-+
-+	  default:
-+	    abort ();
-+	  }
-+      }
-+
-+  /* Now let bfd_perform_relocation finish everything up.  */
-+  return bfd_reloc_continue;
-+}
-+
-+#ifndef PCRELOFFSET
-+#define PCRELOFFSET FALSE
-+#endif
-+
-+static reloc_howto_type howto_table[] =
-+{
-+  EMPTY_HOWTO (0),
-+  EMPTY_HOWTO (1),
-+  EMPTY_HOWTO (2),
-+  EMPTY_HOWTO (3),
-+  EMPTY_HOWTO (4),
-+  EMPTY_HOWTO (5),
-+  HOWTO (R_DIR32,               /* type */
-+	 0,	                /* rightshift */
-+	 2,	                /* size (0 = byte, 1 = short, 2 = long) */
-+	 32,	                /* bitsize */
-+	 FALSE,	                /* pc_relative */
-+	 0,	                /* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,       /* special_function */
-+	 "dir32",               /* name */
-+	 TRUE,	                /* partial_inplace */
-+	 0xffffffff,            /* src_mask */
-+	 0xffffffff,            /* dst_mask */
-+	 TRUE),                /* pcrel_offset */
-+  /* {7}, */
-+  HOWTO (R_IMAGEBASE,            /* type */
-+	 0,	                /* rightshift */
-+	 2,	                /* size (0 = byte, 1 = short, 2 = long) */
-+	 32,	                /* bitsize */
-+	 FALSE,	                /* pc_relative */
-+	 0,	                /* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,       /* special_function */
-+	 "rva32",	           /* name */
-+	 TRUE,	                /* partial_inplace */
-+	 0xffffffff,            /* src_mask */
-+	 0xffffffff,            /* dst_mask */
-+	 FALSE),                /* pcrel_offset */
-+  EMPTY_HOWTO (010),
-+  EMPTY_HOWTO (011),
-+  EMPTY_HOWTO (012),
-+  EMPTY_HOWTO (013),
-+  EMPTY_HOWTO (014),
-+  EMPTY_HOWTO (015),
-+  EMPTY_HOWTO (016),
-+  HOWTO (R_RELBYTE,		/* type */
-+	 0,			/* rightshift */
-+	 0,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 8,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "8",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x000000ff,		/* src_mask */
-+	 0x000000ff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_RELWORD,		/* type */
-+	 0,			/* rightshift */
-+	 1,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "16",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x0000ffff,		/* src_mask */
-+	 0x0000ffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_RELLONG,		/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 32,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_bitfield, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "32",			/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0xffffffff,		/* src_mask */
-+	 0xffffffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRBYTE,		/* type */
-+	 0,			/* rightshift */
-+	 0,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 8,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "DISP8",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x000000ff,		/* src_mask */
-+	 0x000000ff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRWORD,		/* type */
-+	 0,			/* rightshift */
-+	 1,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "DISP16",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0x0000ffff,		/* src_mask */
-+	 0x0000ffff,		/* dst_mask */
-+	 PCRELOFFSET),		/* pcrel_offset */
-+  HOWTO (R_PCRLONG,		/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 32,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed, /* complain_on_overflow */
-+	 coff_ext_avr_reloc,	/* special_function */
-+	 "DISP32",		/* name */
-+	 TRUE,			/* partial_inplace */
-+	 0xffffffff,		/* src_mask */
-+	 0xffffffff,		/* dst_mask */
-+	 PCRELOFFSET)		/* pcrel_offset */
-+};
-+
-+/* Turn a howto into a reloc  nunmber */
-+
-+#define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
-+#define BADMAG(x) AVRBADMAG(x)
-+#define AVR 1			/* Customize coffcode.h */
-+
-+#define RTYPE2HOWTO(cache_ptr, dst) \
-+	    (cache_ptr)->howto = howto_table + (dst)->r_type;
-+
-+/* For AVR COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
-+   library.  On some other COFF targets STYP_BSS is normally
-+   STYP_NOLOAD.  */
-+#define BSS_NOLOAD_IS_SHARED_LIBRARY
-+
-+/* Compute the addend of a reloc.  If the reloc is to a common symbol,
-+   the object file contains the value of the common symbol.  By the
-+   time this is called, the linker may be using a different symbol
-+   from a different object file with a different value.  Therefore, we
-+   hack wildly to locate the original symbol from this file so that we
-+   can make the correct adjustment.  This macro sets coffsym to the
-+   symbol from the original file, and uses it to set the addend value
-+   correctly.  If this is not a common symbol, the usual addend
-+   calculation is done, except that an additional tweak is needed for
-+   PC relative relocs.
-+   FIXME: This macro refers to symbols and asect; these are from the
-+   calling function, not the macro arguments.  */
-+
-+#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)		\
-+  {								\
-+    coff_symbol_type *coffsym = (coff_symbol_type *) NULL;	\
-+    if (ptr && bfd_asymbol_bfd (ptr) != abfd)			\
-+      coffsym = (obj_symbols (abfd)				\
-+	         + (cache_ptr->sym_ptr_ptr - symbols));		\
-+    else if (ptr)						\
-+      coffsym = coff_symbol_from (abfd, ptr);			\
-+    if (coffsym != (coff_symbol_type *) NULL			\
-+	&& coffsym->native->u.syment.n_scnum == 0)		\
-+      cache_ptr->addend = - coffsym->native->u.syment.n_value;	\
-+    else if (ptr && bfd_asymbol_bfd (ptr) == abfd		\
-+	     && ptr->section != (asection *) NULL)		\
-+      cache_ptr->addend = - (ptr->section->vma + ptr->value);	\
-+    else							\
-+      cache_ptr->addend = 0;					\
-+    if (ptr && howto_table[reloc.r_type].pc_relative)		\
-+      cache_ptr->addend += asect->vma;				\
-+  }
-+
-+/* We use the special COFF backend linker.  */
-+#define coff_relocate_section _bfd_coff_generic_relocate_section
-+
-+static reloc_howto_type *
-+coff_ext_avr_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
-+     bfd *abfd ATTRIBUTE_UNUSED;
-+     asection *sec;
-+     struct internal_reloc *rel;
-+     struct coff_link_hash_entry *h;
-+     struct internal_syment *sym;
-+     bfd_vma *addendp;
-+{
-+
-+  reloc_howto_type *howto;
-+
-+  howto = howto_table + rel->r_type;
-+
-+  if (howto->pc_relative)
-+    *addendp += sec->vma;
-+
-+  if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
-+    {
-+      /* This is a common symbol.  The section contents include the
-+	 size (sym->n_value) as an addend.  The relocate_section
-+	 function will be adding in the final value of the symbol.  We
-+	 need to subtract out the current size in order to get the
-+	 correct result.  */
-+
-+      BFD_ASSERT (h != NULL);
-+
-+      /* I think we *do* want to bypass this.  If we don't, I have seen some data
-+	 parameters get the wrong relcation address.  If I link two versions
-+	 with and without this section bypassed and then do a binary comparison,
-+	 the addresses which are different can be looked up in the map.  The
-+	 case in which this section has been bypassed has addresses which correspond
-+	 to values I can find in the map.  */
-+      *addendp -= sym->n_value;
-+    }
-+
-+  /* If the output symbol is common (in which case this must be a
-+     relocateable link), we need to add in the final size of the
-+     common symbol.  */
-+  if (h != NULL && h->root.type == bfd_link_hash_common)
-+    *addendp += h->root.u.c.size;
-+
-+  return howto;
-+}
-+
-+#define coff_rtype_to_howto coff_ext_avr_rtype_to_howto
-+
-+#ifndef bfd_pe_print_pdata
-+#define bfd_pe_print_pdata	NULL
-+#endif
-+
-+#include "coffcode.h"
-+
-+static const bfd_target *
-+coff_ext_avr_object_p(a)
-+     bfd *a;
-+{
-+  return coff_object_p (a);
-+}
-+
-+const bfd_target
-+#ifdef TARGET_SYM
-+  TARGET_SYM =
-+#else
-+  avrextcoff_vec =
-+#endif
-+{
-+#ifdef TARGET_NAME
-+  TARGET_NAME,
-+#else
-+  "coff-ext-avr",			/* name */
-+#endif
-+  bfd_target_coff_flavour,
-+  BFD_ENDIAN_LITTLE,		/* data byte order is little */
-+  BFD_ENDIAN_LITTLE,		/* header byte order is little */
-+
-+  (HAS_RELOC | EXEC_P |		/* object flags */
-+   HAS_LINENO | HAS_DEBUG |
-+   HAS_SYMS | HAS_LOCALS | WP_TEXT),
-+
-+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
-+  0,				/* leading char */
-+  '/',				/* ar_pad_char */
-+  15,				/* ar_max_namelen */
-+  0,				/* match_priority */
-+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
-+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-+
-+/* Note that we allow an object file to be treated as a core file as well.  */
-+    {_bfd_dummy_target, coff_ext_avr_object_p, /* bfd_check_format */
-+       bfd_generic_archive_p, coff_ext_avr_object_p},
-+    {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
-+       bfd_false},
-+    {bfd_false, coff_write_object_contents, /* bfd_write_contents */
-+       _bfd_write_archive_contents, bfd_false},
-+
-+     BFD_JUMP_TABLE_GENERIC (coff),
-+     BFD_JUMP_TABLE_COPY (coff),
-+     BFD_JUMP_TABLE_CORE (_bfd_nocore),
-+     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
-+     BFD_JUMP_TABLE_SYMBOLS (coff),
-+     BFD_JUMP_TABLE_RELOCS (coff),
-+     BFD_JUMP_TABLE_WRITE (coff),
-+     BFD_JUMP_TABLE_LINK (coff),
-+     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-+
-+  NULL,
-+
-+  COFF_SWAP_TABLE
-+};
-diff -Naurp bfd/coffgen.c bfd/coffgen.c
---- bfd/coffgen.c	2011-08-17 06:09:39.000000000 +0530
-+++ bfd/coffgen.c	2011-11-30 12:54:36.000000000 +0530
-@@ -699,6 +699,20 @@ coff_renumber_symbols (bfd *bfd_ptr, int
- 	      if (last_file != NULL)
- 		last_file->n_value = native_index;
- 	      last_file = &(s->u.syment);
-+	      if (bfd_get_arch (bfd_ptr) == bfd_arch_avr
-+		  && bfd_coff_long_filenames (bfd_ptr)
-+		  && s->u.syment.n_numaux > 0)
-+		{
-+		  /* AVR COFF records long filenames in successive aux
-+		     records.  Adjust the number of aux records
-+		     required here, so the renumbering will account
-+		     for them. */
-+		  unsigned int filnmlen = bfd_coff_filnmlen (bfd_ptr);
-+		  unsigned int namelen = strlen (coff_symbol_ptr->symbol.name);
-+		  unsigned int n = (namelen + filnmlen - 1) / filnmlen;
-+
-+		  s->u.syment.n_numaux = n > NAUXENTS? NAUXENTS: n;
-+		}
- 	    }
- 	  else
- 	    /* Modify the symbol values according to their section and
-@@ -827,6 +841,20 @@ coff_fix_symbol_name (bfd *abfd,
- 	{
- 	  if (name_length <= filnmlen)
- 	    strncpy (auxent->x_file.x_fname, name, filnmlen);
-+	  else if (bfd_get_arch (abfd) == bfd_arch_avr)
-+	    {
-+	      /* AVR COFF records long filenames in successive aux records. */
-+	      int i = 1;
-+	      while (name_length > filnmlen && i < NAUXENTS)
-+		{
-+		  strncpy (auxent->x_file.x_fname, name, filnmlen);
-+		  name += filnmlen;
-+		  name_length -= filnmlen;
-+		  i++;
-+		  auxent = &(native + i)->u.auxent;
-+		}
-+	      strncpy (auxent->x_file.x_fname, name, filnmlen);
-+	    }
- 	  else
- 	    {
- 	      auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
-@@ -1277,6 +1305,10 @@ coff_write_symbols (bfd *abfd)
- 		  if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
- 		    return FALSE;
- 		}
-+	      if (bfd_get_arch (abfd) == bfd_arch_avr)
-+		/* AVR COFF handles long file names in aux records. */
-+		maxlen = name_length;
-+	      else
- 	      maxlen = bfd_coff_filnmlen (abfd);
- 	    }
- 	  else
-@@ -1715,14 +1747,27 @@ coff_get_normalized_symtab (bfd *abfd)
- 	    {
- 	      /* Ordinary short filename, put into memory anyway.  The
-                  Microsoft PE tools sometimes store a filename in
--                 multiple AUX entries.  */
-+                 multiple AUX entries.
-+		 AVR COFF does it that way, too. */
- 	      if (internal_ptr->u.syment.n_numaux > 1
--		  && coff_data (abfd)->pe)
--		internal_ptr->u.syment._n._n_n._n_offset =
--		  ((bfd_hostptr_t)
--		   copy_name (abfd,
--			      (internal_ptr + 1)->u.auxent.x_file.x_fname,
--			      internal_ptr->u.syment.n_numaux * symesz));
-+		  && (coff_data (abfd)->pe
-+		      || (bfd_get_arch (abfd) == bfd_arch_avr)))
-+		{
-+		  char *b;
-+		  unsigned int i;
-+
-+		  /* We allocate enough storage to fit the contents of
-+		     this many aux records, and simply append a \0.
-+		     This ensures the string will always be
-+		     terminated, even in the case where it just fit
-+		     into the aux records. */
-+		  b = (char *) bfd_alloc (abfd,
-+					  internal_ptr->u.syment.n_numaux * FILNMLEN + 1);
-+		  internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) b;
-+		  b[internal_ptr->u.syment.n_numaux * FILNMLEN] = '\0';
-+		  for (i = 0; i < internal_ptr->u.syment.n_numaux; i++, b += FILNMLEN)
-+		    memcpy (b, (internal_ptr + i + 1)->u.auxent.x_file.x_fname, FILNMLEN);
-+		}
- 	      else
- 		internal_ptr->u.syment._n._n_n._n_offset =
- 		  ((bfd_hostptr_t)
-@@ -1828,9 +1873,9 @@ coff_bfd_make_debug_symbol (bfd *abfd,
- 
-   if (new_symbol == NULL)
-     return NULL;
--  /* @@ The 10 is a guess at a plausible maximum number of aux entries
-+  /* @@ The NAUXENTS is a guess at a plausible maximum number of aux entries
-      (but shouldn't be a constant).  */
--  amt = sizeof (combined_entry_type) * 10;
-+  amt = sizeof (combined_entry_type) * (NAUXENTS + 1);
-   new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
-   if (!new_symbol->native)
-     return NULL;
-diff -Naurp bfd/coffswap.h bfd/coffswap.h
---- bfd/coffswap.h	2009-09-05 13:26:22.000000000 +0530
-+++ bfd/coffswap.h	2011-11-30 12:54:36.000000000 +0530
-@@ -383,7 +383,11 @@ coff_swap_aux_in (bfd *abfd,
- 		  void * ext1,
- 		  int type,
- 		  int in_class,
--		  int indx,
-+		  int indx
-+#if defined(AVR) && __GNUC__
-+                __attribute__((unused))
-+#endif
-+		  ,
- 		  int numaux,
- 		  void * in1)
- {
-@@ -409,9 +413,13 @@ coff_swap_aux_in (bfd *abfd,
- #else
- 	  if (numaux > 1)
- 	    {
-+#if defined(AVR)
-+	      memcpy (in->x_file.x_fname, ext->x_file.x_fname, sizeof (AUXENT));
-+#else
- 	      if (indx == 0)
- 		memcpy (in->x_file.x_fname, ext->x_file.x_fname,
- 			numaux * sizeof (AUXENT));
-+#endif
- 	    }
- 	  else
- 	    memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
-diff -Naurp bfd/config.bfd bfd/config.bfd
---- bfd/config.bfd	2011-07-29 04:05:13.000000000 +0530
-+++ bfd/config.bfd	2011-11-30 12:54:36.000000000 +0530
-@@ -300,6 +300,7 @@ case "${targ}" in
- 
-   avr-*-*)
-     targ_defvec=bfd_elf32_avr_vec
-+    targ_selvecs="bfd_elf32_avr_vec avrcoff_vec avrextcoff_vec"
-     ;;
- 
-   bfin-*-*)
-diff -Naurp bfd/configure bfd/configure
---- bfd/configure	2011-11-21 17:25:48.000000000 +0530
-+++ bfd/configure	2011-11-30 12:54:36.000000000 +0530
-@@ -15175,6 +15175,8 @@ do
-     armpe_little_vec)		tb="$tb pe-arm.lo peigen.lo cofflink.lo " ;;
-     armpei_big_vec)		tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;;
-     armpei_little_vec)		tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;;
-+    avrcoff_vec)		tb="$tb coff-avr.lo cofflink.lo " ;;
-+    avrextcoff_vec)		tb="$tb coff-ext-avr.lo cofflink.lo " ;;
-     b_out_vec_big_host)		tb="$tb bout.lo aout32.lo" ;;
-     b_out_vec_little_host)	tb="$tb bout.lo aout32.lo" ;;
-     bfd_pei_ia64_vec)		tb="$tb pei-ia64.lo pepigen.lo cofflink.lo"; target_size=64 ;;
-diff -Naurp bfd/configure.in bfd/configure.in
---- bfd/configure.in	2011-11-21 17:25:46.000000000 +0530
-+++ bfd/configure.in	2011-11-30 12:54:36.000000000 +0530
-@@ -674,6 +674,8 @@ do
-     armpe_little_vec)		tb="$tb pe-arm.lo peigen.lo cofflink.lo " ;;
-     armpei_big_vec)		tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;;
-     armpei_little_vec)		tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;;
-+    avrcoff_vec)		tb="$tb coff-avr.lo cofflink.lo " ;;
-+    avrextcoff_vec)		tb="$tb coff-ext-avr.lo cofflink.lo " ;;
-     b_out_vec_big_host)		tb="$tb bout.lo aout32.lo" ;;
-     b_out_vec_little_host)	tb="$tb bout.lo aout32.lo" ;;
-     bfd_pei_ia64_vec)		tb="$tb pei-ia64.lo pepigen.lo cofflink.lo"; target_size=64 ;;
-diff -Naurp bfd/Makefile.am bfd/Makefile.am
---- bfd/Makefile.am	2011-11-21 17:25:46.000000000 +0530
-+++ bfd/Makefile.am	2011-11-30 12:54:36.000000000 +0530
-@@ -238,6 +238,8 @@ BFD32_BACKENDS = \
- 	coff-apollo.lo \
- 	coff-arm.lo \
- 	coff-aux.lo \
-+        coff-avr.lo \
-+        coff-ext-avr.lo \
- 	coff-go32.lo \
- 	coff-h8300.lo \
- 	coff-h8500.lo \
-@@ -422,6 +424,8 @@ BFD32_BACKENDS_CFILES = \
- 	coff-apollo.c \
- 	coff-arm.c \
- 	coff-aux.c \
-+	coff-avr.c \
-+	coff-ext-avr.c \
- 	coff-go32.c \
- 	coff-h8300.c \
- 	coff-h8500.c \
-diff -Naurp bfd/Makefile.in bfd/Makefile.in
---- bfd/Makefile.in	2011-11-21 17:25:49.000000000 +0530
-+++ bfd/Makefile.in	2011-11-30 12:54:36.000000000 +0530
-@@ -538,6 +538,8 @@ BFD32_BACKENDS = \
- 	coff-apollo.lo \
- 	coff-arm.lo \
- 	coff-aux.lo \
-+	coff-avr.lo \
-+        coff-ext-avr.lo \
- 	coff-go32.lo \
- 	coff-h8300.lo \
- 	coff-h8500.lo \
-@@ -722,6 +724,8 @@ BFD32_BACKENDS_CFILES = \
- 	coff-apollo.c \
- 	coff-arm.c \
- 	coff-aux.c \
-+	coff-avr.c \
-+	coff-ext-avr.c \
- 	coff-go32.c \
- 	coff-h8300.c \
- 	coff-h8500.c \
-diff -Naurp bfd/targets.c bfd/targets.c
---- bfd/targets.c	2011-08-17 06:09:38.000000000 +0530
-+++ bfd/targets.c	2011-11-30 12:54:36.000000000 +0530
-@@ -587,6 +587,8 @@ extern const bfd_target armpe_big_vec;
- extern const bfd_target armpe_little_vec;
- extern const bfd_target armpei_big_vec;
- extern const bfd_target armpei_little_vec;
-+extern const bfd_target avrcoff_vec;
-+extern const bfd_target avrextcoff_vec;
- extern const bfd_target b_out_vec_big_host;
- extern const bfd_target b_out_vec_little_host;
- extern const bfd_target bfd_pei_ia64_vec;
-@@ -941,6 +943,8 @@ static const bfd_target * const _bfd_tar
- 	&armpe_little_vec,
- 	&armpei_big_vec,
- 	&armpei_little_vec,
-+	&avrcoff_vec,
-+	&avrextcoff_vec,
- 	&b_out_vec_big_host,
- 	&b_out_vec_little_host,
- #ifdef BFD64
-diff -Naurp binutils/bucomm.c binutils/bucomm.c
---- binutils/bucomm.c	2011-03-25 23:21:10.000000000 +0530
-+++ binutils/bucomm.c	2011-11-30 12:54:36.000000000 +0530
-@@ -561,6 +561,32 @@ parse_vma (const char *s, const char *ar
-   return ret;
- }
- 
-+/* Return the basename of "file", i. e. everything minus whatever
-+   directory part has been provided.  Stolen from bfd/archive.c.
-+   Should we also handle the VMS case (as in bfd/archive.c)?  */
-+const char *
-+bu_basename (file)
-+     const char *file;
-+{
-+  const char *filename = strrchr (file, '/');
-+
-+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
-+  {
-+    /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
-+    char *bslash = strrchr (file, '\\');
-+    if (filename == NULL || (bslash != NULL && bslash > filename))
-+      filename = bslash;
-+    if (filename == NULL && file[0] != '\0' && file[1] == ':')
-+      filename = file + 1;
-+  }
-+#endif
-+  if (filename != (char *) NULL)
-+    filename++;
-+  else
-+    filename = file;
-+  return filename;
-+}
-+
- /* Returns the size of the named file.  If the file does not
-    exist, or if it is not a real file, then a suitable non-fatal
-    error message is printed and (off_t) -1 is returned.  */
-diff -Naurp binutils/bucomm.h binutils/bucomm.h
---- binutils/bucomm.h	2009-09-02 12:52:31.000000000 +0530
-+++ binutils/bucomm.h	2011-11-30 12:54:36.000000000 +0530
-@@ -58,6 +58,8 @@ bfd_vma parse_vma (const char *, const c
- 
- off_t get_file_size (const char *);
- 
-+const char *bu_basename PARAMS ((const char *));
-+
- extern char *program_name;
- 
- /* filemode.c */
-diff -Naurp binutils/budbg.h binutils/budbg.h
---- binutils/budbg.h	2009-09-02 12:52:31.000000000 +0530
-+++ binutils/budbg.h	2011-11-30 12:54:36.000000000 +0530
-@@ -52,8 +52,11 @@ extern bfd_boolean parse_ieee (void *, b
<Skipped 8013 lines>
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/crossavr-binutils.git/commitdiff/31ce1ededf3dde4114f4c5b265202cfeffd1c87f



More information about the pld-cvs-commit mailing list