Skip to content

Instantly share code, notes, and snippets.

@weliveindetail
Last active January 10, 2024 12:52
Show Gist options
  • Save weliveindetail/932dc316af7a2ba2346cb30f08dcc21a to your computer and use it in GitHub Desktop.
Save weliveindetail/932dc316af7a2ba2346cb30f08dcc21a to your computer and use it in GitHub Desktop.
Cross-compile and remote debug clang-repl on Raspberry Pi 2-4 (32-bit Raspbian armv7)
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "custom",
"name": "[raspi4b] Attach clang-repl",
"initCommands": [
"platform select remote-linux",
"platform connect connect://192.168.1.104:9001",
],
"targetCreateCommands": [
"process attach --name clang-repl",
],
"sourceMap": {
"/root": "${workspaceFolder}",
},
}
]
}

Cross-compile in docker:

host> docker run -v $(pwd)/Develop/llvm-project:/root -it echtzeit/ubuntu-cross-aarch32-clang-repl:20.04-gcc10 /bin/bash
$ cd /root
$ cmake -S llvm -G Ninja -B build-ubuntu20.04-host -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;llvm"
$ ninja -C build-ubuntu20.04-host llvm-tblgen clang-tblgen
$ cmake -S llvm -G Ninja -B build-ubuntu20.04-aarch32 -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS="clang;llvm" \
      -DCMAKE_CROSSCOMPILING=1 \
      -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc-10 \
      -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++-10 \
      -DLLVM_HOST_TRIPLE=arm-unknown-linux-gnueabihf \
      -DLLVM_TABLEGEN=/root/build-ubuntu20.04-host/bin/llvm-tblgen \
      -DCLANG_TABLEGEN=/root/build-ubuntu20.04-host/bin/clang-tblgen

$ cd build-ubuntu20.04-aarch32
$ ninja clang-repl
...
/usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-gnueabihf/bin/ld.gold: error: PLT offset too large, try linking with --long-plt
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

