How to define a symbol with absolute address for AArch64?
Richard Earnshaw
Richard.Earnshaw@foss.arm.com
Tue Sep 12 11:21:16 GMT 2023
On 12/09/2023 11:02, Sebastian Huber wrote:
> Hello,
>
> I would like to define a global symbol with an absolute address in an
> assembly/C source file for the AArch64 target. This works for all other
> architectures I tried so far, but not for AArch64:
>
> extern char abs_symbol[];
> extern char abs_symbol_2[];
>
> __asm__(
> "\t.globl abs_symbol\n"
> "\t.set abs_symbol, 0x123\n"
> );
>
> unsigned long f_abs_symbol(void)
> {
> return (unsigned long)abs_symbol;
> }
>
> unsigned long f_abs_symbol_2(void)
> {
> return (unsigned long)abs_symbol_2;
> }
>
> unsigned long _start(void)
> {
> return f_abs_symbol() + f_abs_symbol_2();
> }
>
> aarch64-rtems6-gcc abs.c -Wl,--gc-sections -Wl,--defsym=abs_symbol_2=291
Have you tried -mcmodel=large? With that I get:
0000000000400000 <f_abs_symbol>:
400000: 90000000 adrp x0, 400000 <f_abs_symbol>
400004: 91004000 add x0, x0, #0x10
400008: f9400000 ldr x0, [x0]
40000c: d65f03c0 ret
400010: 00000123 .word 0x00000123
400014: 00000000 .word 0x00000000
0000000000400018 <f_abs_symbol_2>:
400018: 90000000 adrp x0, 400000 <f_abs_symbol>
40001c: 9100a000 add x0, x0, #0x28
400020: f9400000 ldr x0, [x0]
400024: d65f03c0 ret
400028: 00000123 .word 0x00000123
40002c: 00000000 .word 0x00000000
0000000000400030 <_start>:
400030: a9be7bfd stp x29, x30, [sp, #-32]!
400034: 910003fd mov x29, sp
400038: f9000bf3 str x19, [sp, #16]
40003c: 97fffff1 bl 400000 <f_abs_symbol>
400040: aa0003f3 mov x19, x0
400044: 97fffff5 bl 400018 <f_abs_symbol_2>
400048: 8b000260 add x0, x19, x0
40004c: f9400bf3 ldr x19, [sp, #16]
400050: a8c27bfd ldp x29, x30, [sp], #32
400054: d65f03c0 ret
R.
>
> aarch64-rtems6-objdump -d a.out
>
> a.out: file format elf64-littleaarch64
>
>
> Disassembly of section .text:
>
> 0000000000400000 <f_abs_symbol>:
> 400000: 90000000 adrp x0, 400000 <f_abs_symbol>
> 400004: 91048c00 add x0, x0, #0x123
> 400008: d65f03c0 ret
>
> 000000000040000c <f_abs_symbol_2>:
> 40000c: 90ffe000 adrp x0, 0 <abs_symbol-0x123>
> 400010: 91048c00 add x0, x0, #0x123
> 400014: d65f03c0 ret
>
> 0000000000400018 <_start>:
> 400018: a9be7bfd stp x29, x30, [sp, #-32]!
> 40001c: 910003fd mov x29, sp
> 400020: f9000bf3 str x19, [sp, #16]
> 400024: 97fffff7 bl 400000 <f_abs_symbol>
> 400028: aa0003f3 mov x19, x0
> 40002c: 97fffff8 bl 40000c <f_abs_symbol_2>
> 400030: 8b000260 add x0, x19, x0
> 400034: f9400bf3 ldr x19, [sp, #16]
> 400038: a8c27bfd ldp x29, x30, [sp], #32
> 40003c: d65f03c0 ret
>
> On riscv it works for example:
>
> riscv-rtems6-gcc abs.c -Wl,--gc-sections -Wl,--defsym=abs_symbol_2=291
> -O2 -march=rv64imafd -mabi=lp64d -mcmodel=medany
>
> riscv-rtems6-objdump -d a.out
>
> a.out: file format elf64-littleriscv
>
>
> Disassembly of section .text:
>
> 00000000000100b0 <f_abs_symbol>:
> 100b0: 1230051b addiw a0,zero,291
> 100b4: 00008067 ret
>
> 00000000000100b8 <f_abs_symbol_2>:
> 100b8: 12300513 li a0,291
> 100bc: 00008067 ret
>
> 00000000000100c0 <_start>:
> 100c0: 12300793 li a5,291
> 100c4: 1230051b addiw a0,zero,291
> 100c8: 00f50533 add a0,a0,a5
> 100cc: 00008067 ret
>
More information about the Binutils
mailing list