# Assembler floating-point format

The assembler now defaults to VFP format for floating-point numbers. It previously defaulted to the legacy FPA format if no `-mcpu` or `-march` option was specified, or if a CPU with no floating-point unit was specified. This bug resulted in incorrect behavior of the `.double` and `.dcb.d` directives.

# New option for automatically generating IT blocks

The assembler now allows use of conditional Thumb-2 instructions without requiring explicit IT instructions. Use the `-mauto-it` command-line option to enable this automatic generation of IT instructions.

# Linker crash with very large applications

A linker bug that caused a crash when linking very large applications with the `--fix-cortex-a8` command-line option has been fixed.

# `tlbilx` encoding fix

An assembler bug that resulted in an incorrect encoding of the `tlbilx` instruction and its extended mnemonics `tlbilxlpidtlbilxpid`, and `tlbilxva` has been fixed.

# Maximum code alignment increased

The maximum allowed code alignment has been increased from 32 to 64 bytes. This change affects the `.p2align` and `.align` directives in GAS and the `-falign-functions` GCC option.

# Linker script search path

The bug in the linker has been fixed that caused it not to follow its documented behavior for searching for linker scripts named with the `-T` option. Now scripts are looked up first in the current directory, then in library directories specified with `-L` command-line options, and finally in the default system linker script directory.

# `&csl_target;-objcopy` bug fix

A bug has been fixed that caused `&csl_target;-objcopy` to issue an error when generating output in the Intel HEX format and using `--change-section-lma` to change section addresses.

# Cortex-A8 erratum workaround enabled for ARMv7-A

The workaround for the erratum in Cortex-A8 processors mentioned below is now enabled by default if you are targeting the ARMv7-A architecture profile. The workaround can be disabled by passing the `--no-fix-cortex-a8` option to the linker.

# Linker script load address processing

A bug in the linker has been fixed affecting linker scripts using `AT>region` to set the load address. This now follows the documented behavior of maintaining the virtual address to load address difference in output section statements. Refer to the "Output Section LMA" section of the linker manual for details of how to control the load address.

# Stack backtracing and C++ exception handling

Improvements have been made to the linker in support of C++ runtime exception handling and stack backtracing. A problem that caused crashes during the backtrace of C routines that were not compiled with the `-fexceptions` option has been fixed. In addition, the linker generates more compact stack unwinding tables which can lead to smaller executables.

# Disassembler bug fix

A bug has been fixed that caused incorrect disassembly of some object files with multiple sections whose symbol tables included symbols in the middle of functions. These typically resulted from hand-written assembly.

# ARM EABI attributes

An assembler bug that resulted in some object files generated from hand-written assembly being incorrectly tagged as using VFP instructions has been fixed. This tagging was harmless for objects linked with &csl_sgxx; tools and libraries, but may have affected third-party tools and libraries.

# Erratum workaround for Cortex-A8 processors

The linker now implements a workaround for an erratum in Cortex-A8 processors. If you are targeting an affected part and wish to use the workaround, pass the `--fix-cortex-a8` option to the linker. Please contact ARM for further details of the erratum.

# Assembler diagnostics for invalid instructions

The assembler now issues diagnostics for invalid `ADR` and `ADRL` instructions. Formerly, these invalid instructions were silently mis-assembled. This assembler bug did not affect correct code.

# Incorrect linker-generated functions

A bug that caused some linker-generated functions (such as stubs to support interworking from ARM mode to Thumb mode) to contain only `nop` instructions instead of correct code sequences has been fixed.

# Extraneous linker error messages

A linker bug that caused extraneous error messages of the form `Dwarf Error: Offset (507) greater than or equal to .debug_str size (421).` has been corrected. This bug did not affect the correctness of output binaries.

# `&csl_target;-objdump` bug fix

A bug has been fixed that caused `&csl_target;-objdump` to enter an infinite loop.

# Assembler marking of data

Data generated using the assembler directives `.ascii`, `.asciz`, `.dc.d`, `.dc.s`, `.dc.x`, `.dcb`, `.dcb.b`, `.dcb.d`, `.dcb.l`, `.dcb.s`, `.dcb.w`, `.dcb.x`, `.ds`, `.ds.b`, `.ds.d`, `.ds.l`, `.ds.p`, `.ds.s`, `.ds.w`, `.ds.x`, `.double`, `.fill`, `.float`, `.incbin`, `.single`, `.space`, `.skip`, `.string`, `.string8`, `.string16`, `.string32`, `.string64`, and `.zero` is now correctly marked by the assembler as data rather than code. This fixes incorrect byte-swapping of such data when linking for BE8 configurations.