$ ninja -t commands clang-repl | tail -1
...
$ /usr/bin/arm-linux-gnueabihf-g++-10 -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -fno-lifetime-dse -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-uninitialized -Wno-nonnull -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment -Wno-misleading-indentation -fdiagnostics-color -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fuse-ld=gold   -Wl,--export-dynamic  -Wl,-rpath-link,/root/build-ubuntu20.04-aarch32/./lib tools/clang/tools/clang-repl/CMakeFiles/clang-repl.dir/ClangRepl.cpp.o -o bin/clang-repl  -Wl,-rpath,"\$ORIGIN/../lib:"  lib/libLLVMAArch64CodeGen.a  lib/libLLVMAArch64AsmParser.a  lib/libLLVMAArch64Desc.a  lib/libLLVMAArch64Disassembler.a  lib/libLLVMAArch64Info.a  lib/libLLVMAArch64Utils.a  lib/libLLVMAMDGPUCodeGen.a  lib/libLLVMAMDGPUAsmParser.a  lib/libLLVMAMDGPUDesc.a  lib/libLLVMAMDGPUDisassembler.a  lib/libLLVMAMDGPUInfo.a  lib/libLLVMAMDGPUUtils.a  lib/libLLVMARMCodeGen.a  lib/libLLVMARMAsmParser.a  lib/libLLVMARMDesc.a  lib/libLLVMARMDisassembler.a  lib/libLLVMARMInfo.a  lib/libLLVMARMUtils.a  lib/libLLVMAVRCodeGen.a  lib/libLLVMAVRAsmParser.a  lib/libLLVMAVRDesc.a  lib/libLLVMAVRDisassembler.a  lib/libLLVMAVRInfo.a  lib/libLLVMBPFCodeGen.a  lib/libLLVMBPFAsmParser.a  lib/libLLVMBPFDesc.a  lib/libLLVMBPFDisassembler.a  lib/libLLVMBPFInfo.a  lib/libLLVMHexagonCodeGen.a  lib/libLLVMHexagonAsmParser.a  lib/libLLVMHexagonDesc.a  lib/libLLVMHexagonDisassembler.a  lib/libLLVMHexagonInfo.a  lib/libLLVMLanaiCodeGen.a  lib/libLLVMLanaiAsmParser.a  lib/libLLVMLanaiDesc.a  lib/libLLVMLanaiDisassembler.a  lib/libLLVMLanaiInfo.a  lib/libLLVMLoongArchCodeGen.a  lib/libLLVMLoongArchAsmParser.a  lib/libLLVMLoongArchDesc.a  lib/libLLVMLoongArchDisassembler.a  lib/libLLVMLoongArchInfo.a  lib/libLLVMMipsCodeGen.a  lib/libLLVMMipsAsmParser.a  lib/libLLVMMipsDesc.a  lib/libLLVMMipsDisassembler.a  lib/libLLVMMipsInfo.a  lib/libLLVMMSP430CodeGen.a  lib/libLLVMMSP430AsmParser.a  lib/libLLVMMSP430Desc.a  lib/libLLVMMSP430Disassembler.a  lib/libLLVMMSP430Info.a  lib/libLLVMNVPTXCodeGen.a  lib/libLLVMNVPTXDesc.a  lib/libLLVMNVPTXInfo.a  lib/libLLVMPowerPCCodeGen.a  lib/libLLVMPowerPCAsmParser.a  lib/libLLVMPowerPCDesc.a  lib/libLLVMPowerPCDisassembler.a  lib/libLLVMPowerPCInfo.a  lib/libLLVMRISCVCodeGen.a  lib/libLLVMRISCVAsmParser.a  lib/libLLVMRISCVDesc.a  lib/libLLVMRISCVDisassembler.a  lib/libLLVMRISCVInfo.a  lib/libLLVMSparcCodeGen.a  lib/libLLVMSparcAsmParser.a  lib/libLLVMSparcDesc.a  lib/libLLVMSparcDisassembler.a  lib/libLLVMSparcInfo.a  lib/libLLVMSystemZCodeGen.a  lib/libLLVMSystemZAsmParser.a  lib/libLLVMSystemZDesc.a  lib/libLLVMSystemZDisassembler.a  lib/libLLVMSystemZInfo.a  lib/libLLVMVECodeGen.a  lib/libLLVMVEAsmParser.a  lib/libLLVMVEDesc.a  lib/libLLVMVEDisassembler.a  lib/libLLVMVEInfo.a  lib/libLLVMWebAssemblyCodeGen.a  lib/libLLVMWebAssemblyAsmParser.a  lib/libLLVMWebAssemblyDesc.a  lib/libLLVMWebAssemblyDisassembler.a  lib/libLLVMWebAssemblyInfo.a  lib/libLLVMWebAssemblyUtils.a  lib/libLLVMX86CodeGen.a  lib/libLLVMX86AsmParser.a  lib/libLLVMX86Desc.a  lib/libLLVMX86Disassembler.a  lib/libLLVMX86Info.a  lib/libLLVMXCoreCodeGen.a  lib/libLLVMXCoreDesc.a  lib/libLLVMXCoreDisassembler.a  lib/libLLVMXCoreInfo.a  lib/libLLVMCore.a  lib/libLLVMLineEditor.a  lib/libLLVMOption.a  lib/libLLVMOrcJIT.a  lib/libLLVMSupport.a  -lpthread  lib/libclangAST.a  lib/libclangBasic.a  lib/libclangFrontend.a  lib/libclangInterpreter.a  lib/libLLVMAArch64Desc.a  lib/libLLVMAArch64Info.a  lib/libLLVMAArch64Utils.a  lib/libLLVMMIRParser.a  lib/libLLVMAMDGPUDesc.a  lib/libLLVMAMDGPUInfo.a  lib/libLLVMAMDGPUUtils.a  lib/libLLVMHexagonDesc.a  lib/libLLVMHexagonInfo.a  lib/libLLVMLanaiDesc.a  lib/libLLVMLanaiInfo.a  lib/libLLVMLoongArchDesc.a  lib/libLLVMLoongArchInfo.a  lib/libLLVMRISCVDesc.a  lib/libLLVMRISCVInfo.a  lib/libLLVMSystemZDesc.a  lib/libLLVMSystemZInfo.a  lib/libLLVMWebAssemblyDesc.a  lib/libLLVMWebAssemblyInfo.a  lib/libLLVMARMCodeGen.a  lib/libLLVMAsmPrinter.a  lib/libLLVMGlobalISel.a  lib/libLLVMSelectionDAG.a  lib/libLLVMARMAsmParser.a  lib/libLLVMARMDisassembler.a  lib/libLLVMARMDesc.a  lib/libLLVMMCDisassembler.a  lib/libLLVMARMInfo.a  lib/libLLVMARMUtils.a  lib/libclangFrontendTool.a  lib/libclangCodeGen.a  lib/libLLVMCoverage.a  lib/libLLVMFrontendDriver.a  lib/libLLVMLTO.a  lib/libLLVMExtensions.a  lib/libclangExtractAPI.a  lib/libclangRewriteFrontend.a  lib/libclangARCMigrate.a  lib/libclangStaticAnalyzerFrontend.a  lib/libclangStaticAnalyzerCheckers.a  lib/libclangStaticAnalyzerCore.a  lib/libclangCrossTU.a  lib/libclangIndex.a  lib/libclangFrontend.a  lib/libclangDriver.a  lib/libclangParse.a  lib/libclangSerialization.a  lib/libclangSema.a  lib/libclangAPINotes.a  lib/libclangEdit.a  lib/libclangAnalysis.a  lib/libclangASTMatchers.a  lib/libclangAST.a  lib/libclangSupport.a  lib/libLLVMFrontendHLSL.a  lib/libclangFormat.a  lib/libclangToolingInclusions.a  lib/libclangToolingCore.a  lib/libclangRewrite.a  lib/libclangLex.a  lib/libclangBasic.a  lib/libLLVMOrcDebugging.a  lib/libLLVMOrcJIT.a  lib/libLLVMPasses.a  lib/libLLVMCFGuard.a  lib/libLLVMCodeGen.a  lib/libLLVMCodeGenTypes.a  lib/libLLVMHipStdPar.a  lib/libLLVMObjCARCOpts.a  lib/libLLVMCoroutines.a  lib/libLLVMipo.a  lib/libLLVMVectorize.a  lib/libLLVMInstrumentation.a  lib/libLLVMFrontendOpenMP.a  lib/libLLVMScalarOpts.a  lib/libLLVMFrontendOffloading.a  lib/libLLVMAggressiveInstCombine.a  lib/libLLVMInstCombine.a  lib/libLLVMLinker.a  lib/libLLVMTransformUtils.a  lib/libLLVMIRPrinter.a  lib/libLLVMBitWriter.a  lib/libLLVMExecutionEngine.a  lib/libLLVMTarget.a  lib/libLLVMAnalysis.a  lib/libLLVMProfileData.a  lib/libLLVMSymbolize.a  lib/libLLVMDebugInfoPDB.a  lib/libLLVMDebugInfoMSF.a  lib/libLLVMDebugInfoBTF.a  lib/libLLVMWindowsDriver.a  lib/libLLVMRuntimeDyld.a  lib/libLLVMJITLink.a  lib/libLLVMOption.a  lib/libLLVMOrcTargetProcess.a  lib/libLLVMOrcShared.a  lib/libLLVMDebugInfoDWARF.a  lib/libLLVMObject.a  lib/libLLVMMCParser.a  lib/libLLVMMC.a  lib/libLLVMDebugInfoCodeView.a  lib/libLLVMIRReader.a  lib/libLLVMBitReader.a  lib/libLLVMAsmParser.a  lib/libLLVMCore.a  lib/libLLVMRemarks.a  lib/libLLVMBitstreamReader.a  lib/libLLVMTextAPI.a  lib/libLLVMBinaryFormat.a  lib/libLLVMTargetParser.a  lib/libLLVMSupport.a  lib/libLLVMDemangle.a  -lrt  -ldl  -lpthread  -lm  -Wl,--long-plt

