1.3.13 nlmconv nlmconv 将可重定位的对象文件(Infile)转换为 NetWare 可加载模块(outfile),并可选择读取头文件信息获取 NLM 头信息. 选项,描述 -I bfdname --input-target=bfdname 指定源文件得格式为 bfdname -O bfdname --output-target=bfdname 使用对象格式bfdname编写输出文件. nlmconv 根据输入格式推断输出格式,例如对于 i386 输入文件,输出格式为 nlm…
1.3.7 gprof:性能分析工具 参考文档:https://www.cnblogs.com/andashu/p/6378000.html gprof是GNU profile工具,可以运行于linux.AIX.Sun等操作系统进行C.C++.Pascal.Fortran程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解决.通过分析应用程序运行时产生的 "flat profile",可以得到每个函数的调用次数,每个函数消耗的处理器时间,也可以得到函数的 "调用关系图…
一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途. 目标文件是包含带有附加地址和值的助记符号的路线图.这些符号可以用来对各种代码段和数据段进行命名,包括经过初始化的和未初始化的.它们也可以用来定位嵌入的调试信息,就像语义 Web,非常适合由程序进行阅读. 编译器可以将我们在代码编辑器中创建的文本转换为目标文件.最初,目标文件被称为代码的…
1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码.安装一些必须的模块,就可产生多种目标机器代码,而且可通过命令行选择一种希望使用的代码. 1.1.1 目标机 从网站 http://gcc.gnu.org/install/specific.html 可以得到有可能的最新目标机列表.在此站点中可找到更新过的目标机列表,以及向各种目标机进行移植的最新信息.关于每种可能的目标机都有一个简短介绍,可以查找说明…
2.2 语法分析 语法分析器(Grammar Parser)将对由扫描器产生的记号进行语法分析,从而产生语法树(Syntax Tree).整个分析过程采用了上下文无关语法(Context-free Grammar)的分析手段. 由语法分析器生成的语法树就是以表达式(Expression)为节点的树.如下所示: 从图中可以知道,整个语句就是一个赋值表达式:赋值表达式的左边是一个数组表达式,右边是一个乘法表达式:数组表达式又由两个符号表达式组成,等等.符号和数字是最小的表达式,它们不是由其他表达式来…
1.3 GCC 工具 1.3.1 binutils 工具集 工具 描述 addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻译成源代码文件名和行号. ar 这是一个程序,可通过从文档中增加.删除和析取文件来维护库文件.通常使用该工具是为了创建和管理连接程序使用的目标库文档. as GNU 汇编器.实际上它是一族汇编器,因为它可以被编译或能够在各种不同平台上工作. c++filt 程序接受被 C++编译程序转换过的名字(不是被重载的) ,而且将该名字翻…
1.3.18 readelf:elf 文件格式分析工具 这个工具和 objdump 命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖 BFD 库( BFD 库是一个 GNU 项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件): ELF 文件类型 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自最早在 System V 系统上…
4.1.2 符号解析与重定位 (1)重定位 在完成空间和地址的分配步骤之后,链接器就进入了符号解析和重定位的步骤,这是静态链接的核心部分. 先看看 a.o 的反汇编文件: objdump -d a.o: 程序代码里面都是使用的虚地址,main 起始地址为 0 ,这是因为在未进行空间分配之前,目标文件代码段中的起始地址以 0x00000000 开始,等到空间分配完成之后,各个函数才会确定自己在虚拟地址空间中的位置. 从反汇编来看,a.o 中定义了一个函数 main,这个函数占 0x55 个字节,共…
二.编译 引用文档:https://blog.csdn.net/chdhust/article/details/9040647 编译过程就是把预处理完的文件进行一系列词法分析.语法分析.语义分析及优化后生成相应的汇编代码文件,这个过程是整个程序构建的核心部分,也是最复杂的部分之一. 现在版本的 GCC 把预编译和编译两个步骤合并成一个步骤,使用 cc1 的程序来完成这两个步骤. 编译过程一般分为 6 个步骤:扫描.语法分析.语义分析.源代码优化.代码生成和目标代码优化,过程如下图: 2.1 词法…
Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello.s 汇编,生成目标文件(.o文件):gcc –c hello.s –o hello.o 链接,生成可执行文件:gcc hello.o –o hello 一.预处理 预编译程序读出源代码,对其中内嵌的指示字进行响应,产生源代码的修改版本,修改后的版本会被编译程序读入. 在 GNU 术语中,预处理程序叫…
4.5 String Table:字符串表 字符串表节区包含以 NULL( ASCII 码 0) 结尾的字符序列, 通常称为字符串. ELF 目标文件通常使用字符串来表示符号和节区名称. 对字符串的引用通常以字符串在字符串表中的下标给出. 一般, 第一个字节(索引为 0)定义为一个空字符串.类似的,字符串表的最后一个字节也定义为 NULL,以确保所有的字符串都以 NULL 结尾.索引为 0 的字符串在不同的上下文中可以表示无名或者名字为 NULL 的字符串. 允许存在空的字符串表节区,其节区头部…
四. ELF 文件格式分析 ELF文件(目标文件)格式主要四种: 可重定向文件: 文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 .a 和 .o 的文件) 可执行文件: 文件保存着一个用来执行的程序.(例如bash,gcc等) 共享目标文件: 共享库.文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接.(linux下后缀为 .so 的文件.) 执行文件的格式与上述两种文件的格式之间的区别…
二.ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可扩展性.可移植性等与文件格式的定义和文件加载过程紧密相关.研究可执行文件的格式对编写高性能程序和一些黑客技术的运用都是非常有意义的. 可执行链接格式 ( Executable and Linking Format)最初是由 UNIX 系统实验室 ( UNIX System Laboratories, U…
原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名其妙的执行到前面的语句去了,有时又执行到后面的语句,有时一次执行几条语句.后来查了下资料.原来这是编译时的优化问题所导致的. 因为内核的编译是使用make命令的,所以要更改优化等级的话,只能修改makefile文件了. 在makefile中,找到CFLAGS   然后在这加上-O0选项即可. 当然这…
假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include <stdio.h> int main() { int day, month, year, sum, leap; printf("input year month day:\n"); scanf("%d%d%d",&year,&month,&day); switch(month) { case 1: sum = 0; break; case 2: s…
GCC编译器是一个非常强大和流行的C编译器,适用于各种Linux发行版.本文解释了一些流行的GCC编译器选项. GCC编译器选项 1.指定输出可执行文件名称 在最基本的形式中,gcc编译器可以用作: gcc main.c 上述命令执行完整的编译过程并输出名为a.out的可执行文件. 使用选项-o,如下所示,指定可执行文件的输出文件名. gcc main.c -o main 上面的命令会产生一个名为“main”的输出文件. 2.启用通过-Wall选项设置的所有警告 该选项启用GCC中的所有警告.…
Linux(本例以Ubuntu18.04为例)安装GCC编译器 一.安装 安装命令:sudo apt-get  build-dep  gcc 遇到 您希望继续执行吗? [Y/n] y 直接输入y回车即可 一直到安装并设置完成再次回到命令操作行 二.测试下GCC编译命令 1.编写一个简单的HelloWorld程序保存为HelloWorld.c #include<stdio.h> int main() { printf("Hello World!"); ; } 2.GCC命令编…
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. 实际上 MinGW 并非一个 单纯的C/C++ 编译器,而是一套 GNU 工具集合.除开 GCC 以外,MinGW 还包括有一些其它的 GNU 程序开发工具 (比方 gawk bison 等等). 开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows…
最早是使用VC++工具来学习C++,学的越多就越对VC挡住的我看不见的东西好奇,总想多接触一些开发环境,今日抽空摸索了一下CodeBlocks这个开源的IDE使用方法,配置的编译器是MinGW的gcc编译器,gcc编译多字节集的字符还没什么问题,但遇到宽字符,发现编译不通过,经过多方查找,发现gcc对宽字符的支持分规则同我用熟了的cl编译器有一些区别,具体用法如下: GNU   C/C++编译器gcc也可以正确支持wchar_t字符和字符串,但是源代码的保存格式必须符合下面条件:        …
由于vc6.0对c语言编译不是很好,有些语句是正确的,但是编译却不能通过 所以决定在windows中安装gcc编译器来使用! http://www.cnblogs.com/cryinstall/archive/2011/08/27/2280827.html 感谢上面这篇文章解决我的问题: 主要步骤去官网下载这个程序,可能开始比较慢,但是下载下来也比较小 下载地址:https://sourceforge.net/projects/mingw/files/latest/download?source…
参考资料:http://www.cnblogs.com/dfcao/p/csapp_intr1_1-2.html 在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件hello.c,并把它翻译成一个可执行文件 hello. 这个翻译过程可分为四个阶段逐步完成:预处理,编译,汇编,链接,如下图所示. 逐步做下简单分析: 在未编译前,hello.c 的源…
1.gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译 2.gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字 3.为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是…
很多Linux的爱好者都很熟悉GCC编译器,但是对面初学者,如何去学习GCC使用GCC ,很多人都是直接在电脑上装一个虚拟机,这样不仅安装麻烦,而且占用了很多电脑资源,今天我来教大家如何在Win7使用GCC编译器. 工具/原料   GCC安装包 EditPlus 3 编辑器,当然 记事本也可以但个人推存EditPlus 3 方法/步骤   1 双击GCC安装包,mingw-get-setup.exe,点击Install安装 2 点击Change选择安装路径,尽量不要有中文和空格, 3 将pack…
你安装一个名字叫做build-essential的软件包,就可以一次将编译器.make工具.所有的编程头文件.函数库等东东全部安装上,其中也包括gcc编译器,这是非常稳妥的安装方式,安装命令是用root用户身份执行:apt-get install build-essential…
ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目标代码在使用兼容ABI的系统中无改动的运行.ABI是比API更接近硬件的一层接口,可以理解为对机器码的一层接口, 不同的指令集(ISA),ABI肯定是不同的,ABI在linux中也是有规范的,称为Linux Standard Base(LSB),ELF,glibc,kernel都有相应的规定. 所以…
一.使用交叉编译器编译 1.安装交叉编译工具链 2.导出环境变量 [ubuntu @tmp]$ export PATH=$PATH:/usr/local/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/bin/aarch64-poky-linux //导出编译工具链的路径 [ubuntu @tmp]$ export CC="aarch64-poky-linux-gcc -march=armv8-a -mtune=cortex-a57.cortex-a5…
导语 GCC(GNU Compiler Collection,GNU 编译器套件) 是由 GNU 开发的编程语言编译器,支持C.C++.Objective-C.Fortran.Java.Ada和Go语言等多种预言的前端,以及这些语言的库(如libstdc++.libgcj等等),它是以 GLP 许可证所发行的自由软件,也是 GNU 计划的关键部分.GCC 原本作为GNU操作系统的官方编译器,现已被大多数类 Unix 操作系统(如Linux.BSD.Mac OS X 等)采纳为标准的编译器,GCC…
[gcc编译步骤] 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [编译器参数详解] 编写Makefile时,下列编译器参数是赋给CFLAGS的. 例如: CFLAGS = -mmcu=$(MCU) CFLAGS += -DDebug CFLAGS += -DFFD …… -x language filename 设定…
[简介] GCC是Linux下的编译工具集,是GNU Compiler Collection的缩写,包含gcc g++ 等编译器.GCC工具集不仅能编译C/C++语言,其他例如Object-c.Pascal.Fortran.Java.Ada等语言进行编译.GCC在可以根据不同的硬件平台进行编译,即能进行交叉编译,在A平台上编译B平台上的程序,支持常见的X86.ARM.PowerPC.mips等,及Linux.windows等软件平台.C语言的编译命令为gcc,C++的编译命令为g++. [头文件…
GCC编译器(GNU C Compiler)是GNU组织的一款开源 编译器,它是Linux环境下的默认C语言编译器.它处理能够高效的编译C语言以外,还可以编译其他语言.并且,现在的GCC已经不光包括编译器本身,还包含了编译过程中的工具链. 1 GCC编译流程 在学习使用GCC编译程序之前,首先要知道编译C程序的基本流程,一般情况下分为下面四步: (1) 对C语言进行预处理,生成*.i文件. (2) 将上一步生成的*.i文件编译生成汇编语言文件,后缀名为*.s (3) 将汇编语言文件*.s经过汇编…