首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个arm-none-eabi-gcc代码程序是如何在x86机器上运行的?

arm-none-eabi-gcc是一个用于ARM架构的嵌入式系统开发的GNU编译器套件。它可以将C、C++和汇编语言源代码编译为可在ARM处理器上运行的机器码。

在x86机器上运行arm-none-eabi-gcc代码程序需要使用交叉编译工具链。交叉编译工具链是一组工具,包括编译器、链接器和调试器,用于在一个平台上生成在另一个平台上运行的可执行文件。

以下是arm-none-eabi-gcc代码程序在x86机器上运行的大致过程:

  1. 安装交叉编译工具链:首先需要在x86机器上安装ARM架构的交叉编译工具链。这个工具链包括arm-none-eabi-gcc编译器和其他必要的工具。
  2. 编写代码:使用任何文本编辑器编写arm-none-eabi-gcc代码程序,该程序可以是C、C++或汇编语言。
  3. 编译代码:使用交叉编译工具链中的arm-none-eabi-gcc编译器,将arm-none-eabi-gcc代码程序编译为ARM架构的目标文件。命令类似于:arm-none-eabi-gcc -c program.c -o program.o
  4. 链接目标文件:使用交叉编译工具链中的链接器,将目标文件与所需的库文件链接在一起,生成可执行文件。命令类似于:arm-none-eabi-gcc program.o -o program.elf
  5. 转换为可执行文件格式:由于x86机器无法直接执行ARM架构的可执行文件,需要将其转换为x86架构可执行文件。可以使用工具如QEMU进行模拟运行,或者使用其他工具将其转换为x86可执行文件。

总结起来,arm-none-eabi-gcc代码程序在x86机器上运行的过程是通过交叉编译工具链将ARM架构的源代码编译为ARM目标文件,然后使用链接器将目标文件与所需的库文件链接在一起生成ARM可执行文件。最后,通过模拟运行或转换为x86可执行文件的方式在x86机器上运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Windows应用程序是如何在国产系统上运行的

对于这样的问题,很难用一句能或者不能回答。所以本文就尝试解释一下 Windows 应用程序是如何在国产系统上运行起来的,这样才能更好的回答朋友的问题。...Wine 是一个兼容层,能够在多个符合 POSIX 的操作系统(例如 Linux、macOS 和 BSD)上运行 Windows 应用程序。...项目地址: https://www.winehq.org Linux 是如何运行二进制程序的 在解释如何在 Linux 上运行 Windows 二进制程序之前,让我们先弄清楚如何运行普通的 Linux...小结 Wine(Wine Is Not an Emulator)是一个开源的兼容层,它允许 Windows 应用程序在 Linux 和其他类 Unix 操作系统上运行。...通过这些技术, Wine 能够在 Linux 上提供一个 Windows 兼容的运行环境,使得大多数 Windows 应用程序可以在 Linux 上运行,而无需修改程序代码。

8110

一次搞定 Arm Linux 交叉编译

程序的编辑——》编译——》运行,整个过程都是在一台 X86 电脑上。...程序最后运行的环境变了,比如你的开发板是基于 Arm 的——程序在 X86 上编辑,编译,最终运行在另一个和 X86 完全不同的架构的 Arm 芯片上。 ?...,无法给你提供一个在开发板上写代码、编译代码的环境。...但是这样有一个问题,X86、Arm、MIPS、RISC-V 这些芯片,它们的指令集是由不同的组织或者公司设计的,彼此并不兼容——Arm 和 MIPS 的 CPU 无法运行以 X86 的指令集编码的程序,...所以我们要在 X86 的电脑上编译出能够在 Arm 上运行的程序,我们必须明确告诉编译器,编译生成的可执行文件需要以 Arm 指令集的标准编码。

