使用CMake构建开源C/C++调试器扩展时如何修复动态重定位错误?
解决codelldb构建时的链接错误
错误原因
链接器报错源于构建共享库libcodelldb.so时,依赖的libc++.a和libc++abi.a静态库中的目标文件未用-fPIC编译。x86_64平台下,共享库要求所有代码必须是位置无关的(PIC),静态库缺少该编译参数会导致动态重定位失败。
解决方案
方案1:临时允许文本重定位(快速修复)
修改CMake配置,添加链接器参数跳过文本段重定位检查:
- 重新运行CMake并追加参数:
cmake .. -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-x86_64-linux-gnu.cmake -DLLDB_PACKAGE=/home/aximsoft/lldb.zip -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_SHARED_LINKER_FLAGS="-Wl,-z,notext"
- 清理旧构建文件后重新编译:
make clean && make
方案2:优先链接动态库(推荐)
如果系统已安装libc++.so和libc++abi.so动态库,让CMake优先使用动态库而非静态库:
- 重新配置CMake:
cmake .. -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-x86_64-linux-gnu.cmake -DLLDB_PACKAGE=/home/aximsoft/lldb.zip -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_FIND_LIBRARY_SUFFIXES=".so"
- 清理后重新编译:
make clean && make
方案3:编译带PIC的libc++/libc++abi(彻底解决)
若前两种方案无效,需自行编译支持PIC的libc和libcabi:
- 下载与当前llvm-10版本匹配的LLVM源码
- 编译时添加CMake参数:
-DLIBCXX_ENABLE_PIC=ON和-DLIBCXXABI_ENABLE_PIC=ON - 将编译生成的库替换系统对应文件,或在codelldb的CMake配置中指定自定义库路径
内容的提问来源于stack exchange,提问作者ponmani
相关产品推荐
相关产品推荐

