解决arm-none-eabi-gcc交叉编译helloworld程序segmentation fault 错误

2023-05-16

目标:在x86_64主机上(windows 10或ubuntu 20.04)上交叉编译arm架构的helloworld程序,然后通过scp将编译完的可执行文件传给树莓派4B,在树莓派上执行该程序。(树莓派运行的是官方32位Linux系统。)

1、执行arm-none-eabi-gcc test.c -o test报错

/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): in function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): in function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x24): undefined reference to `_write'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x24): undefined reference to `_lseek'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x24): undefined reference to `_read'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-abort.o): in function `abort':
abort.c:(.text.abort+0x10): undefined reference to `_exit'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_kill_r':
signalr.c:(.text._kill_r+0x1c): undefined reference to `_kill'
/home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /home/sunch/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_getpid_r':
signalr.c:(.text._getpid_r+0x4): undefined reference to `_getpid'
collect2: error: ld returned 1 exit status

2、在网上查找相关问题,解决方式是编译时添加--specs=nosys.specs

参考:https://www.freesion.com/article/1071345305/

所以编译命令改为 arm-none-eabi-gcc --specs=nosys.specs hello.c -o hello

这次可以成功编译,然后将生成的可执行文件scp到树莓派执行,报错:Segmentation fault

请添加图片描述

网上找到的解决方法都不适用:
1、segmentation fault 错误(运行一个简单的helloworld程序)
2、解决交叉编译产生的程序放到目标板上运行时出现Segmentation fault (core dumped)
3、嵌入式linux中遇到的segmentation fault问题

下面的网页解释了一部分原因,但是并没有解决问题:

https://www.coder.work/article/1516675

灵机一动,突然想到可能交叉编译器使用错误,arm-none-eabi从名字上就可以看出来是专门编译裸机程序的,可能不适合编译Linux应用程序。上网一查,果然,有专门交叉编译Linux应用程序的arm-linux-gnueabi-gcc。

3、解决方法:安装arm-linux-gnueabi-gcc工具链

在ubuntu上执行sudo apt install gcc-arm-linux-gnueabi就可以,在windows10上要下载:gcc-arm-10.3-2021.07-aarch64-arm-none-linux-gnueabihf.tar.xz (如果目标系统是arm32的),下载链接:https://developer.arm.com/downloads/-/gnu-a

使用新安装的交叉编译工具链重新编译程序,然后scp到树莓派执行,都可以正常执行,问题解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决arm-none-eabi-gcc交叉编译helloworld程序segmentation fault 错误 的相关文章

