2.6.4.1.2 Operation
ADR generates an address by adding an immediate value to the PC, and writes the result to the destination register.
ADR provides the means by which position-independent code can be generated, because the address is PC-relative.
If you use ADR to generate a target address for a BX or BLX instruction, you must ensure that bit[0] of the address you generate is set to 1 for correct execution.
Values of label must be within the range of -4095 to +4095 from the address in the PC.
Note: You may have to use the .W suffix to get the maximum offset range or to generate addresses that are not word-aligned. See 2.6.3.8 Instruction Width Selection.