You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:22:19