linux(二)

目录

Linux中文件编译运行过程介绍:

程序的编译链接过程

Linux系统上C程序的编译过程

Linux头文件与源文件之间的关系:

Make命令及makefile文件的编写(工程文件管理):

 第一步:编写add函数(add.c)

第二步:编写makefile文件,管理工程,实现自动化编译(.o)

GDB调试器

单进程、单线程基础调试命令

 多进程调试命令



Linux中文件编译运行过程介绍:

程序的编译链接过程

要想清楚程序的编译链接过程,前提你知道什么是可执行文件吗?

文件是一个外存的概念,文件只存在于“外存”(硬盘,u盘,网盘)中,文件由两部分构成,文件名和文件主体。文件的分类:可执行文件、不可执行文件

可执行文件:在Windows操作系统中,扩展名为:*.exe,*bat等的文件是可执行文件,可执行文件由指令和数据构成。Linux是靠文件属性来判断是否可执行。

不可执行文件:其内容是由数据构成。

 (图为借鉴)

预编译阶段:

a) 删除所有的“#define”,并且展开所有的宏定义;

b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;

c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;

d) 删除所有的注释;

e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;

f) 保留所有的#pragma 编译器指令,因为编译器需要使用它们。

编译阶段:

词法分析、语法分析、语义分析,代码优化,汇总符号。

汇编阶段:

将汇编指令翻译成二进制格式,生成各个 section,生成符号表

链接阶段:

 a) 合并各个 section,调整 section 的起始位移和段大小,合并符号 表,进行符号解析,给符号分配虚拟地址
 b) 符号重定位

Linux系统上C程序的编译过程

例如我们在这里写一个简单的helloworld程序,我们通过命令来对文件编译连接的过程进行演示和分析

第一步:创建一个普通文件test1103.c,并使用vim编辑器对它进行编辑,写下“你好”程序的C代码:

 第二步:对test1103.c进行预编译操作,输入命令:

gcc -E test1103.c -o test1103.i

 如图,生成了一个test1103.i文件,我们通过vim编辑器对这个文件进行查看:

 如图,是一些路径和一些C语言。

第三步:对test1026.i文件进行编译操作,输入命令:

gcc -S test1103.i -o test1103.s

 如图,生成了一个名为test1103.s的文件,按照上面对文件类型的介绍,这个文件中应该是将C语言翻译过后的汇编语言,我们通过vim编辑器对这个文件进行查看:

 如图红圈所示就是C语言翻译完之后的汇编代码。

第四步:对test1026.s文件进行汇编操作,输入命令:

gcc -c test1103.s -o test1103.o

 如图,出现了一个test1103.o的文件,我们通过vim编辑器对这个文件的内容进行查看:

 这就是二进制格式的.o文件内容,可以发现,这时的文件内容大致已经变成了机器码。

第五步:对test1026.0文件进行链接操作,输入命令:

gcc test1103.o -o main

如图生成了一个名为test1103的文件:

 这个test1103,就应该是按照步骤走的最终的可执行文件了,我们通过./命令,来执行当前目录下的test1103,检验一下它是否真的可执行,输入命令:

./test1103

 如图程序执行成功

Linux中,如果我们已经使用vim编辑器写好了程序,其实只需要一步就可以生成可执行程序,我们拿上面的文件举例子,只需要在编写好test1026.c这个文本文件后输入命令:

gcc -o test1103 test1103.c

这条命令可以直接输出最终的可执行文件。

Linux头文件与源文件之间的关系:

在之前的学习中,头文件分为系统头文件和自己编译的头文件,比如#include<stdio.h>是系统自带的头文件。

当我们写一个项目时,我们通常要讲个待实现的函数在头文件(.h)中进行声明,然后将头文件中声明的函数功能在对应的源文件(.cpp)中进行实现:

例如我们在Linux中进行文件编译时,就在头文件中进行函数的声明,再源文件中进行函数功能的具体实现,在这里我们写一个简单的两数相乘的函数在头文件中并在源文件中进行引用

头文件中的函数声明:

源文件中对头文件的引用:

 编辑运行,输入命令

gcc -o main main.c

 

运行结果:

 编译成功且程序成功运行

Make命令及makefile文件的编写(工程文件管理):

我们通过vim编写一个加法函数和一个乘法函数并且要在main.c文件中对这两个函数进行调用。

 第一步:编写add函数(add.c)

编写mul.c

在main.c程序中对add和mul函数进行调用:

第二步:编写makefile文件,管理工程,实现自动化编译(.o)

创建makefile文件,输入命令

touch makefile

 使用vim编辑器对makefile文件进行编辑,输入指令:

  1 all:main
  2 
  3 main:add.o mul.o main.o
  4     gcc -o main add.o mul.o main.o
  5 
  6 add.o:add.c
  7     gcc -c add.c
  8 mul.o:mul.c
  9     gcc -c mul.c
 10 main.o:main.c
 11     gcc -c main.c
 12 clean:
 13     rm -rf *.o main

如下所示:

 

保存退出后,使用make命令

结果为:

GDB调试器

GDB安装命令:sudo apt install gdb

Debug 版本
Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人
员,最常用的就是 debug 版本的可执行文件。
Debug 版本的生成:
因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生
成包含调试信息的中间文件。
gcc -c hello.c -g ---> 生成包含调试信息的中间文件
gcc -o hello hello.o
或者
gcc -o hello hello.c -g

单进程、单线程基础调试命令

 

 多进程调试命令

(gdb)set follow-fork-mode mode
mode 可以选择 parent 或者 child,即:选择调试那个进程。
注意:未被跟踪调试的进程会直接执行结束。
### 回答1: 《Linux进制分析》是一本介绍分析Linux进制文件的PDF文档。本书的目的是帮助读者了解Linux系统中进制文件的结构和内容,以及如何进行分析和调试。这本书按照逻辑顺序分为多个章节,每个章节探讨了不同的主题。 第一章介绍了进制文件的基础知识,包括进制文件的类型、结构和常见的文件格式。通过学习这些基础知识,读者可以对Linux进制文件有一个整体的了解。 第章讨论了在Linux系统中进行进制文件分析的工具和技术。这部分内容涵盖了命令行工具、调试器和反汇编器的使用方法,以及一些常见的进制文件分析技术。 第三章以一个实际的案例为例,介绍了如何通过分析进制文件来理解程序的功能和行为。这个案例涉及了静态分析和动态分析的技术,读者可以通过跟随案例学习如何应用这些技术。 第四章包含了一些高级的进制文件分析技术,如符号动态执行、模糊测试和漏洞挖掘等。这些技术需要一定的专业知识和经验,但对于希望深入了解Linux进制文件分析的读者来说,是非常有用的。 总的来说,这本《Linux进制分析》PDF为读者提供了系统而全面的关于Linux进制文件分析的知识。无论是初学者还是有经验的分析师,都可以从中获得有价值的信息和技巧。 ### 回答2: 《Linux进制分析PDF》是一本介绍Linux进制分析的电子书籍。通过对该书的阅读和学习,可以了解Linux操作系统中进制文件的结构、特性和功能。 首先,该书会详细介绍Linux进制文件的基本概念和核心组成部分。包括ELF(Executable and Linkable Format)格式的介绍,这是Linux系统中常见的进制文件格式。通过了解ELF格式,可以深入理解可执行文件、共享库和目标文件的结构和功能。 其次,该书会介绍ELF文件的各个节(section)和段(segment)。节是ELF文件中存储数据和代码的逻辑块,而段是指逻辑上相关的节的集合。了解节和段的细节对于进行进制分析非常重要,可以帮助我们理解程序的内部结构和运行机制。 此外,该书还会介绍动态链接(Dynamic Linking)和装载器(Loader)。动态链接Linux中的一种链接方式,通过将共享库与可执行文件动态地链接在一起,提高了代码的复用性和运行效率。装载器是Linux系统中负责将可执行文件加载到内存并执行的组件。了解动态链接和装载器的工作原理,可以帮助我们理解程序运行的整个过程。 最后,该书还会介绍一些常见的进制分析工具和技术。例如,调试器(Debugger)可以帮助我们追踪程序的执行过程和查找bug。反汇编器(Disassembler)可以将进制文件转换为可读的汇编代码。逆向工程技术可以帮助我们分析和修改进制文件中的代码。 总之,《Linux进制分析PDF》是一本系统介绍Linux进制分析的书籍,通过阅读和学习这本书,我们可以了解Linux进制文件的结构、特性和功能,以及进行进制分析的常见工具和技术。这对于提高我们对Linux操作系统的理解和应用开发能力非常有帮助。 ### 回答3: "Linux进制分析PDF" 是指一本关于Linux操作系统进制分析的书籍或电子文档。 Linux进制分析是指对Linux操作系统中的进制文件进行深入研究和分析的过程。这些进制文件包括可执行文件、库文件、驱动程序和内核等。通过对这些文件逐个解析和分析,我们可以更好地理解它们的结构和功能,并且能够更好地进行调试、优化和开发工作。 "Linux进制分析PDF" 这本书提供了关于如何进行Linux进制分析的详细指导和实践经验。它可能包括以下方面的内容: 1. 进制文件的格式:介绍进制文件的基本结构和格式,如ELF(Executable and Linkable Format)等。讲解进制文件中的各个段(section)和节(segment),以及文件头(header)和节头(section header)等信息。 2. 动态链接与装载:详细解释Linux中的动态链接和动态装载机制,如何解析和加载共享库,并将它们链接到可执行文件中。 3. 符号表与调试信息:讲解进制文件中的符号表和调试信息,包括函数和变量的符号名、地址和类型等。以及如何利用这些信息进行调试和反汇编工作。 4. 反汇编和反编译:介绍如何将进制文件转换成汇编代码,并进行反编译,还可以讲解一些常用的反汇编和反编译工具和技术。 5. 内核分析:讲解如何对Linux内核进行进制分析和调试,包括内核模块、系统调用和驱动程序等。 通过学习和掌握这本书的内容,读者可以更深入地了解Linux系统的底层实现和机制,并且可以开展更高级、更复杂的开发和调试工作。当然,理解和运用这些知识需要具备一定的编程和计算机系统知识基础。希望这本"Linux进制分析PDF"对想要深入学习Linux系统内部工作原理的读者有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值