可执行二进制文件的形成过程与简单调试

摘要:
即替换宏指令并将文件包含到要编译的文件中,完成后将生成完整的C程序源文件。3) 汇编:汇编汇编语言文件,主要调用汇编处理程序完成汇编。汇编是生成二进制机器代码的过程。组装的文件以结尾。o、 其被称为对象文件。

1) 预处理:主要对源码预编译语句(如宏定义define)和文件包含进行处理。即对宏指令替换和包含文件放置到需要编译的文件中,完成后会生成完整的C程序源文件。

2) 编译:对预处理以后文件进行编译,生成.s后缀的汇编语言文件,即该文件里是汇编语言的代码,汇编是一种更底层的语言,直接对硬盘进行操作。

3) 汇编:对汇编语言文件进行汇编,主要调用汇编处理程序来完成汇编,汇编是生成二进制机器代码的过程,汇编后的文件以.o结尾,称为目标文件。

4) 链接:将多个由汇编生成的目标文件以及引用的库文件进行模块链接,生成一个完整的可执行文件,链接时,所有目标文件被安排在可执行程序的适当位置,同时程序调用的库函数也从各自所在的函数库链接到程序中。

 

下面演示C语言代码 如何转变成 可执行的二进制文件:

假如现在有段C语言源代码如下

可执行二进制文件的形成过程与简单调试第1张

 

对其进行预处理,处理后的文件如下图所示

gcc -E -o a.cxx a.c

可执行二进制文件的形成过程与简单调试第2张

 

 生成汇编代码

gcc -S -o a.s a.c

 可执行二进制文件的形成过程与简单调试第3张

 

生成目标文件

gcc -c -o a.o a.c

可执行二进制文件的形成过程与简单调试第4张

 

链接生成可执行文件

gcc a.c -o a.out

可执行二进制文件的形成过程与简单调试第5张

最后一个可执行文件就生成了

可执行二进制文件的形成过程与简单调试第6张

 

下面是gdb调试程序基本使用

可执行二进制文件的形成过程与简单调试第7张

 

 

写一个简单的c语言程序测试下

 可执行二进制文件的形成过程与简单调试第8张

生成debug文件

gcc -g -o a.debug hello.c

可执行二进制文件的形成过程与简单调试第9张

 

运行gdb,然后载入调试文件a.debug,list 查看源代码

可执行二进制文件的形成过程与简单调试第10张

 

break 设置断点,即运行到第几行,让程序暂停一下

可执行二进制文件的形成过程与简单调试第11张

 

info breakpoint 查看断点,删除断点用delete + Num

可执行二进制文件的形成过程与简单调试第12张

 

run 运行程序,如下图程序会在断点处暂停

 可执行二进制文件的形成过程与简单调试第13张

 

输入next 让程序继续运行一行,输入continue 让程序运行到下一个断点为止

可执行二进制文件的形成过程与简单调试第14张

 

在断点处可以打印或者操作变量,对排除bug非常有用,退出则按q键即可

可执行二进制文件的形成过程与简单调试第15张

其他高级的用法可以去查阅相关资料,这里就不一一细说了。

 

免责声明:文章转载自《可执行二进制文件的形成过程与简单调试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇W3C网页标准数据结构学习--Java删除二叉树节点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C嵌入汇编

注意事项:1.小心物理寄存器,如R0-R3,IP,LR,CPSR等,因为在计算时可能改变他们。2.不要使用寄存器代替变量。3.使用内嵌汇编无需保存和恢复寄存器。4.访问全局变量使用.IMPORT引入全局变量,用LDR和STR访问他们。在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的。在稍大规模的嵌入式...

Linux内核调试方法总结之backtrace

backtrace 【用途】用户态或者内核态程序异常退出时回溯堆栈信息 【原理】通过对当前堆栈的分析,回溯上层函数在当前栈中的帧地址,直至顶层函数。帧地址是指在栈中存在局部变量、上一级函数返回地址、寄存器值的内存空间。由于不同处理器堆栈实现不同(向上增长和向下增长),此功能的具体实现是编译器内建的__buildin_frame_address及__buil...

JAVA 内存详解 (理解 JVM 如何使用 Windows 和 Linux 上的本机内存)

理解 JVM 如何使用 Windows 和 Linux 上的本机内存 文档选项 打印本页 将此页作为电子邮件发送 样例代码 英文原文 级别: 中级 Andrew Hall, 软件工程师, IBM 2009 年 5 月 11 日 Java™ 堆耗尽并不是造成java.lang.OutOfMemo...

error: ‘for’ loop initial declarations are only allowed in C99 mode

比如写出下面这段程序: for (int i = 0; i < n; ++i) do_something(); 然后用gcc编译,会报‘for’ loop initial declarations are only allowed in C99 mode的错误。 原因是在循环条件中声明变量,只在C99标准中支持,C90标准不支持。 所以改成: int...

makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解

在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 例如:将两个文件led.c和crt0.S汇编文件,制作一个Makefile文件 1 1led.bin : crt0.S led.c 2 2 arm-linux-gcc -c -o crt0.o crt0.c 3 3 arm-linux-gcc -c...

linux应用之nginx的源码安装及配置(centos)

1、准备工作选首先安装这几个软件:GCC,PCRE(Perl Compatible Regular Expression),zlib,OpenSSL。Nginx是C写的,需要用GCC编译;Nginx的Rewrite和HTTP模块会用到PCRE;Nginx中的Gzip用到zlib;用命令“# gcc”,查看gcc是否安装;如果出现“gcc: no input...