29.3K63
  • STM32高级开发——gcc-arm-none-eabi

    首先他是个软件这就不用多说了,做什么的软件呢?编译软件,或是准确点叫工具链。那么听起来是不是和keil、IAR感觉一样呢?我们是不是安装好他以后,打开获得一个界面导入代码就可以编译hex文件呢?...首先我们来看看他们的功能: 文本编辑器 编辑源代码文件,提供基础的文本编辑功能与语法加亮等功能。 编译器 编译与链接文件,使源代码文档可以转化为在单片机上执行的机器码格式文件。...我们可以看到的是,在商业化的软件如KEIL之流,他们把很完善的功能都集成在了一个带有界面的程序中,所以叫他们IDE即集成开发环境,固然这样很方便,对于很多新手或刚入职的工程师来说,这样的软件极大的简化了他们距离实际编写程序的距离...还有个检查的方法就是,使用指令查看当前系统PATH变量的值,查看是否PATH中是否有刚刚设置的路径: $ echo $PATH 1 实际上Ubuntu的软件源中是有gcc-arm-none-eabi...它的使用方法是,在终端中cd到工作目录,如编译当前目录下的hello.c文件,生成hello.o文件: arm-none-eabi-gcc -c hello.c 1 arm-none-eabi-g++

    1.4K30

    ODrive开发 #1 ODrive固件开发指南

    检查ODrive上的丝印以找出您使用的版本。 某些ODrive版本未指定电压:在这种情况下,您可以看一下电容器的值:120uF是48V ODrive,470uF是24V ODrive。...注意: 第二个USB接口始终是一个串行端口。 CONFIG_UART_PROTOCOL: 定义ODrive在UART接口(GPIO1和GPIO2)上应使用哪种协议。...测试脚本会使ODrive以高电流和高转速运行,因此,如果测试台不合适或者不够坚固(或电机空载),则可能会损坏机器。 用法示例:./run_tests.py --test-rig-yaml .....VSCode将从工作空间中获取正确的设置并自动连接ODrive。 可以在VSCode中以图形方式添加断点。 运行 make gdb。 这将重置并在程序启动并暂停。 现在,您可以设置断点并运行程序。...您可能需要让它下载一些驱动程序等。 STM32CubeMX现在可能具有某些库已经更新,因此即使我们未更改任何设置,生成的代码也可能有所更改。

    2.7K30

    配置CLion用于嵌入式开发

    所需环境 软件环境: STM32CubeMX(用于生成工程) Clion(编写代码) MinGW(编译C语言代码) OpenOCD(debug) arm-none-eabi-gcc(编译单片机上运行程序的编译器...,解压出来放到自己能记得住的合适位置即可 官网链接:https://gnutoolchains.com/arm-eabi/openocd/ 2.3 MinGW 下载MinGW程序,并进行解压,放到自己记得住合适的位置...接着重启电脑后,摁住win+R键输入cmd,在cmd控制台输入下方代码并回车,当输出结果如图所示就是成功了 gcc -v -E -x c++ - 2.4 arm-none-eabi-gcc 下载安装完成后记得勾选下方倒数的三个选项添加到环境变量中...2.5 clion 新建一个项目,选择路径后创建。....h上,摁住ctrl,点击鼠标左键;将修改为"";并添加以下代码 #include "lint.h" 鼠标放到8051.h上,摁住ctrl,点击鼠标左键,跳转到8051.h文件,添加以下代码: #

    1.5K20

    配置CLion用于嵌入式开发

    所需环境 软件环境: STM32CubeMX(用于生成工程) Clion(编写代码) MinGW(编译C语言代码) OpenOCD(debug) arm-none-eabi-gcc(编译单片机上运行程序的编译器...,解压出来放到自己能记得住的合适位置即可 官网链接:https://gnutoolchains.com/arm-eabi/openocd/ 2.3 MinGW 下载MinGW程序,并进行解压,放到自己记得住合适的位置...接着重启电脑后,摁住win+R键输入cmd,在cmd控制台输入下方代码并回车,当输出结果如图所示就是成功了 bash 代码: gcc -v -E -x c++ - 2.4 arm-none-eabi-gcc...-v 2.5 clion 新建一个项目,选择路径后创建。...8052.h上,摁住ctrl,点击鼠标左键;将修改为"";并添加以下代码 c 代码: #include "lint.h" 鼠标放到8051.h上,摁住ctrl,点击鼠标左键,跳转到8051.h文件

    21610

    在 CLion 中创建基于 CubeMX 的 STM32 工程

    CLion 确实是 Sugar 接触过的编程环境中比较好用的一个,本篇就来说一说如何在 Windows 上用 CLion 开发 STM32(基于 STM32CubeMX)。...一、OpenOCD 的安装 OpenOCD 的 Windows 版是解压就能用的。一共两个步骤: 1、解压到目标路径; 2、将 bin 加入到环境变量中。 ?...arm-none-eabi 系列是个 Window 的 *.exe 安装文件,Sugar 就是双击安装在默认位置的。 装好后要手动将 bin 的路径加入环境变量,如下: ?...2、STM32CubeMX 操作 这里与正常使用 STM32CubeMX 一样,只是有一点要注意:换芯片后要去覆盖原来自动生成的工程。 ? ? ? 3、配置 OpenOCD ? ? 4、写代码 ?...从使用体验上来说,CLion 与本文的各个组件配合之下感觉上完全不下于 IAR、MDK 的调试体验,而从编辑器角度讲的话简直甩 IAR、MDK 几条街。

    3.4K20

    HRT:使用Huge Pages进行低延迟优化

    我们将关注运行在64位X86硬件上的 Linux 操作系统,但是大多数观点也适用于其他体系结构。...操作系统将这些转换存储在一个称为页表的数据结构中,硬件也能理解这种数据结构。对于每个由真实内存支持的虚拟页,页表中的一个条目包含相应的物理地址。对于机器上运行的每个进程,页表通常是唯一的。...除非程序的分配器和/或操作系统设置为使用Hugepages,否则内存将由4KiB 页面支持。X86上的页表使用多个层次结构级别。...然后从这个数组中添加1.3亿个随机双精度数(完整的源代码在这里可以找到)。在第一次运行时,程序在数组中生成一个随机的索引列表,然后将它们存储在一个文件中。...随后的运行将读取该文件,因此在每次运行期间内存访问将是相同的。 我们在一台空闲的 Intel Alder Lake 机器上运行这个程序。

    71130

    Linux下开发stm32 ①

    这就要说到linux下的交叉编译了,因为我们要在PC机上编译出可以运行在ARM上的程序,使用gcc编译出的是在PC上运行的程序,所以我们要使用gcc-arm-none-eabi进行交叉编译~ 2.gcc-arm-none-eabi...Windows,Linux,MacOS上的交叉编译。...e-link,这个下载器使用CMSIS-DAP下载程序,同时并带有一个串口,非常好用~ ?...arm文件夹下的,因为truestudio使用的是gcc编译器,所以我们选择truestudio文件夹下的启动文件; stm32f10x.h:空文件; main.c:代码如下: #include "stm32f10x.h...~编译的时候有两种文件,一种是汇编启动文件,一种是c源文件,接下来分别编译: 首先需要说明一些编译任何一个文件都需要带上的参数: 参数 说明 -mthumb 表明使用的指令集(必需) -mcpu=cortex-m3

    3.4K31

    使用 CLion 实现 stm32F103 点亮 LED

    Clion 1.1 Clion简介 Clion 是一款专为开发C及C++所设计的跨平台IDE。它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。...CLion帮助开发人员使用智能编辑器来提高代码质量、自动代码重构并且深度整合CMake编译系统,从而提高开发人员的工作效率。...,是一个开源软件包,Windows版本下从这里下载 环境配置: 在Clion中配置OpenOCD和STM32CubeMX 点击File -> Setting 配置OpenOCD和STM32CubeMX.../open-source/gnu-toolchain/gnu-rm/downloads ,选择ZIP压缩包形式 解压到一个文件夹,并且将bin目录添加到环境变量 使用 arm-none-eabi-gcc...点击三个点,即可查看目录 修改st_nucleo_f103rb.cfg文件,注释掉第10行 添加代码,打开main.c,添加LED闪烁代码 编译前配置 进行编译 编译成功可见 烧录程序

    1.3K20

    arm(3)| 点亮led灯

    -Ttext 0x80000000 选项,设置程序代码段的起始地址为 0x80000000。...编译成功后会在当前文件夹下生成.bin 文件,这个.bin 文件也不能直接放到开发板上运行,这次是因为需要在.bin 文件缺少启动相关信息。这一部分暂时使用现成的脚本文件来添加,暂时不深究。...首先写一个启动文件start.S,这个启动文件用来设置栈指针,以及跳转到C代码的main函数中 .text .align 2 .global _start _start: ldr sp,=0x80001000...b main 然后写一个led.c文件,内容和汇编差不多,只不过这里是用指针的方式来写寄存器。...链接脚本的作用就是告诉编译器怎么链接这些文件,比如那个文件放在最前面,程序的代码段、数据段、bss段分别放在什么位置等等。注意"."后面有空格,否则会报错。

    1.3K21

    【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )

    一、 解释型语言 和 编译型语言 1、计算机程序本质 计算机 的 程序 是在 CPU 上执行的 , CPU 上执行的只有匹配该 CPU 的机器码指令 , 不同类型的 CPU 执行的 机器码指令 格式不同..., X86 和 ARM 执行的 机器码 指令格式是不同的 ; 机器码指令 是 二进制的 , 所有在 计算机 上执行的程序 , 都是 若干 二进制机器码 的集合 ; 计算机 只能执行 二进制机器语言 ,...CPU 架构 , 32 位 / 64 位 不同的内存寻址位数 , 如 : 我要编译一个在 x86 平台的 64 位 Windows 程序 , 这个程序只能在 CPU 是 Intel 并且 装有 64 位...Windows 程序 的电脑上运行 ; 这类程序只需编译一次 , 在之后运行时不需要再次编译 , 这类程序执行效率高 ; 编译型语言 与 特定平台相关 , 无法移植 到其他平台 , 如果要在 编译之后需要修改...; 4、解释器 分析 解释型语言 不需要 预先 将 程序源代码 编译成 机器码 , 而是在运行时 逐行解释并执行源代码 , 解释型语言 只要有相应的 解释器 , 就可以在任何平台上运行源代码 , 因此解释型语言

    13410

    Windows 下使用 ffmpeg 库

    第一步是在VS创建的工程中要选择使用x86还是使用x64。它们有什么区别呢?通俗的讲,x86是编译出的是32位系统可执行程序 ,而x64编译出的是 64位系统可执行的程序。...由于 Windows 是向下兼容的,所以你编译出的x86程序是可以跑在 64 位系统上的。相反如果你选择输出是x64的话,则它只能跑在64位系统上,在 32 位系统上是无法运行的。...但凡事儿有利有弊,如果你编译出的是x86程序,虽然它可以在x64位系统上运行,但它的运行速度要比编译出的x64程序运行的慢很多。...如果你的 ffmpeg 编译出的是 x86 的,在 VS 中也只能选择输出是x86程序。...编译好的 ffmpeg 有许多库文件,如libavutil, libavformat …,每一个库都有其特定作用。

    3.2K50

    arm-gcc各版本区别

    .赶紧查一下.明白了.我平时用是生成的执行文件是x86平台的.arm当然就是arm环境的.还有一种是linux的....从本质来讲他们都是编译器,而gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的0101二进制机器码。...这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。...举个例子 假设你在Linux系统编译生成了可执行文件,我们本意是要系统打开摄像头,但是如果你在window系统上运行可能就是打开相册。同样的可能这个可执行文件在ARM下面可能是关机。...不同系统的机器码含义是不一样的。所以你在linux系统下面写的代码要怎样才能在ARM系统上面跑呢。这就需要用到交叉编译。arm-linux-gcc是什么意思?

    3.4K20

    Tencent JDK 国产化CPU架构支持分享

    实际上,体系结构文件中的指令描述规定了如何用CPU的机器指令去匹配编译器的中间代码表示。...这部分工作决定了虚拟机能否在处理器上稳定运行。希望能引起大家的重视。 处理器内存模型存在强弱之分。强内存模型以X86为代表;弱内存模型以ARM和PowerPC架构为代表。...然而,我们在编程时,尤其是在并发程序设计时,可能需要禁止处理器的重排序行为。这时就需要借助处内存屏障来完成。所谓的“内存屏障”,是指处理器硬件支持的、专门用于禁止特定访存指令重排序的机器指令。...编译器在指令生成阶段需充分适配处理器的内存模型特性。下面的PPT展示的是C2编译器MemBarStoreStore中间节点,在X86架构和Aarch64架构上目标代码的生成情况。...MemBarStoreStore中间节点的语义是禁止处理器的写写重排序。由于X86的内存模型不允许写写重排序,故该中间节点在X86架构上无需生成额外机器指令即可保证语义正确。

    86720

    Tencent JDK 国产化CPU架构支持分享

    实际上,体系结构文件中的指令描述规定了如何用CPU的机器指令去匹配编译器的中间代码表示。...这部分工作决定了虚拟机能否在处理器上稳定运行。希望能引起大家的重视。 处理器内存模型存在强弱之分。强内存模型以X86为代表;弱内存模型以ARM和PowerPC架构为代表。...然而,我们在编程时,尤其是在并发程序设计时,可能需要禁止处理器的重排序行为。这时就需要借助处内存屏障来完成。所谓的“内存屏障”,是指处理器硬件支持的、专门用于禁止特定访存指令重排序的机器指令。...编译器在指令生成阶段需充分适配处理器的内存模型特性。下面的PPT展示的是C2编译器MemBarStoreStore中间节点,在X86架构和Aarch64架构上目标代码的生成情况。...MemBarStoreStore中间节点的语义是禁止处理器的写写重排序。由于X86的内存模型不允许写写重排序,故该中间节点在X86架构上无需生成额外机器指令即可保证语义正确。

    1.6K20

    WPF程序启动缓慢排查分享

    一、概要 场景是这样的,一个陌生的WPF应用程序跑在的win7操作系统上(有人可能会猜是win7的问题其实不然继续往下看)。运行的时候发现程序启动需要30秒,这种问题在生产环境中肯定是不被允许的。...二、详细内容 遇到这种问题我的第一反映是程序启动时有什么耗时操作,一个成熟的产品少则拥有几十万行的代码多则百万行这么多代码我们该如何在万军丛中精确的找到耗时的操作呢?...第一个阶段 这个时候使用VS自带的Profile功能跑一份报告看看究竟是哪里耗时(下面为示例,并不是真是项目源码运行跑出的数据)。...这个方法似乎没有奏效但是又有了新的收获,起码能感觉到很有可能不是代码的问题(这个地方其实还有一个类似的办法直接在客户机器上跑dnSpy反编译调试工具也可以这样可以在无法使用远程调试的情况下直接调试收集线索...这个时候查看关键信息如下: 操作系统版本 操作系统位数 电脑配置 应用程序编译的版本(x64、x86、AnyCPU) 这一步检查发现了最终的问题所在,程序编译的版本是x86版本跑在了只有4G内存的x64

    21130

    计算机基础(5)——编程语言与跨平台

    汇编语言的特点是:相对于机器指令而言,代码编写较为简单,程序被赋予了语义,对程序员较为友好,代码需要借助汇编器转换为机器指令,效率比机器指令略低。...如果需要将该hello程序运行在arm架构的CPU上,我们只需要安装arm架构的编译器,将该hello程序的源代码编译成符合arm架构的汇编指令,最终再由汇编器编译成arm架构的机器指令即可。...实际上,C语言编写的源代码程序想要在windows平台运行还要考虑到操作系统的因素,那么完整的说法应该是需要安装windows平台基于x86架构的编译器,才能在使用了x86架构的CPU并安装了windows...x86架构是由Intel和AMD两家公司主导的个人电脑和服务器市场的架构,而ARM架构则主要用于移动设备如智能手机和平板电脑。...实际上,x86_64,x64,AMD64基本上是同一个东西,我们现在用的intel/amd的桌面级CPU基本上都是x86_64,并且大都兼容x86。

    9531
    领券