6.10 ld and the Altera Nios II

Call and immediate jump instructions on Nios II processors are limited to transferring control to addresses in the same 256MB memory segment, which may result in ld giving ‘relocation truncated to fit’ errors with very large programs. The command-line option --relax enables the generation of trampolines that can access the entire 32-bit address space for calls outside the normal call and jmpi address range. These trampolines are inserted at section boundaries, so may not themselves be reachable if an input section and its associated call trampolines are larger than 256MB.

The --relax option is enabled by default unless -r is also specified. You can disable trampoline generation by using the --no-relax linker option. You can also disable this optimization locally by using the ‘set .noat’ directive in assembly-language source files, as the linker-inserted trampolines use the at register as a temporary.

Note that the linker --relax option is independent of assembler relaxation options, and that using the GNU assembler’s -relax-all option interferes with the linker’s more selective call instruction relaxation.