https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120002

            Bug ID: 120002
           Summary: R_AARCH64_ABS64 emitted against hidden symbol
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: g...@t-8ch.de
  Target Milestone: ---

Relocations against involving hidden symbols should be PC-relative.
However on aarch64 with -mcmodel=tiny an absolute relocation may be emitted if
the offset to the symbol exceeds 64KiB.

Reproducer:

$ cat test.c
extern char hidden_symbol[] __attribute__((visibility("hidden")));

void *function(void)
{
        void *ptr;

        ptr = &hidden_symbol;
        /* Works until 64 * 1024 */
        ptr += 64 * 1024 + 1;

        return ptr;
}

$ aarch64-linux-gnu-gcc test.c -c -o test.o -mcmodel=tiny -O2
$ aarch64-linux-gnu-objdump --section .text --disassemble-all
--disassemble-zeroes --reloc test.o

test.o:     file format elf64-littleaarch64


Disassembly of section .text:

0000000000000000 <function>:
   0:   58000040        ldr     x0, 8 <function+0x8>
   4:   d65f03c0        ret
   8:   00000000        udf     #0
                        8: R_AARCH64_ABS64      hidden_symbol+0x10001
   c:   00000000        udf     #0



Background:

This setup is used in the Linux vDSO to achieve completely position independent
code. Some recent refactors triggered this bug.
https://lore.kernel.org/lkml/aApGPAoctq_eoE2g@t14ultra/

Reply via email to