GNU Tools使用笔记

这篇具有很好参考价值的文章主要介绍了GNU Tools使用笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GCC命令选项

优化控制选项

选项 作用
-Og 优化调试体验

告警选项

-Wall选项

作用:使能所有的警告。

调试程序的选项

-g选项

作用:生成操作系统原生格式的调试信息,GDB能够与这些调试信息协同工作。

-gdwarf-version选项

作用:生成DWARF格式的调试信息。
示例:-gdwarf-2。

控制输出类型的选项

-c选项

作用:指示编译器仅编译或汇编源文件,但不进行链接操作。默认情况下,生成文件名为源文件的后缀‘.c’、‘.i’、‘.s’等替换为‘.o’。
示例:gcc -c main.c将生成main.o,或gcc -c main.c -o main.o。

-x language选项

作用:为输入文件指定语言,语言的可能值包括:c、c++、objective-c、objective-c++、assembler、assembler-with-cpp等。

-specs=file选项

作用:在编译器读取标准 ‘specs’ 文件之后处理该文件。
示例:-specs=nano.specs。
newlib-nano 是 newlib C 标准库的一个优化版本,针对微控制器和资源受限环境进行了裁剪和优化,减少了代码大小和内存占用。当编译器在链接阶段使用 -specs=nano.specs 选项时,它会遵循该文件中的指令来选择正确的库版本(即 newlib-nano 版本),以及可能应用其他与性能优化相关的链接设置。

预处理器选项

-M选项

作用:生成源文件的依赖关系,包含了该源文件所有的依赖,默认会发送到标准输出(stdout)。
示例1:在ubuntu中,新建如下main.c、main.h、head1.h、head2.h文件。
main.c文件:

#include <stdio.h>
#include "main.h"

void main(void)
{
    printf("Hello word!\r\n");
}

main.h文件:

#include "head1.h"
#include "head2.h"

head1.h、head2.h都是空的头文件。
在控制台执行gcc -M main.c命令,输出如下。

