【ARMv8M Cortex-M33 系列 3.1 -- RT-Thread renesas/ra4m2-eco 移植编译篇 nosys.specs 介绍】


请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】


文章目录

    • 问题背景
      • nosys.specs 介绍
      • nosys.specs 的作用
      • 使用举例

问题背景

在编译RT-Thread使用自己写的链接脚本时,使用 scons 进行编译时出现了下面问题:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
AS build/common/ra4m2_startup.o
CC ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.o
LINK rtthread.elf
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v8-m.main+fp/hard/libc.a(lib_a-abort.o): in function `abort':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v8-m.main+fp/hard/newlib/libc/stdlib/../../../../../../../../newlib/libc/stdlib/abort.c:59: undefined reference to `_exit'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v8-m.main+fp/hard/libc.a(lib_a-signalr.o): in function `_kill_r':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v8-m.main+fp/hard/newlib/libc/reent/../../../../../../../../newlib/libc/reent/signalr.c:53: undefined reference to `_kill'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v8-m.main+fp/hard/libc.a(lib_a-signalr.o): in function `_getpid_r':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v8-m.main+fp/hard/newlib/libc/reent/../../../../../../../../newlib/libc/reent/signalr.c:83: undefined reference to `_getpid'
collect2: error: ld returned 1 exit status
scons: *** [rtthread.elf] Error 1
scons: building terminated because of errors.

经过调查发现,出现上面的问题主要是由于使用了系统库导致的,那么如何才不适用系统库文件?下文将详细介绍。

nosys.specs 介绍

在使用 GNU 编译器集合 (GCC) 编译嵌入式 C/C++ 程序时,-specs 是一个编译器选项,它指定了链接器应该使用的 specs 文件。Specs 文件是 GCC 的一个特性,它允许程序员和系统构建者控制编译器和链接器的默认设置。nosys.specs 是一个特殊的 specs 文件,它用于告诉链接器不链接任何系统库,这在裸机环境(没有操作系统的环境)中特别有用。

nosys.specs 的作用

nosys.specs 通常在编译裸机或者半主机的 ARM Cortex-M 应用程序时使用。当你的程序不需要或不能使用标准系统库(如 glibcnewlib 中的系统调用)时,nosys.specs 非常有用。这些情况通常发生在不依赖操作系统的嵌入式系统中,比如不需要文件 I/O、堆分配、环境变量或命令行参数等功能的系统。

使用 nosys.specs 可以避免链接器尝试链接对于嵌入式环境来说不必要或不可用的系统调用处理。这样可以减少最终固件的大小,并避免在不支持这些特性的环境中运行时可能出现的问题。

使用举例

假如你有一个名为 main.c 的 C 程序,你想为一个没有操作系统的 ARM Cortex-M33 微控制器编译它,你可以使用以下 GCC 命令:

arm-none-eabi-gcc -mcpu=cortex-m33 -mthumb -specs=nosys.specs -o main.elf main.c 

在这个例子中:

  • arm-none-eabi-gcc 是用于 ARM 架构的 GCC 交叉编译器的名称。
  • -mcpu=cortex-m3 指定了目标 CPU 类型。
  • -mthumb 表示使用 Thumb 指令集。
  • -specs=nosys.specs 告诉链接器不要使用任何操作系统级系统调用的实现。
  • -o main.elf 指定输出文件名。
  • main.c 是输入的 C 源文件。

执行这条命令将生成一个名为 main.elf 的 ELF 格式的可执行文件,它可以在没有操作系统支持的 Cortex-M3 微控制器上运行,而不会链接任何可能导致运行时错误的标准库系统调用。

通过添加该编译选项之后可以顺利编译过:

...
LINK rtthread.elf
arm-none-eabi-objcopy -O ihex rtthread.elf rtthread.hex
arm-none-eabi-size rtthread.elftext    data     bss     dec     hex filename89464    3252    4208   96924   17a9c rtthread.elf
arm-none-eabi-objcopy -O binary rtthread.elf rtthread.bin
arm-none-eabi-size rtthread.elftext    data     bss     dec     hex filename89464    3252    4208   96924   17a9c rtthread.elf
scons: done building targets.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementplus去掉el-textarea 和 el-textarea的border

//html <el-inputv-model"operateReason" placeholder"备注"/> <el-inputv-model"operateReason":autosize"{ minRows: 5, maxRows: 5 }"type"textarea"placeholder"备注" />//css:deep(.el-input__w…

Mybatis框架详细总结

目录 一、概述 二、工作原理 三、特点 四、使用MyBatis的注意事项 五、MyBatis的适用场景 六、总结 MyBatis 是一个 Java 持久层框架&#xff0c;它通过配置文件和注解方式将接口与 SQL 语句绑定&#xff0c;从而实现对数据库的操作。以下是关于 MyBatis 的详细总结&…

Tips:VS2022提示MSB8040 此项目需要缓解了 Spectre 漏洞的库解决方法。

1&#xff0c;打开Visual Studio Installer 2、点击【修改】 3、选中【单个组件】&#xff0c;输入Spectre&#xff0c;下拉到【编译 工具和运行时】进行选择&#xff08;尽量寻找最新版本&#xff09;&#xff0c;然后点击【修改】进行安装&#xff08;如果VS2022没有关闭&…

PHP序列化总结2--常见的魔术方法

