【君正T31开发记录】12.编译工具相关总结及介绍

移植交叉工具包的时候,发现这是很多工具的集合包;以及写makefile的时候,也需要了解下这些工具的作用及用法,这里总结记录一下常见的工具及相关用法。

  1. g++
    C++编译器,用于编译C++源代码文件,这个很常见,不多介绍
  2. gcc
    C编译器,用于编译C源文件
  3. gdb
    调试器,命令行调试工具,用于调试C/C++程序
  4. ar
    用于创建、修改和提取归档文件的工具(指打包静态库)。归档文件(一般指静态库)通常包含多个目标文件,可以用ar将其打包成一个文件,如:
bash 复制代码
ar rcs lib.a file1.o file2.o
  1. ld ldd
    ld链接器,用于将目标文件和库文件链接在一起,生成可执行文件或者库文件;
    如:
bash 复制代码
ld -o a.out file1.o file2.o

ldd显示可执行文件或者库文件依赖的动态库有哪些,防止因为动态库拷贝少了导致的运行问题,但是这个不检查动态库版本之类的信息,需要自己小心。

  1. readelf elfedit

readelf读elf信息,包括elf文件头、程序头、符号表、动态库链接信息等;elfedit用来修改elf header信息,包括header显示的版本、编译平台、执行平台等

如:

  1. execstack
    用于设置或者清除elf可执行文件的栈执行权限,这个在现代操作系统上一般没有,因为现代操作系统上禁用栈执行权限。禁用栈执行权限可以避免栈溢出攻击;现代操作系统的一般有栈保护机制,如栈金丝雀
  2. c++filt
    用于解码符号名;编译器会对函数名和变量名进行修饰,c++filt可以将修饰后的变量或者函数名还原成原本的名字;这个一般在gdb调试、或查看符号表的时候可以用。
  3. as
    汇编器,将汇编语言编译成机器目标语言,编译过程 预处理-编译-汇编-链接过程中的汇编起始就是as实现的,单独使用as:
bash 复制代码
 as -o output.o output.s
  1. addr2line
    将程序地址转换成文件名和行号,比如linux上程序core dump掉以后,可以设置打印寄存器,pc寄存器一般就是当前执行的位置,根据这个地址,使用addr2line可以获取到文件和行号,当然这要求程序的符号表还存在,没有被strip掉
bash 复制代码
addr2line -e a.out 0x4005d6
  1. nm strip strings
    nm用于显示目标文件、可执行文件或者库文件中的符号表;strip用于从目标文件、可执行文件或者库文件中去掉符号表、调试信息等;strings用于从二进制文件中提取字符串,一般是程序文本段的const字符、符号表等
  2. randlib
    用于生成静态库的索引表,便于连接器快速找到库中的符号,按理说是可以加快使用静态库的时候的程序执行速度的。
bash 复制代码
ranlib lib.a
  1. gcov
    代码覆盖率分析工具,编译的时候需要添加选项-fprofile-arcs -ftest-coverage -lgcov,这样,在执行完程序以后,会生成代码覆盖率的文件,使用gcov对代码覆盖率生成报告文件
  2. gprof
    性能分析工具,编译的时候需要添加 -pg选项,执行以后会生成.out文件,使用gprof对分析文件.out和可执行文件一起分析得到一个函数耗时和执行次数的统计预报文件
  3. cpp
    C文件的预处理器,展开#include #define等预处理信息
bash 复制代码
cpp main.c -o main.i
  1. objcopy objdump

    objcopy用于复制和转换目标文件的格式,用来提取段信息、修改头信息等;objdump用于显示目标文件的详细信息,包括反汇编代码、符号表、节头表等。

  2. prelink

    预链接共享库,减少程序执行时间。将执行时的符号解析提前到链接阶段,以减少程序运行时的动态链接开销。

bash 复制代码
prelink a.out
相关推荐
陈陈CHENCHEN2 分钟前
【Linux】Rsync + Inotify 实时文件同步案例
linux·运维·服务器
charlie11451419129 分钟前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
Hoxy.R1 小时前
银河麒麟 V10 离线安装 s3cmd 踩坑记录+存储负载均衡测试
linux·运维·华为·存储
rGzywSmDg1 小时前
如何在Dev-C++中选择TDM-GCC编译器
linux·jvm·c++
Irissgwe1 小时前
九、Linux信号机制(二)
linux·进程·可重入函数·volatile·sigchld信号·进程信号
野熊佩骑1 小时前
一文读懂Nginx 之 Ubuntu使用apt方式安装Nginx官方最新版本
linux·运维·服务器·nginx·ubuntu·http
闫记康2 小时前
Linux学习day3
linux·服务器·学习
皆圥忈2 小时前
Linux 进程管理从入门到实战(一)
linux
雪度娃娃2 小时前
Asio——socket的创建和连接
linux·运维·服务器·c++·网络协议
剑神一笑2 小时前
Linux tar 归档命令深度解析:从文件打包到压缩算法的完整实现
linux·运维·服务器