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

            Bug ID: 106270
           Summary: [Aarch64] -mlong-calls should be provided on aarch64
                    for users with large applications
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: qinzhao at gcc dot gnu.org
  Target Milestone: ---

Created attachment 53291
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53291&action=edit
tar ball for the small testing case

In aarch64 backend, aarch64_is_long_call_p always return FALSE by default, as a
result, direct calls (bl) are generated for all the calls. 

For smaller applications, generating direct calls by default for all the calls
will have good run-time performance. However, for larger applications, When the
size of the .text section exceed some limitation, linker will fail with the
following error:

 relocation truncated to fit: R_AARCH64_CALL26 against symbol 

This can be showed by the attached tar ball for a small testing case:

1. download the tar ball, and untar it;
2. cd aarch64_long_call
3. update the "GCC" in "build.sh", "assemble.sh" to your own gcc (gcc 8 and
above all have the same issue). 
4. sh do_all.sh

gcc -S bar.c foo.c
patching file bar.s
Hunk #1 succeeded at 21 (offset -2 lines).
gcc -c bar.s foo.s
ld: warning: cannot find entry symbol _start; defaulting to 0000000010000000
bar.o: In function `bar':
bar.c:(.text+0x10): relocation truncated to fit: R_AARCH64_CALL26 against
symbol `foo' defined in .text section in foo.o

Reply via email to