qemu-arm 段错误

qemu-arm Segmentation Fault

拿一个简单的文件:

int main(void) {
  return 0;
}

我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.20)
project(TRA
        VERSION 0.0.1
        DESCRIPTION "STM32 Traffic Controller"
        LANGUAGES C ASM)

set(BSP_DRIVER_FILES
  BSP/tra/startup_stm32f429xx.s
  BSP/tra/Core/Src/system_stm32f4xx.c
)
set(BSP_COMPILER_FLAGS
  -DUSE_HAL_DRIVER
  -DSTM32F429xx
  -I${CMAKE_SOURCE_DIR}/BSP/tra/Core/Inc
  -I${CMAKE_SOURCE_DIR}/BSP/tra/Drivers/STM32F4xx_HAL_Driver/Inc
  -I${CMAKE_SOURCE_DIR}/BSP/tra/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy
  -I${CMAKE_SOURCE_DIR}/BSP/tra/Drivers/CMSIS/Device/ST/STM32F4xx/Include
  -I${CMAKE_SOURCE_DIR}/BSP/tra/Drivers/CMSIS/Include
) 

add_executable(tra)
target_sources(tra PRIVATE
  ${BSP_DRIVER_FILES}
  code/tra.c
)
set(COMPILER_FLAGS
  ${BSP_COMPILER_FLAGS}
  -O0 -g -ggdb3
  -mcpu=cortex-m4 -mthumb -mfloat-abi=soft
  -fdata-sections -ffunction-sections
  --specs=rdimon.specs
)
target_compile_options(tra PRIVATE
  ${COMPILER_FLAGS}
)
target_link_options(tra PRIVATE
  -mcpu=cortex-m4 -mthumb -mfloat-abi=soft
  --specs=rdimon.specs -lm -lc
  -Wl,--gc-sections
)

运行qemu-arm build/tra。 我得到

qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)

我的理解是这个问题通常是由 qemu 不处理硬件 FPU 引起的,但是我在这里指定的是软件浮点数。另外,我已经从 startup.c 文件中删除了 FPU 初始化代码。 使用 gdb:

# Start
qemu-arm -g 1234 build/tra
# Attach
arm-none-eabi-gdb -q --nh -ex 'file build/tra' -ex 'target remote localhost:1234'

我在 SystemInit() 处遇到分段错误。 运行 gdb 列表,它显示了注释掉的 FPU 初始化代码,所以我看不出这是怎么回事。 因此,我对发生的事情一头雾水。

您正在为 Cortex-M CPU 构建裸机二进制文件,然后尝试 运行 在 qemu-arm 上 运行 它,它是 运行 的模拟器宁 Cortex-A Linux 个二进制文件。

如果你正在构建一个裸机二进制文件,你需要为你想要 运行 它的确切机器类型构建它,这意味着你需要以 qemu 支持的机器类型为目标-system-arm,你需要告诉qemu-system-arm使用那个机器类型。

根据 require full system emulation. For cortex-M, this was provided by xPack QEMU

的建议