$ ls -lh bin/clang-repl
-rwxr-xr-x 1 root root 3.7G Jan  9 14:56 bin/clang-repl

Get device IP and start lldb-server:

ez@raspberrypi:~/Develop/clang-repl/bin-prebuilt $ ip address | grep 192.168
    inet 192.168.1.104/24 brd 192.168.1.255 scope global noprefixroute eth0
ez@raspberrypi:~/Develop/clang-repl/bin-prebuilt $ ./lldb-server platform --server --listen 0.0.0.0:9001 --gdbserver-port 9002
Connection established.

Transfer the binary:

host> scp ~/Develop/llvm-project/build-ubuntu20.04-aarch32/bin/clang-repl ez@192.168.1.104:/home/ez/Develop/clang-repl/bin-prebuilt/clang-repl

Remote debug with local source files:

host> lldb-17
(lldb) platform select remote-linux
  Platform: remote-linux
 Connected: no
(lldb) platform connect connect://192.168.1.104:9001
  Platform: remote-linux
    Triple: arm-unknown-linux-gnueabihf
OS Version: 6.1.21 (6.1.21-v8+)
  Hostname: raspberrypi
 Connected: yes
WorkingDir: /home/ez/Develop/clang-repl/bin-prebuilt
    Kernel: #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023
