首页 > 其他分享 >GCC Arm 11.3rel1, 12.2编译提示 _close is not implemented and will always fail

GCC Arm 11.3rel1, 12.2编译提示 _close is not implemented and will always fail

时间:2022-10-05 10:34:17浏览次数:62  
标签:GCC .. int always rel1 none 11.3 eabi arm

使用GCC Arm工具链开发的项目, 在11.2下编译正常, 但是升级到 arm-gnu-toolchain-11.3.rel1 以及 arm-gnu-toolchain-12.2 之后, 编译出现警告

/opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(libc_a-closer.o): in function `_close_r':
/data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/closer.c:47: warning: _close is not implemented and will always fail
/opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(libc_a-fstatr.o): in function `_fstat_r':
/data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/fstatr.c:55: warning: _fstat is not implemented and will always fail
/opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(libc_a-isattyr.o): in function `_isatty_r':
/data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/isattyr.c:52: warning: _isatty is not implemented and will always fail
/opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: /opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(libc_a-lseekr.o): in function `_lseek_r':
/data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/lseekr.c:49: warning: _lseek is not implemented and will always fail

这是因为使用了printf, 定义了 int _read(int file, char *ptr, int len)int _write(int file, char *ptr, int len)方法但是未定义其它方法所致.

一个完整的输入输出重定向需要包含以下函数, 把剩下的都补齐就不会提示警告了

int _isatty(int fd);
int _write(int fd, char* ptr, int len);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char* ptr, int len);
int _fstat(int fd, struct stat* st);

首先引入必要的头文件

#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>

然后是固定的方法


__attribute__((weak)) int _isatty(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 1;

    errno = EBADF;
    return 0;
}

__attribute__((weak)) int _close(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 0;

    errno = EBADF;
    return -1;
}

__attribute__((weak)) int _lseek(int fd, int ptr, int dir)
{
    (void)fd;
    (void)ptr;
    (void)dir;

    errno = EBADF;
    return -1;
}

__attribute__((weak)) int _fstat(int fd, struct stat *st)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
    {
        st->st_mode = S_IFCHR;
        return 0;
    }

    errno = EBADF;
    return 0;
}

_read 和 _write 是与底层硬件实现相关的, 需要自己实现对应的字符输入和输出


__attribute__((weak)) int _read(int file, char *ptr, int len)
{
    (void)file;
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        *ptr++ = __io_getchar();
    }
    return len;
}

__attribute__((weak)) int _write(int file, char *ptr, int len)
{
    (void)file;
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        __io_putchar(*ptr++);
    }
    return len;
}

标签:GCC,..,int,always,rel1,none,11.3,eabi,arm
From: https://www.cnblogs.com/milton/p/16755173.html

相关文章

  • gcc学习
    GCC在第二章学习gcc时,感觉还是有比较多的东西没有理解完全,在此写下博客,来接续总结归纳以下~编写模式-E:仅执行编译预处理
-S:将C代码转换为汇编代码
-c:仅执行编译操......
  • 1、升级到gcc 7.3高版本
    https://www.cnblogs.com/FengGeBlog/p/14919920.html 1、升级到gcc7.3:yum-yinstallcentos-release-sclyum-yinstalldevtoolset-7-gccdevtoolset-7-gcc-c++d......
  • Docker部署SQL Server 2019 Always On集群
    Docker部署Alwayson集群SQLServer在2016年开始支持Linux。随着2017和2019版本的发布,它开始支持Linux和容器平台上的HA/DR、Kubernetes和大数据集群解决方案。在本文中,我们......
  • Linux 开发环境搭建与使用——Linux 编译器之 GCC
    ​​上一节我们学习了vim编辑器​​,接下来我们一起学习gcc编译器,这里,我们要区分编辑器和编译器有何不同?编辑器是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不......
  • windows像linux般使用gcc,make等工具
    ​​需要安装MinGW编译器。​​MinGW是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程......
  • gcc小总结
    老师给出的优秀同学的总结,值得我们借鉴https://www.cnblogs.com/cqszxy2020/p/16728641.html附上本人对其的学习过程1.静态链接库2.动态链接库over......
  • always_ff、always_comb、always_latch 和 always
    always 是来自Verilog的主要进程类型,另一个是 initial 在模拟开始时运行一次.always_ff@(posedgeclk) :代表一个触发器(ff),该过程在时钟的每个上升沿被触发(执行)......
  • gcc入门
    目录1gcc编译流程(1)预处理(2)编译(3)汇编(4)链接2gcc常用选项3gcc编译多个程序4生成静态库5生成动态库(1)理解动态库(2)创建和使用动态链接库引用1gcc编译流程gcc编译程序主要......
  • 为什么gcc生成的目标文件没有包含源文件定义的符号
    一、问题当gcc的优化打开前后的效果不同时,可以通过gcc的-Q--help=optimizers查看在构建时gcc默认开启了哪些选项tsecer@harry:gcc-Q--help=optimizers-O1tsecer.c......
  • GCC简单使用
    GCC特性首先,GCC是一个可移植的编译器它可以运行在很多平台上,并且可以产生很多不同类型的处理器运行代码。除了支持个人电脑的处理器外还支持微控制器DSPs和64位的CPUs。G......