The optimizing linkage editor is used for optimization, which involves replacing existing code with code that takes up less space in relation to the address where each symbol referred to by the original instruction is located. To reduce the size of the code as much as possible, the linkage editor will attempt to replace numerous instructions.
Replacing instructions may, however, change the addresses where individual symbols are located and thus prevent reference to symbols by the optimized code. In such cases, the optimizing linkage editor reports an E0562330 error and stops operations so that code having this problem will not be output.
Due to the characteristics of the RX architecture, this error may arise when any symbol (e.g. a variable, constant, or switch table) located at FFFF8000h or a higher address prior to optimization is allocated to an address below FFFF8000h after optimization.
Examples of conditions leading to E0562330 errors are given below.
In a program where the reading of constants CONST1 and CONST2 is intended, section P is followed by section C, which is allocated to address FFFF8000h prior to optimization.
; 6-byte instruction MOV.L #_CONST1:32, R1
MOV.L #0FFFF8002H, R1
; 6-byte instruction MOV.L #_CONST2:32, R2
MOV.L #0FFFF8006H, R2
_CONST0: ; Allocated to address FFFF8000h
.byte 00H,01H
_CONST1: ; Allocated to address FFFF8002h
.byte "123"
.byte 00H
_CONST2: ; Allocated to address FFFF8006h
.byte "abc"
.byte 00H
Since optimization changes the address of section C from FFFF8000H (a 32-bit immediate value) to -8000H (a signed 16-bit immediate value), the 32-bit immediate-value transfer MOV.L instruction will be replaced by a 16-bit immediate-value transfer instruction.
This reduces the size of section P and leads to its allocation to a lower address than section C.
; 4-byte instruction MOV.L #_CONST1:16, R1
MOV.L #-8002H, R1 ; Exceeds the range of signed 16-bit values
; 4-byte instruction MOV.L #_CONST2:16, R2
MOV.L #-7FFEH, R2
_CONST0: ; Allocated to address FFFF7FFCh
.byte 00H,01H
_CONST1: ; Allocated to address FFFF7FFEh
.byte "123"
.byte 00H
_CONST2: ; Allocated to address FFFF8002h
.byte "abc"
.byte 00H
Due to optimization of multiple MOV.L instructions, constant CONST1 is allocated to an address beyond the range of signed 16-bit values, leading to an E0562330 error as shown below.
E0562330:Relocation size overflow : "fileA.obj"-"P"-"0000002"
You can identify the cause of the error in the following way.
First, specify the optimizing linkage editor options nooptimize and list and build the user program to generate a link map file. Since the information on the allocation of sections begins from the line "*** Mapping List ***" in the link map file, check sections allocated to FFFF8000h and higher addresses.
*** Mapping List ***
C
ffff7ffc ffff8005 a 1
After that, specify the assembler option listfile and build the user program to generate a source listing file. Find the section (P in example 3) in the source listing file for the object file ("fileA.obj" in example 3) indicated by the error message.
The offset value indicated by the error message is the value after optimization.
In the source listing file, locate the instructions that are at or above the offset address (0000002 in example 3) and references to any symbols within sections allocated to the address FFFF8000h or a higher address.
In example 5, you can see that the MOV.L instruction that attempts access to constant CONST1 in section C at an address above FFFF8000h is the reason for the error.
.section P, CODE
00000000 FB1Arrrr MOV.L #_CONST1:16, R1 <- Access to section C
00000004 FB2Arrrr MOV.L #_CONST2:16, R2
.section C, ROMDATA
00000000 _CONST0:
00000000 0001 .byte 00H,01H
00000002 _CONST1:
00000002 313233 .byte "123"
00000005 00 .byte 00H
00000006 _CONST2:
00000006 616263 .byte "abc"
00000009 00 .byte 00H
Select one of the following countermeasures.
If the first address of a section allocated to address FFFF8000h or above before optimization is shifted to an address below FFFF8000h after optimization, use the start option to change the place of that section in the order of sections.
-start=P,C,L,D/FFFF7000
After (switching sections C and L):
-start=P,L,C,D/FFFF7000
If an E0562330 error is still output even after the order of sections is switched, change the order again until the error is no longer output.
If the first address of a section allocated to address FFFF8000h or above before optimization is shifted to an address below FFFF8000h after optimization, use the start option to allocate that section to address FFFF8000h.
-start=P,C,L,D/FFFF7000
-start=P/FFFF7000,C,L,D/FFFF8000
Use the -nooptimize option to completely disable optimization or select the desired sub-options for the -optimize option to prevent the output of the E0562330 error while watching the reduction of the size of code by optimization.