(lldb) target create /home/ez/Develop/clang-repl/bin-prebuilt/clang-repl
Current executable set to '/home/ez/Develop/clang-repl/bin-prebuilt/clang-repl' (arm).
(lldb) b main
Breakpoint 1: where = clang-repl`main + 58 at ClangRepl.cpp:142:22, address = 0x00cae62c
(lldb) b Interpreter::CreateExecutor
Breakpoint 2: where = clang-repl`clang::Interpreter::CreateExecutor() + 26 at Interpreter.cpp:368:44, address = 0x0323f3a6
(lldb) r
Process 5715 launched: '/home/ez/.lldb/module_cache/remote-linux/.cache/7D959C71-E942-1D3B-C437-DFFCF1DC872E-E5410846/clang-repl' (arm)
Process 5715 stopped
* thread #1, name = 'clang-repl-jitl', stop reason = breakpoint 1.1
    frame #0: 0x010ae62c clang-repl`main(argc=1, argv=0xfffefea4) at ClangRepl.cpp:142:22
(lldb) source info -a $pc
Lines found in module `clang-repl
[0x010ae62c-0x010ae670): /root/clang/tools/clang-repl/ClangRepl.cpp:142:22
(lldb) settings set target.source-map /root /home/ez/Develop/llvm-project
(lldb) b clang/lib/Interpreter/Interpreter.cpp:165
Breakpoint 3: where = clang-repl`clang::IncrementalCompilerBuilder::create(std::vector<char const*, std::allocator<char const*>>&) + 662 at Interpreter.cpp:165:55, address = 0x0363e2f6
(lldb) c
Process 5715 resuming
Process 5715 stopped
* thread #1, name = 'clang-repl-jitl', stop reason = breakpoint 3.1
    frame #0: 0x0363e2f6 clang-repl`clang::IncrementalCompilerBuilder::create(ClangArgv=size=6) at Interpreter.cpp:165:55
   162    TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer;
   163    DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer);
   164 
-> 165    driver::Driver Driver(/*MainBinaryName=*/ClangArgv[0],
   166                          llvm::sys::getProcessTriple(), Diags);
   167    Driver.setCheckInputsExist(false); // the input comes from mem buffers
   168    llvm::ArrayRef<const char *> RF = llvm::ArrayRef(ClangArgv);
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment