start_kernel是内核启动时比较重要的一个函数,然而我发现一个问题,我编译出来的目标文件中的汇编代码与C源码并不完全对应,这是怎么一回事呢? asmlinkage void __init start_kernel(void) { char * command_line; extern const struct kernel_param __start___param[], __stop___param[]; /* * Need to run as early as possible, t…
gcc编译C程序的总体流程如下图 用到的命令如下: .c---> .i gcc -E hello.c .c--->.s gcc -S hello.c .c--->.o gcc -c hello.c .c--->.out gcc hello.c .o反汇编 objdump -d hello.o 下面通过一个例子演示一下 首先建立一个hello.c和一个hello.h 然后使用第一条命令  gcc -E hello.c 预处理的文件内容特别多,截图只是部分内容. 然后查看汇编程序文件 …
调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错: Dyld Error Message:  Symbol not found: __ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv  Referenced from: /Library/Application Support/XXX.dylib (which was built for Mac…
原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇:      首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开. 例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换. 例如ifdef/ifndef就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理.这里面最复杂的莫过于include了,其…
编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是编译器呢?编译器的作用是什么呢?Javac又是如何进行工作的?下面我们一一来认识了解. 1 编译器(Compiler ) 简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序.一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (…
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",可以得到每个函数的调用次数,每个函数消耗的处理器时间,也可以得到函数的 "调用关系图…
linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就能够执行:在这个简单的命令后面隐藏了很多复杂的过程,这个过程包含了以下的步骤: ====================================================================================== 预处理: 宏定义展开,全部的#define 在这个阶段都会被展开 预编译命令的处理,包含#if #ifdef 一类的命令 展开#include 的文件,像上面h…
GCC简介    Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%.gcc编译器能将C.C++语言源程序.汇程式化序和目标程序编译.连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件. 在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行…
说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念.作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于"抽象语法树(AST)".但这仅仅是个开头而已.编译原理的使用,甚至能让我们利用JS直接写一个能运行JS代码的解释器. 项目地址:https://github.com/jrainlau/c... 在线体验:https://codepen.io/jrainlau/p... 一.为什么要用JS写JS的解释器 接触过小程序开发的同学应该知道,小程序运行的环境禁止n…
一.GCC编译过程 参考:http://hi.baidu.com/zengzhaonong/item/c00e079f500adccab625314f-------------------------------------    Pre-Processing   cpp        预处理    Compiling        ccl        编译    Assembling       as         汇编    Linking          ld         链接…
在Linux环境下进行开发,gcc是非常重要的编译工具,所以学习gcc的基本常见用法时非常有必要的. 一.首先我们先说明下gcc编译源文件的后缀名类型 .c为后缀的文件,C语言源代码文件:  .a为后缀的文件,是由目标文件构成的档案库文件:  .C,.cc或.cxx 为后缀的文件,是C++源代码文件:  .h为后缀的文件,是程序所包含的头文件:  .i 为后缀的文件,是已经预处理过的C源代码文件:  .ii为后缀的文件,是已经预处理过的C++源代码文件:  .m为后缀的文件,是Objective…
http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef _HELLO_H_ #define _HELLO_H_ void hello(); #endif test/src/hello.c #include "hello.h" #include <stdio.h> void hello() { printf("hello w…
GCC(GNU CompilerCollection,GNU编译器套装),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统采纳为标准的编译器,GCC同样适用于微软的Windows.GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布.GCC是Linux平台下最常用的编译程序,是Linux平台编译器的事实标准. 程序的编译过程 对于GUN编译器来说,程序的编…
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'错误?首先这是链接错误,不是编译错误,也就是…
这些常用的 gcc/g++ 命令行参数,你都知道么? 1. gcc -E source_file.c -E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. gcc -c source_file.c -c,只执行到编译,输出目标文件. 4. gcc (-E/S/c/) source_file.c -o output_filename -o, 指定输出文件名,可以配合以上三种标签使用. -o 参数可以被…
Gcc常用命令:         -c    仅对源文件进行编译,不链接生成可执行文件.常用于查错和只生成目标文件.     -o    经过gcc处理过后的结果保存在-o后面的文件中,可以是多种文件.如无参数,默认名称不同     -v    查看版本信息     -g    在可执行文件中加入调试信息,相当于Windows下的Debug版本.方便使用gdb进行调试     -O    对代码进行优化,默认即可,与-g不一起使用     -I, -U, -l, -static, -shared…
1,C程序编译步骤 C代码编译成可执行程序经过4步: 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3)汇编:将汇编文件生成目标文件(二进制文件) 4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去 2,gcc编译过程 1) 分步编译 预处理:gcc -E hello.c -o hello.i 编  译: gcc -S hello.i -o hello.s…
今天不小心把一个目标文件当成了可执行文件放到开发板上进行执行,结果出现了这样一个问题:./hello_qt: line 1: syntax error: word unexpected (expecting ")"),因为以前没有碰到过这事,一时间有点蒙,就是一个简单的hello world按道理不会有问题才对.于是google了一下,原来是一个小小的-c编译选项搞得鬼.顺带也扩展学习总结了一下. arm和pc上执行目标文件的区别 一般来说,gcc -c选项编译出来的目标文件是不可执行…
一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途. 目标文件是包含带有附加地址和值的助记符号的路线图.这些符号可以用来对各种代码段和数据段进行命名,包括经过初始化的和未初始化的.它们也可以用来定位嵌入的调试信息,就像语义 Web,非常适合由程序进行阅读. 编译器可以将我们在代码编辑器中创建的文本转换为目标文件.最初,目标文件被称为代码的…
四. ELF 文件格式分析 ELF文件(目标文件)格式主要四种: 可重定向文件: 文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 .a 和 .o 的文件) 可执行文件: 文件保存着一个用来执行的程序.(例如bash,gcc等) 共享目标文件: 共享库.文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接.(linux下后缀为 .so 的文件.) 执行文件的格式与上述两种文件的格式之间的区别…
4.5 String Table:字符串表 字符串表节区包含以 NULL( ASCII 码 0) 结尾的字符序列, 通常称为字符串. ELF 目标文件通常使用字符串来表示符号和节区名称. 对字符串的引用通常以字符串在字符串表中的下标给出. 一般, 第一个字节(索引为 0)定义为一个空字符串.类似的,字符串表的最后一个字节也定义为 NULL,以确保所有的字符串都以 NULL 结尾.索引为 0 的字符串在不同的上下文中可以表示无名或者名字为 NULL 的字符串. 允许存在空的字符串表节区,其节区头部…
二.ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可扩展性.可移植性等与文件格式的定义和文件加载过程紧密相关.研究可执行文件的格式对编写高性能程序和一些黑客技术的运用都是非常有意义的. 可执行链接格式 ( Executable and Linking Format)最初是由 UNIX 系统实验室 ( UNIX System Laboratories, U…
摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------…
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.1.2 符号解析与重定位 (1)重定位 在完成空间和地址的分配步骤之后,链接器就进入了符号解析和重定位的步骤,这是静态链接的核心部分. 先看看 a.o 的反汇编文件: objdump -d a.o: 程序代码里面都是使用的虚地址,main 起始地址为 0 ,这是因为在未进行空间分配之前,目标文件代码段中的起始地址以 0x00000000 开始,等到空间分配完成之后,各个函数才会确定自己在虚拟地址空间中的位置. 从反汇编来看,a.o 中定义了一个函数 main,这个函数占 0x55 个字节,共…
16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和解释器.其实用什么语言来实现编译器并不是最重要的部分(虽然Java也不是实现编译器最方便的语言),最初用啥语言都可以. 我在大学的时候,我们的软件工程和计算机科学的编译原理课的作业好像都是可以用Java来写的.反正我印象中我给这两门课写的作业都是用的Java. ===================…
文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个token,记录下他们所在文件的位置,以及丢掉不必要的信息.但是Tinymoe是一个按行分割的语言,自然token列表也就是二维的,第一维是行,第二维是每一行的token.在继续讲词法分析器之前,先看看Tinymoe包含多少token: 符号:(.).,.:.&.+.-.*./.\.%.<.>.…
1.3 GCC 工具 1.3.1 binutils 工具集 工具 描述 addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻译成源代码文件名和行号. ar 这是一个程序,可通过从文档中增加.删除和析取文件来维护库文件.通常使用该工具是为了创建和管理连接程序使用的目标库文档. as GNU 汇编器.实际上它是一族汇编器,因为它可以被编译或能够在各种不同平台上工作. c++filt 程序接受被 C++编译程序转换过的名字(不是被重载的) ,而且将该名字翻…
1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码.安装一些必须的模块,就可产生多种目标机器代码,而且可通过命令行选择一种希望使用的代码. 1.1.1 目标机 从网站 http://gcc.gnu.org/install/specific.html 可以得到有可能的最新目标机列表.在此站点中可找到更新过的目标机列表,以及向各种目标机进行移植的最新信息.关于每种可能的目标机都有一个简短介绍,可以查找说明…