• GCC部分编译选项解析


    1. -mthumb 和 -mthumb-interwork

    "-mthumb”的意义是:使用这个编译选项生成的目标文件是Thumb指令的,目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb-2的。

    相对应的,“-marm“的意义是,使用编译选项生成的目标文件是ARM指令的。

    注意,不同编译器对该选项是否默认开启是不一样的,实际测试的结果如下:

    arm-none-eabi-gcc (20160919) 为Cortex-m4编译,(-mcpu=cortex-m4),不加-mthumb选项,提示“target CPU does not support ARM mode”(Cortex-M处理器只支持Thumb指令,包含16位和32位);

    arm-none-eabi-gcc (20191025) 为Cortex-m4编译,(-mcpu=cortex-m4),不加-mthumb选项,可以顺利通过编译。

    "-mthumb-interwork ”编译选项生成的目标文件就是thumb的,但是可以被其他的ARM的目标文件交叉调用。

    一般如果工程中需要一部分文件目标文件编译为ARM指令,一部分目标文件编译为Thumb指令时, 可以在这两部分的编译选项中都加入"-mthumb-interwork”选项,这样就可以在后面将这两部分链接为一个可执行文件,例如:

    arm-elf-gcc -mthumb-interwork -marm -c arm.c -o arm.o 
    arm-elf-gcc -mthumb-interwork -mthumb -c thumb.c -o thumb.o 
    arm-elf-gcc -mthumb-interwork arm.o thumb.o -o a.out

    2.-mfloat-abi=softfp 和 -mfloat-abi=hard

    该选项指定了浮点运算的实现方式,用软件计算还是硬件计算。实际使用中需要根据硬件特性(是否支持硬件浮点单元)以及链接的Lib库(包括libc,libm等)类型进行选择,如果不匹配链接时会出现"VFP register arguments"错误(VFP=Virtual Float Point,虚拟浮点运算)。

    如果不加以指定,默认使用-mfloat-abi=softfp 软件浮点方式。

    3. -fno-builtin  

    -fno-builtin用于解决当用户自定义的函数与C语言的内建函数(C库函数)冲突的问题。当用户自定义的函数与内建函数冲突时,若在gcc的编译选项中加上-fno-builtin时,则表示不使用C语言的内建函数

    对于有些函数不想用内建函数,而其他的某些函数还是希望使用内建函数时的场景,那么可以使用 -fno-builtin-function 选项,其中的function就是冲突的函数名,例如-fno-builtin-printf。

    4.  --wrap=

    这是一个链接器(LD)选项,其作用是将某个函数进行重定向,例如指定--wrap=printf 选项,那么所有调用printf的地方都会被重定向到__wrap_printf函数;注意__wrap_printf函数需要重新实现,否则会出现链接错误。另外__wrap_printf不需要另外声明,只需要有printf函数的声明即可。

  • 相关阅读:
    qemu-kvm磁盘读写的缓冲(cache)的五种模式
    关于追踪qemu 源码函数路径的一个方法
    准备升大三啦
    关于Vim的一个配置文件
    POJ 3253
    hihocoder 第二十五周 spfa 最短路
    POJ 2718 穷举
    《鸟哥Linux私房菜基础学习篇》命令索引
    博文流
    《SDN核心技术剖析和实战指南》3.3读书笔记
  • 原文地址:https://www.cnblogs.com/DF11G/p/14555826.html
Copyright © 2020-2023  润新知