Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build err on arm64 machine, relocation truncated to fit: R_AARCH64_LD64_GOTPAGE_LO15 against symbol #3159

Closed
zhangzhiqiangcs opened this issue May 9, 2024 Discussed in #3148 · 1 comment

Comments

@zhangzhiqiangcs
Copy link

Discussed in #3148

Originally posted by zhangzhiqiangcs May 2, 2024
Hi, all, I try to build a static bpftrace binary on my arm64 manchine in a alpine:3.18 container, just followed the docker/Dockerfile.static and static.sh, the build process always filed at final link stage with err

Linking CXX executable bpftrace
 /usr/bin/cmake -E cmake_link_script CMakeFiles/bpftrace.dir/link.txt --verbose=1
/usr/bin/c++ -O3 -DNDEBUG -static-libgcc -static-libstdc++ CMakeFiles/bpftrace.dir/main.cpp.o -o bpftrace  libbpftrace.a resources/libresources.a libruntime.a /usr/lib/libbpf.a /lib/libz.a /usr/lib/libbcc.a /usr/lib/libbcc_bpf.a /usr/lib/libbpf.a /lib/libz.a /usr/lib/libbcc.a /usr/lib/libbcc_bpf.a /usr/lib/libbcc-loader-static.a /usr/lib/liblzma.a /usr/lib/libelf.a aot/libaot.a librequired_resources.a ast/libast.a ../libparser.a ast/libast_defs.a /usr/lib/llvm16/lib/libclang.a /usr/lib/llvm16/lib/libclangExtractAPI.a /usr/lib/llvm16/lib/libclangARCMigrate.a /usr/lib/llvm16/lib/libclangIncludeFixerPlugin.a /usr/lib/llvm16/lib/libclangTooling.a /usr/lib/llvm16/lib/libclangIncludeFixer.a /usr/lib/llvm16/lib/libfindAllSymbols.a /usr/lib/llvm16/lib/libclangIndex.a /usr/lib/llvm16/lib/libclangFormat.a /usr/lib/llvm16/lib/libclangToolingInclusions.a /usr/lib/llvm16/lib/libclangFrontend.a /usr/lib/llvm16/lib/libclangDriver.a /usr/lib/llvm16/lib/libclangParse.a /usr/lib/llvm16/lib/libclangSerialization.a /usr/lib/llvm16/lib/libclangSema.a /usr/lib/llvm16/lib/libclangEdit.a /usr/lib/llvm16/lib/libclangSupport.a /usr/lib/llvm16/lib/libclangTidyPlugin.a /usr/lib/llvm16/lib/libclangTidyAndroidModule.a /usr/lib/llvm16/lib/libclangTidyAbseilModule.a /usr/lib/llvm16/lib/libclangTidyAlteraModule.a /usr/lib/llvm16/lib/libclangTidyBoostModule.a /usr/lib/llvm16/lib/libclangTidyCERTModule.a /usr/lib/llvm16/lib/libclangTidyConcurrencyModule.a /usr/lib/llvm16/lib/libclangTidyDarwinModule.a /usr/lib/llvm16/lib/libclangTidyFuchsiaModule.a /usr/lib/llvm16/lib/libclangTidyHICPPModule.a /usr/lib/llvm16/lib/libclangTidyBugproneModule.a /usr/lib/llvm16/lib/libclangTidyCppCoreGuidelinesModule.a /usr/lib/llvm16/lib/libclangTidyGoogleModule.a /usr/lib/llvm16/lib/libclangTidyLinuxKernelModule.a /usr/lib/llvm16/lib/libclangTidyLLVMModule.a /usr/lib/llvm16/lib/libclangTidyLLVMLibcModule.a /usr/lib/llvm16/lib/libclangTidyMiscModule.a /usr/lib/llvm16/lib/libclangAnalysis.a /usr/lib/llvm16/lib/libclangASTMatchers.a /usr/lib/llvm16/lib/libclangAST.a /usr/lib/llvm16/lib/libclangTidyModernizeModule.a /usr/lib/llvm16/lib/libclangTidyObjCModule.a /usr/lib/llvm16/lib/libclangTidyOpenMPModule.a /usr/lib/llvm16/lib/libclangTidyPerformanceModule.a /usr/lib/llvm16/lib/libclangTidyPortabilityModule.a /usr/lib/llvm16/lib/libclangTidyReadabilityModule.a /usr/lib/llvm16/lib/libclangTidyZirconModule.a /usr/lib/llvm16/lib/libclangTidyMPIModule.a /usr/lib/llvm16/lib/libclangTidyUtils.a /usr/lib/llvm16/lib/libclangTidy.a /usr/lib/llvm16/lib/libclangToolingCore.a /usr/lib/llvm16/lib/libclangRewrite.a /usr/lib/llvm16/lib/libclangLex.a /usr/lib/llvm16/lib/libclangBasic.a /usr/lib/llvm16/lib/libLLVMBPFCodeGen.a /usr/lib/llvm16/lib/libLLVMMCJIT.a /usr/lib/llvm16/lib/libLLVMOrcJIT.a /usr/lib/llvm16/lib/libLLVMExecutionEngine.a /usr/lib/llvm16/lib/libLLVMRuntimeDyld.a /usr/lib/llvm16/lib/libLLVMJITLink.a /usr/lib/llvm16/lib/libLLVMOrcTargetProcess.a /usr/lib/llvm16/lib/libLLVMOrcShared.a /usr/lib/llvm16/lib/libLLVMWindowsDriver.a /usr/lib/llvm16/lib/libLLVMOption.a /usr/lib/llvm16/lib/libLLVMAArch64CodeGen.a /usr/lib/llvm16/lib/libLLVMAArch64AsmParser.a /usr/lib/llvm16/lib/libLLVMAArch64Disassembler.a /usr/lib/llvm16/lib/libLLVMAArch64Desc.a /usr/lib/llvm16/lib/libLLVMAArch64Info.a /usr/lib/llvm16/lib/libLLVMAArch64Utils.a /usr/lib/llvm16/lib/libLLVMAMDGPUCodeGen.a /usr/lib/llvm16/lib/libLLVMPasses.a /usr/lib/llvm16/lib/libLLVMCoroutines.a /usr/lib/llvm16/lib/libLLVMIRPrinter.a /usr/lib/llvm16/lib/libLLVMMIRParser.a /usr/lib/llvm16/lib/libLLVMAMDGPUAsmParser.a /usr/lib/llvm16/lib/libLLVMAMDGPUDisassembler.a /usr/lib/llvm16/lib/libLLVMAMDGPUDesc.a /usr/lib/llvm16/lib/libLLVMAMDGPUInfo.a /usr/lib/llvm16/lib/libLLVMAMDGPUUtils.a /usr/lib/llvm16/lib/libLLVMARMCodeGen.a /usr/lib/llvm16/lib/libLLVMARMAsmParser.a /usr/lib/llvm16/lib/libLLVMARMDisassembler.a /usr/lib/llvm16/lib/libLLVMARMDesc.a /usr/lib/llvm16/lib/libLLVMARMInfo.a /usr/lib/llvm16/lib/libLLVMARMUtils.a /usr/lib/llvm16/lib/libLLVMAVRCodeGen.a /usr/lib/llvm16/lib/libLLVMAVRAsmParser.a /usr/lib/llvm16/lib/libLLVMAVRDesc.a /usr/lib/llvm16/lib/libLLVMAVRDisassembler.a /usr/lib/llvm16/lib/libLLVMAVRInfo.a /usr/lib/llvm16/lib/libLLVMBPFAsmParser.a /usr/lib/llvm16/lib/libLLVMBPFDesc.a /usr/lib/llvm16/lib/libLLVMBPFDisassembler.a /usr/lib/llvm16/lib/libLLVMBPFInfo.a /usr/lib/llvm16/lib/libLLVMHexagonCodeGen.a /usr/lib/llvm16/lib/libLLVMHexagonAsmParser.a /usr/lib/llvm16/lib/libLLVMHexagonDisassembler.a /usr/lib/llvm16/lib/libLLVMHexagonDesc.a /usr/lib/llvm16/lib/libLLVMHexagonInfo.a /usr/lib/llvm16/lib/libLLVMLanaiCodeGen.a /usr/lib/llvm16/lib/libLLVMLanaiAsmParser.a /usr/lib/llvm16/lib/libLLVMLanaiDisassembler.a /usr/lib/llvm16/lib/libLLVMLanaiDesc.a /usr/lib/llvm16/lib/libLLVMLanaiInfo.a /usr/lib/llvm16/lib/libLLVMLoongArchCodeGen.a /usr/lib/llvm16/lib/libLLVMLoongArchAsmParser.a /usr/lib/llvm16/lib/libLLVMLoongArchDisassembler.a /usr/lib/llvm16/lib/libLLVMLoongArchDesc.a /usr/lib/llvm16/lib/libLLVMLoongArchInfo.a /usr/lib/llvm16/lib/libLLVMMipsCodeGen.a /usr/lib/llvm16/lib/libLLVMMipsAsmParser.a /usr/lib/llvm16/lib/libLLVMMipsDesc.a /usr/lib/llvm16/lib/libLLVMMipsDisassembler.a /usr/lib/llvm16/lib/libLLVMMipsInfo.a /usr/lib/llvm16/lib/libLLVMMSP430CodeGen.a /usr/lib/llvm16/lib/libLLVMMSP430AsmParser.a /usr/lib/llvm16/lib/libLLVMMSP430Desc.a /usr/lib/llvm16/lib/libLLVMMSP430Disassembler.a /usr/lib/llvm16/lib/libLLVMMSP430Info.a /usr/lib/llvm16/lib/libLLVMNVPTXCodeGen.a /usr/lib/llvm16/lib/libLLVMNVPTXDesc.a /usr/lib/llvm16/lib/libLLVMNVPTXInfo.a /usr/lib/llvm16/lib/libLLVMPowerPCCodeGen.a /usr/lib/llvm16/lib/libLLVMPowerPCAsmParser.a /usr/lib/llvm16/lib/libLLVMPowerPCDesc.a /usr/lib/llvm16/lib/libLLVMPowerPCDisassembler.a /usr/lib/llvm16/lib/libLLVMPowerPCInfo.a /usr/lib/llvm16/lib/libLLVMRISCVCodeGen.a /usr/lib/llvm16/lib/libLLVMipo.a /usr/lib/llvm16/lib/libLLVMFrontendOpenMP.a /usr/lib/llvm16/lib/libLLVMLinker.a /usr/lib/llvm16/lib/libLLVMVectorize.a /usr/lib/llvm16/lib/libLLVMRISCVAsmParser.a /usr/lib/llvm16/lib/libLLVMRISCVDisassembler.a /usr/lib/llvm16/lib/libLLVMRISCVDesc.a /usr/lib/llvm16/lib/libLLVMRISCVInfo.a /usr/lib/llvm16/lib/libLLVMSparcCodeGen.a /usr/lib/llvm16/lib/libLLVMSparcAsmParser.a /usr/lib/llvm16/lib/libLLVMSparcDesc.a /usr/lib/llvm16/lib/libLLVMSparcDisassembler.a /usr/lib/llvm16/lib/libLLVMSparcInfo.a /usr/lib/llvm16/lib/libLLVMSystemZCodeGen.a /usr/lib/llvm16/lib/libLLVMSystemZAsmParser.a /usr/lib/llvm16/lib/libLLVMSystemZDisassembler.a /usr/lib/llvm16/lib/libLLVMSystemZDesc.a /usr/lib/llvm16/lib/libLLVMSystemZInfo.a /usr/lib/llvm16/lib/libLLVMVECodeGen.a /usr/lib/llvm16/lib/libLLVMVEAsmParser.a /usr/lib/llvm16/lib/libLLVMVEDesc.a /usr/lib/llvm16/lib/libLLVMVEDisassembler.a /usr/lib/llvm16/lib/libLLVMVEInfo.a /usr/lib/llvm16/lib/libLLVMWebAssemblyCodeGen.a /usr/lib/llvm16/lib/libLLVMWebAssemblyAsmParser.a /usr/lib/llvm16/lib/libLLVMWebAssemblyDisassembler.a /usr/lib/llvm16/lib/libLLVMWebAssemblyDesc.a /usr/lib/llvm16/lib/libLLVMWebAssemblyInfo.a /usr/lib/llvm16/lib/libLLVMWebAssemblyUtils.a /usr/lib/llvm16/lib/libLLVMX86CodeGen.a /usr/lib/llvm16/lib/libLLVMInstrumentation.a /usr/lib/llvm16/lib/libLLVMGlobalISel.a /usr/lib/llvm16/lib/libLLVMCFGuard.a /usr/lib/llvm16/lib/libLLVMX86AsmParser.a /usr/lib/llvm16/lib/libLLVMX86Desc.a /usr/lib/llvm16/lib/libLLVMX86Disassembler.a /usr/lib/llvm16/lib/libLLVMX86Info.a /usr/lib/llvm16/lib/libLLVMXCoreCodeGen.a /usr/lib/llvm16/lib/libLLVMAsmPrinter.a /usr/lib/llvm16/lib/libLLVMSelectionDAG.a /usr/lib/llvm16/lib/libLLVMCodeGen.a /usr/lib/llvm16/lib/libLLVMScalarOpts.a /usr/lib/llvm16/lib/libLLVMAggressiveInstCombine.a /usr/lib/llvm16/lib/libLLVMInstCombine.a /usr/lib/llvm16/lib/libLLVMBitWriter.a /usr/lib/llvm16/lib/libLLVMObjCARCOpts.a /usr/lib/llvm16/lib/libLLVMTarget.a /usr/lib/llvm16/lib/libLLVMTransformUtils.a /usr/lib/llvm16/lib/libLLVMAnalysis.a /usr/lib/llvm16/lib/libLLVMProfileData.a /usr/lib/llvm16/lib/libLLVMSymbolize.a /usr/lib/llvm16/lib/libLLVMDebugInfoDWARF.a /usr/lib/llvm16/lib/libLLVMDebugInfoPDB.a /usr/lib/llvm16/lib/libLLVMObject.a /usr/lib/llvm16/lib/libLLVMIRReader.a /usr/lib/llvm16/lib/libLLVMAsmParser.a /usr/lib/llvm16/lib/libLLVMBitReader.a /usr/lib/llvm16/lib/libLLVMMCParser.a /usr/lib/llvm16/lib/libLLVMTextAPI.a /usr/lib/llvm16/lib/libLLVMDebugInfoMSF.a /usr/lib/llvm16/lib/libLLVMCore.a /usr/lib/llvm16/lib/libLLVMRemarks.a /usr/lib/llvm16/lib/libLLVMBitstreamReader.a /usr/lib/llvm16/lib/libLLVMXCoreDesc.a /usr/lib/llvm16/lib/libLLVMXCoreDisassembler.a /usr/lib/llvm16/lib/libLLVMMCDisassembler.a /usr/lib/llvm16/lib/libLLVMXCoreInfo.a /usr/lib/llvm16/lib/libLLVMMC.a /usr/lib/llvm16/lib/libLLVMBinaryFormat.a /usr/lib/llvm16/lib/libLLVMTargetParser.a /usr/lib/llvm16/lib/libLLVMDebugInfoCodeView.a /usr/lib/llvm16/lib/libLLVMSupport.a -ldl -lrt -lm -Wl,-Bdynamic /lib/libz.a /usr/lib/libzstd.a /usr/lib/llvm16/lib/libLLVMDemangle.a arch/libarch.a cxxdemangler/libcxxdemangler_llvm.a -Wl,-Bstatic /usr/lib/libpcap.a -Wl,-Bdynamic -lrt -lpthread -ldl -lm -Wl,-Bstatic -lz 
/usr/lib/libpcap.a(nametoaddr.o): in function `pcap_nametoeproto':
nametoaddr.c:(.text+0x410): relocation truncated to fit: R_AARCH64_LD64_GOTPAGE_LO15 against symbol `eproto_db' defined in .data.rel.local section in /usr/lib/libpcap.a(nametoaddr.o)
/usr/lib/gcc/aarch64-alpine-linux-musl/12.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: nametoaddr.c:(.text+0x410): warning: too many GOT entries for -fpic, please recompile with -fPIC
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/bpftrace.dir/build.make:323: src/bpftrace] Error 1
make[2]: Leaving directory '/go/src/go.megvii-inc.com/bpftrace/build-static'
make[1]: *** [CMakeFiles/Makefile2:574: src/CMakeFiles/bpftrace.dir/all] Error 2
make[1]: Leaving directory '/go/src/go.megvii-inc.com/bpftrace/build-static'
make: *** [Makefile:139: all] Error 2
```</div>
@zhangzhiqiangcs
Copy link
Author

zhangzhiqiangcs commented May 11, 2024

Find that the limitation about maximums GOT entries is architecture specific.
In GCC doc, it says: there no limit on x86_64 but 28k on AArch64.
https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options

-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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant