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
的建议
拿一个简单的文件:
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使用那个机器类型。
根据