user@ubuntu:~/*path*$ gcc -M main.c 
main.o: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/bits/long-double.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h \
 /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
 /usr/include/x86_64-linux-gnu/bits/libio.h \
 /usr/include/x86_64-linux-gnu/bits/_G_config.h \
 /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
 /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h main.h head1.h head2.h

-MM选项

作用:生成源文件的依赖关系,不包含标准系统头文件的依赖,默认会发送到标准输出(stdout)。
示例:同示例1代码。
在控制台执行gcc -MM main.c命令,输出如下。

user@ubuntu:~/*path*$ gcc -MM main.c 
main.o: main.c main.h head1.h head2.h

-MD选项

作用:生成源文件的依赖关系,包含了该源文件所有的依赖,输出到一个.d后缀的文件中。
示例:同示例1代码。
在控制台执行gcc -MD main.c命令,将在同级目录生成main.d文件,该文件的内容和-M选项输出的内容一致。

-MMD选项

作用:生成源文件的依赖关系,不包含标准系统头文件的依赖,输出到一个.d后缀的文件中。
示例:同示例1代码。
在控制台执行gcc -MMD main.c命令,将在同级目录生成main.d文件,该文件的内容和-MM选项输出的内容一致。

-MF选项

作用:用于指定生成依赖关系文件的名称。
示例:gcc -c -MMD -MF name.d main.c

-MP选项

作用:生成源文件的依赖关系,为每个头文件生成一个伪目标,这将避免删除了头文件而没有更新”Makefile“导致make出错的情况。
示例:同示例1代码。
在控制台执行gcc -c -MMD main.c -MP命令,执行结果如下。
main.d文件

main.o: main.c main.h head1.h head2.h

main.h:

head1.h:

head2.h:

假如我们在main.c中删除了main.h头文件相关的代码,但是我们没有重新生成main.d文件,在执行make时将不会报错。

链接选项

-T script选项

作用:使用脚本作为链接器脚本。
示例:-TDemo.ld

-Wl,option选项

作用:将option作为一个选项传递给链接器,多个选项用逗号隔开。
示例:-Wl,-Map,output.map或者-Wl,-Map=output.map。将“-Map output.map”传递给链接器。

ARM处理器相关的选项

-mcpu=name[+extension…]选项

作用:此选项用于指定目标ARM处理器的名称。
示例:-mcpu=cortex-m3

-mthumb 与 -marm选项

作用:生成在ARM状态或Thumb状态下执行的代码。
示例:-mthumb

AS命令选项

-Wa选项

作用:传递给汇编器(assembler)的选项前缀,其后的汇编器参数必须用逗号相互分隔。
示例:gcc -c -g -O -Wa,-alh,-L file.c

-a[cdghlmns]选项

作用:生成list文件。
示例:gcc -c main.c -Wa,-a,-ad,-alms=main.lst -o main.o

-a[cdghlmns]
    Turn on listings, in any of a variety of ways:
    以多种方式开启listings功能:

    -ac omit false conditionals // 忽略无效条件分支
    -ad omit debugging directives // 忽略调试指令
    -ag include general information, like as version and options passed // 包含一般信息,如汇编器版本和传递的选项
    -ah include high-level source // 包含高级源代码信息
    -al include assembly // 包含汇编代码
    -am include macro expansions // 包含宏展开内容
    -an omit forms processing // 忽略表格处理形式
    -as include symbols // 包含符号信息
    =file
        set the name of the listing file // 设置listing文件的名称

    You may combine these options; for example, use -aln for assembly
    listing without forms processing.  The =file option, if used, must
    be the last one.  By itself, -a defaults to -ahls.
	这些选项可以组合使用;例如,使用 `-aln` 来获取不包含表格处理形式的汇编代码列表。
	如果使用`=file` 选项,它必须是最后一个选项。单独使用 `-a` 默认等同于 `-ahls`

LD命令选项

-l namespec选项

作用:将namespec添加到链接文件列表中。
示例1:ld -o output /lib/crt0.o hello.o -lc。-lc指libc.a标准链接库。
示例2:gcc -o my_program my_program.c -lm。-lm指libm.a标准数学库。
-lnosys:避免链接错误。当链接时,如果某些系统调用或者标准C库函数在目标环境中并未实现,添加 -lnosys 参数可以让链接器链接到一个特殊的库,这个库提供了一个空实现(noop stubs)来代替那些未实现的函数。

–cref选项

作用:生成详细的交叉引用表(Cross Reference Table)。
GNU Tools使用笔记,GNU,linux

–gc-sections选项

作用:启用对未使用输入段的垃圾回收功能,通过符号和重定位来决定哪些段被使用。–no-gc-sections将不执行此垃圾回收操作。

二进制使用工具

objcopy工具

-O bfdname选项

作用:指定输出文件的二进制文件格式(Binary File Descriptor,BFD)。bfdname 是目标文件格式的名称,如 binary、ihex等。
示例1:objcopy -O binary -S input.elf output.bin
示例2:objcopy -O ihex input.elf output.hex

objdump工具

-d选项

作用:显示来自输入文件的机器指令对应的汇编助记符。汇编助记符(Assembly Mnemonic)是指在汇编语言中,用于代表特定机器指令的易于记忆的英文单词或缩写。

-S选项

作用:显示源代码与反汇编混合的内容,该选项隐含了-d选项。

参考文献

[1] Using the GNU Compiler Collection For gcc version 9.2.1 (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
[2] Using as The gnu Assembler (GNU Tools for Arm Embedded Processors 9-2019-q4-major) Version 2.33.1
[3] The GNU linker ld (GNU Tools for Arm Embedded Processors 9-2019-q4-major) Version 2.33.1
[4] The gnu Binary Utilities (GNU Tools for Arm Embedded Processors 9-2019-q4-major) Version 2.33.1 October 2019文章来源地址https://www.toymoban.com/news/detail-787236.html

到了这里,关于GNU Tools使用笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

    gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中,gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明: 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具,可以帮助学习者深入了解 Linux 系统的运作方式。通过使用 gdb,学习

    2024年02月07日
    浏览(62)
  • linux下i2c调试神器i2c-tools安装及使用

    在嵌入式linux开发中,有时候需要确认i2c硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。 i2c-tools是一个专门调试i2c的开源工具,可获取挂载的设备及设备地址,还可以读写I2C设备寄存器。调试新的

    2024年04月26日
    浏览(36)
  • Linux Bash Shell 脚本入门(2)——GNU

    ​ 目录 Linux Bash Shell 脚本入门(2)——GNU GNU与Linux GNU GNU的组成 Shell GNOME桌面环境 X Window 软件 GNOME 可点击内容,大部分来自维基百科,可以点击了解详情。 GNU操作系统起源于GNU计划,由理查德·斯托曼在麻省理工学院人工智能实验室发起,希望发展出一套完整的开放源代码

    2024年02月19日
    浏览(36)
  • 探秘GNU/Linux Shell:命令行的魔法世界

    GNU/Linux的Shell是一种特殊的交互式工具,为用户提供了强大的控制和管理Linux系统的方式。在这个博客中,我们将深入了解Shell的基本概念、功能以及不同类型的Shell。 Shell的核心是命令行提示符,它是用户与Linux系统进行交互的媒介。通过命令行提示符,用户可以输入文本命令

    2024年02月19日
    浏览(40)
  • 嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

    目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”:语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明:section  七、属性声明:aligned  C语言标准的发展过程: ● KR C. ● ANSI C. ● C99. ● C11. 指定初始化结构体成员:         和数组类似,

    2024年02月08日
    浏览(51)
  • Linux和其他类Unix系统的GNU coreutils 知多少

    GNU coreutils是GNU项目的一部分,它是一组基本的命令行工具集,用于操作和管理Linux和其他类Unix系统中的文件和数据流。这些工具被广泛用于终端和脚本中,提供了许多常用的功能和实用程序。Linux和其他类Unix系统的GNU coreutils 知多少?了解它有助你熟悉常用的linux命令。 官网

    2024年02月11日
    浏览(42)
  • Linux系统下的程序调试工具——GDB(GNU Debugger)

    GCC(GNU Compiler Collection)是GNU开发的编程语言编译器,它支持多种编程语言,如C、C++、Objective-C、Fortran、Ada和Go等。 以下是一些常用的操作: 启动GDB并加载程序 设置断点 在代码中的某一行设置断点,当程序运行到这一行时,GDB会暂停执行。 例如,如果你在 main.c 文件的第

    2024年04月13日
    浏览(50)
  • 关于使用mmcv时解决ImportError: /xx/mmcv/_ext.cpython-39-x86_64-linux-gnu.so: undefined symbol: _ZN2at4**的方法

    近期在医学图像分割验证模型性能工作中,需要安装mmcv,但是有报错 中间过程中由于一开始安装的mmcv版本不同,这里报错无法识别的符号也不一样。 在网上找了很多可能解决问题的方法,但是也没有顺利解决,同时也遇见 这类报错。 这类问题可能说明mmcv的版本和已经安装

    2024年04月27日
    浏览(34)
  • 基于 Debian GNU/Linux 12 “书虫 “的Neptune 8.0 “Juna “来了

    导读 Neptune Linux 发行版背后的团队发布了 Neptune 8.0,作为这个基于 Debian 的 GNU/Linux 发行版的重大更新,它围绕最新的 KDE Plasma 桌面环境构建。 Neptune 8.0 被命名为 “Juna”,是在Neptune 7.5 发布 11 个月后发布的,也是这个基于 Debian 稳定分支的 GNU/Linux 发行版的第一个版本,整

    2024年02月14日
    浏览(42)
  • 交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

    AArch64 是随 ARMv8 ISA 一起引入的 64 位架构,用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。,而不能执行 A32 或 T32 指令。但是,与 AArch32 中不同,在64位状态下,指令可以访问 64 位和 32 位寄存器。 aarch64-linux-gnu-gcc 是一个交叉编译工具链,可

    2024年04月14日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包