【君正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
相关推荐
dessler20 分钟前
RabbitMQ-镜像队列(Mirrored Queues)
linux·运维·rabbitmq
瑾曦23 分钟前
Docker相关命令
linux
发抖吧小喵喵27 分钟前
rpm包直接安装新系统缺少依赖问题处理
linux·运维·服务器
码农101号1 小时前
Linux中Docker Swarm介绍和使用
linux·spring cloud·docker
Nazi61 小时前
dockerfile基础
linux·运维·docker·容器·云计算
所念皆为东辞1 小时前
elk部署加日志收集
linux·elk·elasticsearch·centos
TLucas2 小时前
Centos 7部署.NET 8网站项目
linux·nginx·postgresql·centos·.net
Doris_LMS6 小时前
在Linux下安装nginx(保姆级别)
linux·运维·nginx·centos
超級二蓋茨8 小时前
在 CentOS 上安装 FFmpeg
linux·ffmpeg·centos
obboda9 小时前
Linux基础复习:字符输入与输出
linux·运维·服务器