coremark移植坑之-nostartfiles -nostdlib参数
·
一、 如果coremark移植不成功,但是又不知道哪里错,明明RV官方测试能通过。
二、 检查这两个参数没设置。
三、参数含义
| 参数 | 含义 |
|---|---|
-nostdlib |
不使用标准 C 库(libc)和标准启动文件(crt0.o 等)。通常用于裸机/嵌入式环境,开发者自行提供所有运行时支持。 |
-nostartfiles |
不链接启动文件(如 crt1.o、crti.o、crtn.o)。程序入口点完全由开发者控制(如自定义 _start)。 |
四、解释
裸机 CoreMark
> 想象你买了一套毛坯房(裸机芯片),里面什么都没有——没有地板、没有水电、没有天然气。现在你想直接搬进去住(运行 CoreMark 程序)。
正常情况:拎包入住精装公寓
就像拎包入住精装公寓,你什么都不用操心:
| 精装公寓设施 | 对应编译环节 |
|---|---|
| 地板铺好了 | crt0.o 启动文件已设置好栈、初始化 BSS 段 |
| 水电天然气通好了 | libc 标准库提供 printf、malloc、time 等函数 |
| 物业管家一应俱全 | glibc 处理程序入口、退出清理、信号处理 |
但毛坯房里什么都没有!
如果直接按正常方式编译,链接器会尝试调用精装公寓的基础设施,结果当然是崩溃——因为毛坯房里没有这些管道接口。
| 参数 | 作用 | 形象比喻 |
|---|---|---|
-nostartfiles |
不链接默认的启动文件(如 crt0.o、crt1.o) |
不要等别人帮你铺地板装门窗,你自己动手装修 |
-nostdlib |
不链接标准 C 库(libc) |
不要指望市政水电天然气,你自己拉电线接水管 |
❌不加参数时裸机运行的典型问题
> 入口点错误
> 默认启动文件 crt0.o 会尝试调用操作系统接口(如 Linux 的 _start → __libc_start_main),但裸机没有操作系统,CPU 上电后直接跳到 main 函数地址,根本找不到这些入口。
> 标准库函数悬空
> printf 想往 stdout 输出,但裸机没有终端;malloc 想向操作系统申请内存,但裸机没有内存管理器。这些调用会触发异常或直接崩溃。
> BSS 段未清零
> crt0.o 原本负责把未初始化的全局变量清零,裸机没人做这件事,导致程序读到垃圾值。
总之就是:裸机 CoreMark自己当全能装修工
裸机 CoreMark 需要自己提供替代物,就像毛坯房入住必须自己解决一切:
这是一些常用的裸机编译命令
riscv64-unknown-elf-gcc \
-nostartfiles -nostdlib \ # 告诉编译器:别依赖精装公寓的基础设施
-T link.ld \ # 自己指定"户型图"(链接脚本)
crt.S \ # 自己写"装修手册"(启动汇编)
syscalls.c \ # 自己实现"简易水电"(极简系统调用)
coremark.c \ # 入住本身(CoreMark 源码)
-lm -lgcc \ # 只保留数学库和编译器内置库
-o coremark.elf
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)