随机推荐

  • 《奔跑吧Linux内核(第二版)》第四章笔记

    内核配置 内核配置工具常见的有 xff1a make config make oldconfig make menuconfig 内核配置工具最终会在Linux内核源码的根目录下生成一个隐藏文件 config文件 xff0c 这个文件包含了
  • GDB+QEMU调试Linux内核

    1 使用qemu创建虚拟机 使用qemu创建ARM64架构虚拟机可以参考我的另一篇博客 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08 二 xff09 2 安装gdb multiarch工具包 span
  • centos7 HA

    本文以两台机器实现双集热备高可用集群 xff0c 主机名node1的IP为192 168 122 168 xff0c 主机名node2的IP为192 168 122 169 一 安装集群软件 必须软件pcs xff0c pacemaker
  • 《奔跑吧Linux内核(第二版)》第五章笔记

    Linux内核采用宏内核架构 xff0c 即操作系统的大部分功能都在内核中实现 xff0c 比如进程管理 内存管理 进程调度 设备管理等 xff0c 并且都在特权模式下 xff08 内核空间 xff09 运行 而与之相反的另一种流行的架构是
  • 交叉编译内核模块

    本实验在x86环境中交叉编译ARM64架构模块 xff0c 然后qemu启动ARM64架构虚拟机 xff0c 加载该模块运行 1 创建ARM64虚拟机 详见 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08
  • Linux内核模块相互调用

    编写一个内核模块A xff0c 通过导出模块符号的方式来实现接口函数 编写另一个内核模块B xff0c 调用内核模块A暴露出来的接口函数 1 源文件 内核模块A xff08 test A c xff09 span class token m
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x
  • LXC容器相关论文笔记

    段赫 基于LXC容器资源优化的研究与实现 2016 一 绪论 容器虚拟化技术 传统虚拟化技术 xff0c 实现一个虚拟机就意味着需要消耗了硬件资源来在底层系统上虚拟一个新的操作系统 xff0c 所以除了传统模拟硬件的虚拟化技术 xff0c
  • fork和clone系统调用小实验

    实验一 xff1a 使用fork 函数创建一个子进程 xff0c 然后在父进程和子进程中分别使用printf语句来判断谁是父进程和子进程 fork 函数被调用后会立即创建一个子进程 xff0c 子进程和父进程同时独立运行互不干扰 返回值 x
  • 【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor

    背景 以往对多核实时操作系统的研究主要集中在多核处理器上任务集的可调度性和响应时间分析 同时 xff0c 许多研究人员声称 xff0c 在不久的将来 xff0c 高端嵌入式系统还将包括高性能并行应用程序 xff0c 以支持复杂的任务 xff
  • 树莓派4B内核打RT-preempt实时补丁的实现

    硬件环境 xff1a 树莓派4B 操作系统 xff1a 树莓派版Ubuntu server 20 04 LTS xff08 64bit xff09 1 依赖环境的安装 运行如下命令 xff1a span class token functi
  • RT-Preempt笔记

    基于Zynq平台的Linux实时性研究及在数据采集中的应用 马啸 嵌入式实时系统研究现状 实时操作系统专门用于在时间约束条件下运行时间关键的应用程序 用于操作处理实时任务所需的最坏情况执行时间 xff08 Worst Case Execut
  • Mac上vmware fusion装的ubuntu不能与主机复制粘贴的问题

    解决方法一 xff1a 安装vmware tools 依次点击 xff1a 虚拟机 gt 安装vmware tools 会在ubuntu桌面上出现vmware tools xff0c 双击打开 解压tar gz包 xff0c 执行解压命令t
  • ceph的一些优化

    最近一直在忙着搞Ceph存储的优化和测试 xff0c 看了各种资料 xff0c 但是好像没有一篇文章把其中的方法论交代清楚 xff0c 所以呢想在这里进行一下总结 xff0c 很多内容并不是我原创 xff0c 只是做一个总结 如果其中有任何
  • Ubuntu 20.04使用qemu搭建ARM64 Linux系统

    1 安装所需依赖 span class token function sudo span span class token function apt get span span class token function install sp
  • GCC 编译选项总结

    c 只激活预处理 编译 和汇编 也就是他只把程序做成obj文件 例子用法 gcc span class token operator span c hello span class token punctuation span c 他将生成
  • 常见排序算法 Python实现

    冒泡排序 span class token keyword def span span class token function bubbleSort span span class token punctuation span lst s
  • GCC 编译优化等级

    参考资料 xff1a Using the GNU Compiler Collection 打开优化标志会使编译器尝试以牺牲编译时间和调试程序的能力为代价来提高性能和 或代码大小 根据目标和 GCC 的配置方式 xff0c 在每个 O 级别启
  • 树莓派4B开机自动发微信报告ip地址

    方法的实现基本基于博主虚宇宸轩的 实现 树莓派开机自动向微信发消息报告ip地址 xff08 无第三方代理 xff09 xff0c 具体原理和操作过程 xff0c 请参考该博主的文章 xff0c 写得很详细 xff0c 原理解释的也很清楚 本
  • 解决arm-none-eabi-gcc交叉编译helloworld程序segmentation fault 错误

    目标 xff1a 在x86 64主机上 windows 10或ubuntu 20 04 上交叉编译arm架构的helloworld程序 xff0c 然后通过scp将编译完的可执行文件传给树莓派4B xff0c 在树莓派上执行该程序 xff0