# `DMB`, `DSB`, and `ISB` instructions on ARMv6-M

The assembler now accepts the `DMB`, `DSB`, and `ISB` instructions on ARMv6-M CPUs, including Cortex-M0 and Cortex-M1. These instructions were incorrectly rejected on these CPUs in previous releases.

# `CMP` Thumb-2 instruction

The assembler no longer issues an error about `CMP` instructions in which the second argument is the stack pointer (`r13`), as these are valid instructions. However, use of the stack pointer in this context is deprecated in the current ARM architecture specification and the assembler now warns about the deprecated use.

# Improved NOP generation for Thumb-2 cores

The assembler now generates Thumb-2/ARMv6K architectural NOP instructions when alignment padding is required in code sections.

# New assembler option: `-mfix-24k`

The assembler now accepts the `-mfix-24k` command-line option. The use of this option causes the assembler to work around hardware errata in the `eret` and `deret` instructions on 24K and 24KE cores.

# `&csl_target;-objcopy` and `&csl_target;-strip` bug fix

A bug has been fixed that caused `&csl_target;-objcopy` and `&csl_target;-strip` to corrupt prelinked binaries.

# Binutils update

The binutils package has been updated to version 2.19.51.20090205 from the FSF trunk. This update includes numerous bug fixes.

# ARM build attributes conformance improvements

Several ARM EABI 2.07 conformance issues relating to the handling of build attributes in the assembler and linker have been fixed. All build attribute types are now recognized, and can now be declared by name, in addition to by number. Support for merging attributes in the linker has been improved, and the linking of incompatible objects is now detected and rejected in more cases.

# Linker errors on non-ELF input

A bug has been fixed that caused internal errors from the linker when linking non-ELF input files (with the `-b` or `--format` linker options).

# Linker crash on incompatible input files

Some third-party compilers, including ARM RealView 4.0, produce a build attribute marking output files that are not compatible with the ABI for the ARM Architecture. This attribute sometimes caused the linker to crash. The linker now correctly issues an error message.

# Undefined weak references in shared libraries

A linker bug has been fixed affecting calls from Thumb code in shared libraries to functions that are undefined weak references when the shared library is linked. Such calls executed as nops whether or not the functions were defined at run time. This affected thread-related code in the Thumb-2 versions of the standard C++ library provided with &csl_sgxx;, causing some multithreaded C++ programs to crash.

# Bug fix for assembly listing

A bug that caused the assembler to produce corrupted listings (via the `-a` option) on Windows hosts has been fixed.

# Mixed-case NEON register aliases

An assembler bug that prevented NEON register aliases from being created with mixed-case names using the `.dn` and `.qn` directives has been fixed. Previously only aliases created with all-lowercase or all-uppercase names worked correctly.

# Bug fix for objcopy/strip

An objcopy bug that corrupted COMDAT groups when creating new binaries has been fixed. This bug also affected `strip -g`.

# Thumb-2 assembler fixes

The Thumb-2 encodings of `QADD`, `QDADD`, `QSUB`, and `QDSUB` have been corrected. Previous versions of the assembler generated incorrect object files for these instructions. The assembler now accepts the `ORN`, `QASX`, `QSAX`, `RRX`, `SHASX`, `SHSAX`, `SSAX`, `USAX`, `UHASX`, `UQSAX`, and `USAX` mnemonics. The assembler now detects and issues errors for invalid uses of register 13 (the stack pointer) and register 15 (the program counter) in many instructions.

# Binutils support for DWARF Version 3

The `addr2line` command now supports binaries containing DWARF 3 debugging information. The `ld` command can display error messages with source locations for input files containing DWARF 3 debugging information.

# Bug fix for objdump on Windows

An objdump bug that caused the `-S` option not to work on Windows in some cases has been fixed.

# Unnecessary section removed

A linker bug that caused an unnecessary `.rel.dyn` section to be placed in the executable has been fixed.

# Linker bug fix for `--gc-sections`

A linker bug that caused certain linker-generated sections to be incorrectly omitted from the executable when the `--gc-sections` option is used has been fixed.

# Linker bug affecting Library Reduction Utility

A linker bug has been fixed that caused the `&csl_target;-mklibs` Library Reduction Utility to produce invalid output when relinking `libc.so`. The bug could also affect linking of other shared libraries containing weak undefined symbols with non-default visibility.

# "Can't find matching LO16" linker error fixed

An assembler bug that caused errors when linking files containing mixed MIPS16 and non-MIPS16 code has been fixed.

# Thumb-2 `MUL` encoding

In Thumb-2 mode, the assembler now encodes `MUL` as a 16-bit instruction (rather than as a 32-bit instruction) when possible. This fix results in smaller code, with no loss of performance.

