This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

instruction equivalent to movw,movt with position independent and PC relocatable.

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 symbol
adr 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?

Parents
  • You mentioned linked article specifies the way to calculate the valid address, is there a link that i can read and get the offset?

    The possible valid offsets accepted by the A32-adr instruction, is given here: "... an have any value that can be produced by rotating an 8-bit value right by any even number of bits within a 32-bit word".


    Was the adr instruction originally an "ldr r1, =__be_forkx" instruction?

    Since the modification succeeds with A64-adrp instruction, you may want to confirm that the failure of A32-adr instruction is actually because of the range limitation.

    A32-adrl is supported, at least by GNU as. The invalid-instruction error, upon encountering adrl, points towards the assembler. One can write a small testcase to see if the assembler recognizes adrl. If not, since adr/l are, beneath the surface, add/sub instructions, they can be hand-coded using add/sub, although I did read somewhere that such a practice is discouraged.


    Assuming that a relocatable, bare-metal binary is being built, would it not be simpler to build it as a shared object? Such a build should emit appropriate relocations that some startup code can easily fix.

    That startup code may have to be written carefully, but majority of the binary may not need such instruction-level modifications.

    You may also want to investigate, within the limits imposed by your employer and by licenses involved, how other kernels implement relocations/randomizations.

Reply
  • You mentioned linked article specifies the way to calculate the valid address, is there a link that i can read and get the offset?

    The possible valid offsets accepted by the A32-adr instruction, is given here: "... an have any value that can be produced by rotating an 8-bit value right by any even number of bits within a 32-bit word".


    Was the adr instruction originally an "ldr r1, =__be_forkx" instruction?

    Since the modification succeeds with A64-adrp instruction, you may want to confirm that the failure of A32-adr instruction is actually because of the range limitation.

    A32-adrl is supported, at least by GNU as. The invalid-instruction error, upon encountering adrl, points towards the assembler. One can write a small testcase to see if the assembler recognizes adrl. If not, since adr/l are, beneath the surface, add/sub instructions, they can be hand-coded using add/sub, although I did read somewhere that such a practice is discouraged.


    Assuming that a relocatable, bare-metal binary is being built, would it not be simpler to build it as a shared object? Such a build should emit appropriate relocations that some startup code can easily fix.

    That startup code may have to be written carefully, but majority of the binary may not need such instruction-level modifications.

    You may also want to investigate, within the limits imposed by your employer and by licenses involved, how other kernels implement relocations/randomizations.

Children