魔术方法的概念 PHP的魔术方法是一种特殊的方法&#xff0c;用于覆盖PHP的默认操作。它们以双下划线&#xff08;__&#xff09;开头&#xff0c;后面跟着一些特定的字符串&#xff0c;如__construct()、__destruct()、__get()等。这些魔术方法在对象执行特定操作时被自动调用…

山西电力市场日前价格预测【2023-12-31】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-31&#xff09;山西电力市场全天平均日前电价为445.23元/MWh。其中&#xff0c;最高日前电价为791.27元/MWh&#xff0c;预计出现在08:15。最低日前电价为270.52元/MWh&#xff0c;预计…

什么是SSL证书?在哪里免费申请?

随着互联网蓬勃发展&#xff0c;人们在日常生活中越来越依赖网络。然而&#xff0c;网络攻击和数据泄露日益猖獗&#xff0c;保护网站和用户信息的安全变得尤为紧迫。在这一背景下&#xff0c;SSL证书成为至关重要的安全措施。 SSL证书的首要功能在于防范网络攻击。相较于不安全…

MYSQL的UPDATE时锁表机制

&#xff08;笔记&#xff0c;只为获取流量券&#xff09; MySQL中&#xff0c;UPDATE 操作涉及到行级锁和表级锁的概念&#xff0c;具体取决于事务隔离级别和被更新的条件, 无索引的情况下&#xff1a; 当表没有索引的情况下&#xff0c;UPDATE 操作通常会涉及到表级锁。这是…

2023年末,软件测试面试题总结与分享

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备年后面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到…

Linux-权限

1.Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再 linux 系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在 linux 下做有限的事情。 超级用户的命令提示符是 “#” &#xff0c…

数字图像处理——亚像素边缘的轮廓提取

像素 像素是图像处理中的基本单位&#xff0c;一个像素是图像中最小的离散化单位&#xff0c;具有特定的位置和颜色信息。在数字图像中&#xff0c;每个像素都有一个特定的坐标&#xff0c;通常以行和列的形式表示。每个像素的颜色信息可以通过不同的表示方式&#xff0c;如灰…

MongoDB Certified Associate Developer 认证考试心得

介绍 前段时间通过了 MongoDB Associate Developer 考试&#xff0c;也记下了一些心得&#xff0c;结果忘记发出来了&#xff0c;现在重新整理下。通过考试后证书是这样的: MongoDB 目前有两个认证证书 1. MongoDB Associate Developer 认证掌握使用MongoDB 来构建现代应用…

苹果电脑Dock栏优化软件 mac功能亮点

hyperdock mac是一款Dock优化软件&#xff0c;hyperdock支持使用窗口自动排列功能&#xff0c;您可以直接通过将窗口拖拉至屏幕上方来快速最大化至全屏&#xff0c;又或者拖动到左右来进行左分屏和右分屏。而且Dock优化软件还有一个特色便是对Dock的强大管理哪里能力&#xff0…

《C++PrimerPlus》第13章 类继承

13.1 一个简单的基类 基类和派生类示例&#xff08;球会会员管理&#xff09; 头文件tabtenn1.h #ifndef __TABTENN1_H__ #define __TABTENN1_H__#include <iostream> #include <string>using namespace std;class TableTennisPlayer {private:string firstname;…

RS-485 RS-232 RS-422 区别和理解

RS-485&#xff0c;RS-232&#xff0c;RS-422区别和理解 目录概述需求&#xff1a; 设计思路实现思路分析1.概述2.区别 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a b…

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程&#xff1f; 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数&#xff08;输入参数&#xff0c;输出参数&#xff0c;输入输出参数&#xff09; 第一种&#xff1a;输入参数 第二种&#xff1a;输出参数 …

利用 IntelliJ IDEA 整合 GitHub 实现项目版本控制与协作管理

目录 前言1 设置GitHub登录账号2 将项目分享到GitHub3 IntelliJ IDEA 中导入Github项目4 往GitHub推送代码4.1 Commit Change&#xff08;提交到本地库&#xff09;4.2 Git -> Repository -> Push&#xff08;推送到远程库&#xff09; 5 拉取远程库代码到本地6 克隆远程…

Android MVC 写法

前言 Model&#xff1a;负责数据逻辑 View&#xff1a;负责视图逻辑 Controller&#xff1a;负责业务逻辑 持有关系&#xff1a; 1、View 持有 Controller 2、Controller 持有 Model 3、Model 持有 View 辅助工具&#xff1a;ViewBinding 执行流程&#xff1a;View >…

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch 安装 Nvidia 显卡驱动安装 CUDA安装 cuDNN安装 VSCode安装 Anaconda 并更换源在虚拟环境中安装 GPU 版本的 PyTorchReference 这篇博文主要介绍的是 Ubuntu22.04 系统中软件、显卡驱动、cuda、cudnn、pytorch 等软件和…

树莓派摄像头使用python获取摄像头内容将图片上传到百度云识别文字并将识别结果返回

要使用树莓派摄像头通过Python获取图像并将其上传到百度云进行文字识别&#xff0c;然后将识别结果打印到串口&#xff0c;可以按照以下步骤进行操作&#xff1a; 确保您已经在百度云的控制台上创建了一个文字识别应用&#xff0c;并获得了API Key和Secret Key。 在树莓派上安…

华为OD机试真题-最小矩阵宽度-2023年OD统一考试(C卷

题目描述&#xff1a; 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数。 输入描述&#xff1a; 第一行输入两个正整数N&#xff0c;M&#xff0c;表…