# Thumb-2 `RBIT` encoding

An assembler bug that resulted in incorrect encoding of the Thumb-2 `RBIT` instruction has been fixed.

# Uppercase operands to IT instructions

The assembler now accepts both uppercase and lowercase operands for the `IT` family of instructions.

# ARMv7 offset out of range errors

An assembler bug that resulted in `offset out of range` errors when compiling for ARMv7 processors has been fixed.

# Symbian binary relocation

The linker now correctly generates relocations for writable data as data-relative rather than text-relative. The former behavior caused runtime failures accessing writable data.

# Placing bss-like regions in load regions

The linker no longer issues an incorrect error message when a bss-like section is placed at specific load region. The linker formerly incorrectly considered the section as taking up space in the load region.

# NEON assembler symbols

An assembler bug that caused spurious undefined symbols to be generated has been fixed. The `mov d0, d1` instruction would incorrectly cause an undefined symbol `d1` to be created.

# MIPS local GOT space

A linker bug that caused the error "not enough GOT space for local GOT entries" has been fixed.

# Binutils update

The binutils package has been updated to version 2.18.50.20080215 from the FSF trunk. This update includes numerous bug fixes.

# ColdFire multi-GOT support

On ColdFire GNU/Linux targets, the linker now supports generation of multiple GOTs. This change avoids certain "relocation truncated to fit" linker errors, which sometimes resulted when linking large PIC object files such as shared libraries. For additional information, refer to the `--got=type` option in the linker documentation.

# Disassembler bug fix

A bug in the disassembler has been fixed that formerly caused `objdump` to crash when processing raw binary files, or other executables with an empty symbol table.

# MOVW and MOVT relocations

A linker error that resulted in incorrect offsets when processing relocations on `MOVW` and `MOVT` instructions referencing mergeable string sections has been fixed.

# New Octeon instructions

The assembler now supports the Cavium Octeon instructions `saa` and `saad`.

# Linker error allocating ELF segments

A bug where the linker produces an incorrect error message with segments at the top of the address space has been fixed.

# Invalid object file after strip

A bug in the assembler has been fixed that formerly caused `.set symbol expression` constructs to emit symbol in the wrong section. This in turn caused inconsistent behavior after stripping the symbol table.

# Linker crash on invalid input files

Some older versions of GCC generated object files with invalid mergeable string sections when compiling with `-fmerge-all-constants`. This bug was fixed in &csl_sgxx; as of version 4.1-43. However, since system libraries included with some GNU/Linux distributions were affected by this bug, the linker has now been changed to accept object files with such invalid sections, rather than crash or produce an error message.

# Overlapping operands for long multiply instructions

An incorrect assembler warning has been removed in the case of overlapping source and destination operands for `UMULL`, `SMULL`, `UMLAL` and `SMLAL` instructions on ARMv6 processors.

# `&csl_target;-objcopy` and `&csl_target;-strip` on prelinked binaries

A bug causing errors from `&csl_target;-objcopy` and `&csl_target;-strip` on prelinked binaries has been fixed.

# Disassembly of `%sr` and `%ccr` move instructions

Disassembly now correctly handles instructions that move a constant to the `%sr` or `%ccr` registers.

# Windows resource compiler

Several problems related to reading and processing `.rc` or `.res` files with `windres` have been fixed.

# Linker errors for large programs

A bug causing linker errors for some programs using many dynamic symbols has been fixed.

# Incorrect `jalr` operands

The assembler now reports an error if identical source and destination registers are specified for the `jalr` instruction.

# Support for large alignment values

The assembler `.align` directive and GCC `aligned` attribute both now accept alignments up to 2^28 bytes.

# Linker errors for large programs

A bug causing linker errors for some programs with hundreds of megabytes of statically-allocated data has been fixed.

# ColdFire 51QE processor support

&csl_sgxx; now supports Freescale ColdFire 51QE processor. You can specify the `-mcpu=51qe` option to GCC and GAS to generate code for this processor.

# Loongson-2E and Loongson-2F processor support

The binutils package now supports the ST Microelectronics Loongson-2E processor and has preliminary support for the Loongson-2F. To assemble for these processors, invoke the assembler with `-march=loongson2e` or `-march=loongson2f` as appropriate.

# Binutils update

The binutils package has been updated to the 2007-08-19 version of the pre-2.18 FSF trunk. This contains many new improvements and bug fixes. For more information, refer to the manuals for the individual utilities, and to the binutils web site at `http://www.gnu.org/software/binutils/`.

# Improved diagnostics for region overflow

The linker will now give more helpful diagnostics when the object files being linked are too big for one of the memory regions defined in the linker script.

