relocation truncated to fit: R_AARCH64_LD64_GOTPAGE_LO15

found problem when running bazel build with aarch64 configs:

build:aarch64_config --crosstool_top=//toolchain:aarch64_suite
build:aarch64_config --cpu=aarch64
build:aarch64_config --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
build:aarch64_config --nostart_end_lib

key is the warning :

warning: Too many GOT entries for -fpic, please recompile with -fPIC

GOT size limitation

problem came from wiki Global Offset Table and Intel Global Offset Table, youtube Intel Global Offset Table

如果链接的可执行文件的GOT大小超过计算机架构特定的最大值,则会在编译链接时报错误消息,提示 -fpic 不起作用; 因此在这种情况下,需要使用 -fPIC 重新编译。GOT大小因芯片架构的不同而大小不一样,SPARC上为8k,在AArch64上为28k, 在m68k和RS / 6000上为32k。而x86上没有此限制。ref

see here for more about PIC

-fpic

Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC, 28k on AArch64 and 32k on the m68k and RS/6000. The x86 has no such limit.)

Position-independent code requires special support, and therefore works only on certain machines. For the x86, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent.

When this flag is set, the macros pic and PIC are defined to 1.

-fPIC

If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on AArch64, m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.

When this flag is set, the macros pic and PIC are defined to 2.

Way to reduce GOT

enable –copt=”-O3” could reduce the GOT table size, without turning on fPIC (reference)

build:aarch64_config --copt=-fPIC
build:aarch64_config --copt=-O3