arm gcc 编译选项

news/2024/4/17 1:01:54

文章目录

  • 1. 前言
  • 2. 背景
  • 3. arm gcc 编译选项
    • 3.1 -marm 和 -mthumb
  • 4. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 背景

本文记录开发过程中遇到的各种值得记录的 arm gcc 交叉编译器选项,将会持续更新。

3. arm gcc 编译选项

3.1 -marm 和 -mthumb

某天编写了简单程序:

int main(void)
{int i = 3 + 5;return 0;
}

编译:

arm-linux-gnueabihf-gcc -o test test.c

出于某种目的,反汇编看了下代码:

arm-linux-gnueabihf-objdump -D test > test.S
/* 我们只看 main() 函数部分,这样容易对应到前面的代码 */
000103a0 <main>:103a0: b480       push {r7} // 2 字节 thumb 指令103a2: b083       sub sp, #12103a4: af00       add r7, sp, #0103a6: 2308       movs r3, #8103a8: 607b       str r3, [r7, #4]103aa: 2300       movs r3, #0103ac: 4618       mov r0, r3103ae: 370c       adds r7, #12103b0: 46bd       mov sp, r7103b2: f85d 7b04  ldr.w r7, [sp], #4 // 4 字节 arm 指令103b6: 4770       bx lr

啥情况?既有多条 2 字节的 thumb 指令,还有 1 条 4字节的 arm 指令!原来,根据编译器的默认配置,编译器会默认生成某种模式(thumb 或 arm)指令。那怎么查看这个默认配置呢?答案是通过查看 gcc 编译器 --verbose 选项输出结果中的 --with-mode= 配置项:

$ arm-linux-gnueabihf-gcc --verbose
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/bill/Work/Private/qemu-lab/arm-ubuntu/tool/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/5.3.1/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/snapshots/gcc-linaro-5.3-2016.02/configure SHELL=/bin/bash --with-bugurl=https://bugs.linaro.org --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libstdcxx-pch --disable-libmudflap --with-cloog=no --with-ppl=no --with-isl=no --disable-nls --enable-c99 --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-multilib --enable-multiarch --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/sysroots/arm-linux-gnueabihf --enable-lto --enable-linker-build-id --enable-long-long --enable-shared --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran,lto --enable-checking=release --disable-bootstrap --with-bugurl=https://bugs.linaro.org --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/tcwg-x86_64-ex40/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 5.3.1 20160113 (Linaro GCC 5.3-2016.02)

我们看到,这个交叉编译器的 --with-mode=thumb 的配置为 thumb ,所以默认情况下,该交叉编译器将生成 thumb 指令(也肯能夹有 arm 指令)。要改变这种行为,第1种途径是编译交叉编译器的时候,改变 --with-mode= 配置;第2种途径是,通过 -marm 编译选项,来指示编译器来生成 arm 指令。还是前面的测试代码,我们看用 -marm 选项 编译后的结果:

$ arm-linux-gnueabihf-gcc -marm -o test test.c
$ arm-linux-gnueabihf-objdump -D test > test.S
000103a0 <main>:103a0: e52db004  push {fp}  ; (str fp, [sp, #-4]!)103a4: e28db000  add fp, sp, #0103a8: e24dd00c  sub sp, sp, #12103ac: e3a03008  mov r3, #8103b0: e50b3008  str r3, [fp, #-8]103b4: e3a03000  mov r3, #0103b8: e1a00003  mov r0, r3103bc: e24bd000  sub sp, fp, #0103c0: e49db004  pop {fp}  ; (ldr fp, [sp], #4)103c4: e12fff1e  bx lr

哈,现在我们的代码全部使用 arm 指令了。当然,也可以通过 -mthumb 来指示编译器生成 thumb 指令

4. 参考资料

https://gcc.gnu.org/onlinedocs/


https://www.xjx100.cn/news/344583.html

相关文章

外包没有前途的,已经被替换了....

我25岁的时候&#xff0c;外包测试&#xff0c;薪资13.5k&#xff0c;人在深圳。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。假设以我为界限&#xff0c;25岁一线城市13.5k&#xff0c;那22-24大部分情况下是…

哈希表(散列表)详解

&#x1f495;**今天的每一秒都是珍贵的&#xff0c;因为它永远不会再次出现。**&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f386; &#x1f697;本文章主要内容&#xff1a;深入理解哈希表&#…

让input框只输入英文

解决扫码枪在中文输入法时扫码冲突 扫码枪在扫完码时会自动回车&#xff0c;这时如果是中文输入法就会触发输入法联想&#xff0c;再加一个回车&#xff0c;那么input框输入的就成中文了。如果可以控制input框只能输入英文那就好了。css有一个属性&#xff08;ime-mode&#xf…

session反序列化漏洞

文章目录 前提知识php代码session_startsession.upload_progress.enabledsession.use_trans_sidphp.ini中Session配置 初步复现原理案例 无$_SESSION变量赋值案例&#xff1a;Jarvis-PHPINFOpoc1.html改流量包 前提知识 php代码 <?php error_reporting(0); ini_set(sessi…

面试问题汇总

最近面试了几家公司&#xff0c;对问到的问题汇总一下。 Unity 是左手坐标系还是右手坐标系? 这个题靠记忆答的答错了&#xff0c;是左手坐标系。 大拇指指的方向是X轴&#xff0c;食指指的方向是Y轴方向&#xff0c;中指指的方向Z轴方向。 场景中游戏物体Activity为false,G…

github push

几个地方收集来&#xff0c;一个可行的&#xff0c;包括坑。方便大家使用 GitHub常见操作&#xff1a;生成ssh公钥&#xff0c;clone&#xff0c;push_选择ssh方式,用户需要在计算机中生成ssh keys,用来从github中push或pull 生成_大王我亲自来巡山的博客-CSDN博客 GitHub中c…

Chapter5: SpringBoot与Web开发2

接上一篇 Chapter4: SpringBoot与Web开发1 10. 配置嵌入式Servlet容器 SpringBoot默认采用Tomcat作为嵌入的Servlet容器&#xff1b;查看pom.xml的Diagram依赖图&#xff1a; 那么如何定制和修改Servlet容器的相关配置? 下面给出实操方案。 10.1 application.properties配…

微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题

前言 博主自己在22年夏天根据课程要求做了一个小程序连接阿里云服务器的案例&#xff0c;在最近又碰到了相应的需求。 原参考文章&#xff1a;微信小程序 Node连接本地MYSQL_微信小程序nodejs连接数据库_JJJenny0607的博客-CSDN博客 ,还请多多支持原作者&#xff01; 第二次…