首页
学习
活动
专区
工具
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机器上运行。

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

相关·内容

一次搞定 Arm Linux 交叉编译

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

28.8K63

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.2K30
  • ODrive开发 #1 ODrive固件开发指南

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

    2.6K30

    配置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.4K20

    配置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文件

    16410

    在 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 机器运行这个程序

    70030

    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、解释器 分析 解释型语言 不需要 预先 将 程序代码 编译成 机器码 , 而是在运行时 逐行解释并执行源代码 , 解释型语言 只要有相应 解释器 , 就可以在任何平台上运行代码 , 因此解释型语言

    12210

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

    3.4K20

    WPF程序启动缓慢排查分享

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

    19430

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

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

    85420

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

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

    1.6K20

    C#加密技术分析

    把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码运行到哪里才解密哪里代码,黑客无法获得原始机器指令和内存完整性代码,由于是纯内存操作所以运行速度快..., 性价高保护手段,建议全加 代码加密(IL) 针对dotNet程序,保护IL代码:一种动态运行方法解密被保护代码。...把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码,执行之后再擦除代码运行到哪里才解密哪里代码,黑客无法获得原始中间语言指令和内存完整性代码,由于是纯内存操作所以运行速度快...代码虚拟化: 针对X86代码指将机器代码翻译为机器和人都无法识别的一串伪代码字节流;在具体执行时再对这些伪代码进行一一翻译解释,逐步还原为原始代码并执行。...这段用于翻译伪代码并负责具体执行程序就叫作虚拟机VM(好似一个抽象CPU)。它以一个函数形式存在,函数参数就是字节码内存地址。

    1.2K20

    C# 通过 probing 指定 dll 寻找文件夹

    在很大项目开发,会发现项目引用 dll 会很多,我想要按照不同功能,将不同 dll 放在不同文件夹 简单方法通过修改 App.config 文件指定文件夹,将文件移动到 abc\12 文件夹里面...,此时项目引用一个dll doubi.dll 这个项目运行时候输出文件有 lindexi.exe 和 doubi.dll 文件 这时需要将 doubi.dll 移动到文件夹 abc\12 里面...lindexi.exe abc\12\doubi.dll 打开 App.config 添加上面的代码就可以 如果有两个不同dll需要放在两个不同文件夹, walter.dll 需要放在 walter....exe.config 在输出文件夹找到 xx.exe.config 可以通过修改这个文件在编译之后修改 dll 寻找文件夹 如果对于 C++ dll 需要做特殊引用,如需要区分 x86 和 x64...请看 C# 如何在项目引用x86 x64非托管代码 不能直接添加一个 x86 文件和一个 x64 文件夹,通过 privatePath 同时指定文件夹方式

    77810
    领券