基于LLVM源码构建x86_64裸机libcxx工具链的技术问询
构建x86_64裸机C++工具链的问题与尝试
需求与核心疑问
需要一个精简的现代x86_64裸机C++工具链,包含适配裸机场景的libc和libcxx(无标准系统功能)。LLVM项目基于CMake的libcxx看起来符合需求,但存在以下疑问:
- LLVM的libcxx是否支持LLVM生态外的裸机使用?除了《BuildingLibcxx》文档外,是否有其他相关说明?
- 是否必须以LLVM的libc作为裸机libcxx的基础,还是可以自行提供libc头文件?(注:明确printf()等符号需自行实现,仅需要libc的部分头文件,无需exit()、write()、printf()等功能)
初始CMake配置与构建错误
当前CMakeLists.txt相关片段如下:
set(LLVM_ENABLE_RUNTIMES "libcxxabi;libcxx") set(LLVM_INCLUDE_TESTS "OFF") set(LLVM_INCLUDE_DOCS "OFF") set(LIBCXXABI_ENABLE_SHARED "OFF") set(LIBCXXABI_ENABLE_STATIC "ON") set(LIBCXXABI_BAREMETAL "ON") set(LIBCXXABI_ENABLE_THREADS "OFF") set(LIBCXX_ENABLE_SHARED "OFF") set(LIBCXX_ENABLE_STATIC "ON") set(LIBCXX_ENABLE_UNICODE "ON") set(LIBCXX_ENABLE_WIDE_CHARACTERS "ON") set(LIBCXX_INCLUDE_TESTS "OFF") set(LIBCXX_INCLUDE_BENCHMARKS "OFF") set(LIBCXX_ENABLE_EXCEPTIONS "OFF") set(LIBCXX_ENABLE_FILESYSTEM "OFF") set(LIBCXX_ENABLE_LOCALIZATION "OFF") set(LIBCXX_ENABLE_MONOTONIC_CLOCK "OFF") set(LIBCXX_ENABLE_RANDOM_DEVICE "OFF") set(LIBCXX_ENABLE_RTTI "OFF") set(LIBCXX_ENABLE_SHARED "OFF") set(LIBCXX_ENABLE_THREADS "OFF") set(LIBCXX_ENABLE_TIME_ZONE_DATABASE "OFF") set(LIBCXX_INCLUDE_BENCHMARKS "OFF") set(LIBCXX_INSTALL_HEADERS "ON") set(LIBCXX_INSTALL_LIBRARY "OFF") set(LIBCXX_INSTALL_SHARED_LIBRARY "OFF") set(LIBCXX_INSTALL_STATIC_LIBRARY "OFF") add_subdirectory($ENV{LLVM_PROJECT_SRC}/runtimes ./llvm-project) add_executable(freestanding-linux-hello-world main.cpp) target_compile_options( freestanding-linux-hello-world PRIVATE -nodefaultlibs -nostdinc -nostdlib -ffreestanding "$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>" "$<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>" "$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>" ) target_link_options( freestanding-linux-hello-world PRIVATE -nodefaultlibs -nostdinc -nostdlib -ffreestanding "$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>" "$<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>" "$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>" ) target_link_libraries(freestanding-linux-hello-world PRIVATE cxx_static)
按照《BuildingLibcxx》指南,使用<llvm-project>/runtimes作为入口点,但构建时出现features.h缺失的错误。尝试逐个添加缺失头文件后仍持续出现编译错误。
引入LLVM libc后的问题
尝试构建LLVM的libc,添加了以下配置:
# added "libc" set(LLVM_ENABLE_RUNTIMES "libc;libcxxabi;libcxx") set(LIBC_TARGET_OS "baremetal") set(LIBC_TARGET_OS_IS_BAREMETAL "ON")
但构建仍失败,首个错误为:
error: ‘char* __llvm_libc::strcpy(char*, const char*)’ aliased to external symbol ‘strcpy’
因此暂停操作寻求指导。认为LLVM项目缺乏构建裸机CXX工具链的高阶说明。
更新1:尝试使用musl作为libc
尝试使用musl作为libc,通过大量临时调整构建了musl并仅使用其生成的头文件,目前有所进展,但仍存在构建错误。其中最突出的问题是libcxx的CMake构建始终使用x86_64-unknown-linux-gnu目标三元组,尝试设置以下变量但无效果:
set(LLVM_BUILTIN_TARGETS "x86_64-unknown-none") set(LLVM_RUNTIME_TARGETS "x86_64-unknown-none") set(LLVM_HOST_TRIPLE "x86_64-unknown-none") set(LLVM_TARGET_ARCH "x86_64-unknown-none") set(LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-none")
内容的提问来源于stack exchange,提问作者phip1611
相关产品推荐
相关产品推荐

