Using movw and movt to load a label address into a register in Arm 32 architecture. but this is not position independent code.
movw r1, #:lower16:ASM_NAME(forkx)movt r1, #:upper16:ASM_NAME(forkx)
As per the manual also it specifies that it will be resolved at the link time.
Need a position independent code, so as per the manual adr, adrl can be used, but getting below error:
../asm-arm/unix_arm.S:115:1: error: unsupported relocation on symboladr r1, __be_forkx
../asm-arm/unix_arm.S:60:1: error: invalid instruction, did you mean: adr?adrl r1, __be_forkx
it seems label can not be used in the aarch32, it is fine in aarch64 and works as intendent.
is the usage of adr command is improper? Is there a way to achieve this in aarch32? is there any equivalent command that can be used?
DeepakHegde said:dist_forkx: .word forkx-load_addr hoe above 2 line able to map to external forkx at run time?
dist_forkx: .word forkx-load_addr
hoe above 2 line able to map to external forkx at run time?
They don't need to, because the need for directly knowing/mapping/fixing/reading the absolute address of forkx at runtime was removed. That's the basic concept of PIC - take advantage of the fact that relative distances between certain sections/symbols do not change once the binary is built.
The general concept isn't also new. You can understand it, for e.g., if you look at the code generated when you call a function within the same binary. When bl calls into a function within the same binary, the assembler/linker performs such distance calculations, and emits appropriate PC-relative branches, insofar as allowed by the ISA and the ABI.
Got it.. Thanks a lot surati.