How to define a symbol with absolute address for AArch64?

Xi Ruoyao xry111@xry111.site
Tue Sep 12 13:46:18 GMT 2023


On Tue, 2023-09-12 at 14:58 +0200, Sebastian Huber wrote:
> On 12.09.23 13:21, Richard Earnshaw wrote:
> > 
> > 
> > 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:
> 
> I get the same result with -mcmodel=large. With -mcmodel=tiny I get:
> 
> aarch64-rtems6-gcc abs.c -Wl,--gc-sections -Wl,--defsym=abs_symbol_2=291 
> -mcmodel=tiny
> /tmp/ccKUnvyq.o: in function `f_abs_symbol_2':
> abs.c:(.text+0x8): relocation truncated to fit: R_AARCH64_ADR_PREL_LO21 
> against symbol `abs_symbol_2' defined in *ABS* section in a.out
> collect2: error: ld returned 1 exit status
> 
> Is this a tool bug?

No, it's how code models are defined.  GCC documentation says clearly:

       -mcmodel=tiny
           Generate code for  the  tiny  code  model.   The  program  and  its
           statically  defined  symbols  must  be  within  1MB  of each other.
           Programs can be statically or dynamically linked.

Here the text is located at 0x400000 but abs_symbol_2 is at 0x123, thus
violating the definition of -mcmodel=tiny.

> Is there some way to make this working with -mcmodel=small?

No because -mcmodel=small only assumes the program and the symbols are
within *a* 4GB range - for example it's allowed to be [47GB, 51GB). 
This is different from the default code model of RISC-V (-
mcmodel=medlow) where the symbols must be in [-2GB, 2GB).

If you really think GCC should support this you can ask GCC for adding a
new code model.  Anyway this is not a linker issue because the adrp-add
pairs are generated by GCC.

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University


More information about the Binutils mailing list