# ABI markings for MIPS binaries

GCC and Binutils now mark MIPS binaries according to their floating point calling convention. The linker reads this information and warns when mismatched object files are linked together. For example, the linker warns if `-msoft-float` objects are linked to a `-mhard-float` C library. GDB uses the same information to correctly call functions from the command line and display return values after `finish`.

# C++ exception handling with relocatable links

A defect in relocatable linking (`&csl_target;-ld -r`) of C++ programs using exception handling has been fixed. Such programs formerly appeared to link correctly, but handlers established by `try`/`catch` blocks failed to execute.

# `movec` instruction

The assembler now accepts `%mbo` for Memory Base Offset register in the `movec` instruction. `%mbb` continues to be accepted as a synonym of `%mbo` for backward compatibility.

# Calls to undefined weak symbols

The linker now implements semantics that comply to the ARM EABI for `R_ARM_CALL` and `T_ARM_THM_CALL` relocations against undefined weak symbols. These now result in a jump to the next instruction.

# NEON coprocessor system registers

The assembler now accepts the `MVFR0` and `MVFR1` coprocessor registers in `fmrx` and `fmxr` instructions.

# EABI object attribute merging

The linker now properly merges EABI object attributes into its output file.

# Thumb-2 shift instruction aliases

The assembler now accepts `mov` with shifted operands as an alias for Thumb-2 shift instructions. For example `mov r0, r1, lsl r2` is encoded as `lsl r0, r1, r2`.

# Coprocessor instructions

Support has been added for ColdFire coprocessor instructions.

# Thumb-2 doubleword writeback addressing modes

An assembler bug that caused writeback addressing modes for `ldrd` and `strd` to be incorrectly encoded has been fixed.

# Assembler skipping `\` characters

A bug is fixed where the assembler would skip `\` characters when they appeared at certain positions in the input file. This bug primarily affected assembler macros.

# Thumb-2 exception return instructions

An assembler bug that caused `subs pc, lr, #const` and `movs pc, lr` to be incorrectly encoded has been fixed.

# MIPS `.set` directives

The assembler now accepts `.set symbol,value` directives in addition to MIPS-specific uses of `.set`.

# Thumb-2 branches to shared libraries

The linker can now generate PLT stubs for `R_ARM_THM_JUMP24` and `R_ARM_THM_JUMP19` relocations. This occurs when Thumb-2 branch instructions refer to symbols imported from shared libraries.

# Uppercase special register names

The assembler now accepts both uppercase and lowercase special register names when assembling `msr` and `mrs` instructions for the Microcontroller profile of the ARM Architecture.

# ColdFire `wdebug.l` instructions

The assembler now correctly recognizes `wdebug.l` mnemonics. Previously only `wdebug` variants were allowed.

# ARM EABI compliance

Objects produced by &csl_sgxx; are now marked as ARM ELF version 5 rather than ARM ELF version 4. This reflects compliance with recent revisions of the ARM EABI. &csl_sgxx; still accepts objects marked with version 4.

# Conditional Thumb-2 branch instructions

A linker bug that could cause objects involving conditional Thumb-2 branch instructions to be incorrectly rejected has been fixed.

# Linking of non-ELF images

A linker bug that could cause a crash when linking non-ELF objects for ARM targets has been fixed.

# Improved assembler diagnostics for 8-bit offsets

The assembler now correctly diagnoses out-of-range offsets to instructions such as `LDRD` as 8-bit rather than half-word offsets.

# The `\@` assembler pseudo-variable

A bug in the assembler that caused uses of the `\@` pseudo-variable to be mis-parsed as comments has been fixed.

# Binutils update

The binutils package has been updated from version 2.17 to the pre-2.18 FSF trunk. This is a significant update with many improvements and bug fixes.

Changes to the assembler (`as`) include:

- On MIPS targets, support for additional processors and the SmartMIPS and DSP Release 2 extensions has been added.

New linker (`ld`) features include:

- A new command-line option `--default-script` has been added to give more precise control over linker script processing.
- There are new command-line options `-Bsymbolic-functions`, `--dynamic-list`, `--dynamic-list-cpp-new`, and `--dynamic-list-data` to control symbols that should be dynamically linked.
- The new `--print-gc-sections` option lists sections removed by garbage collection.

Other changes include:

- The `objcopy` utility has a new `--extract-symbol` option to extract only symbol table information from the input file.
- The `gprof` utility now allows input files to have histogram records for several memory ranges, provided those ranges are disjoint.

For more information, refer to the manuals for the individual utilities, and the binutils web site at `http://www.gnu.org/software/binutils/`.