Linux学习

C源文件需要经过预处理、编译、汇编、链接,生成可执行文件

gcc:

gcc 命令:用来编译C和C++文件-c 编译、汇编而不链接
-S 编译而不进行汇编和链接
-E 预处理
-v 同时显示编译器的代码
-o<文件> 将输出输入到指定文件
-x<语言> 指定语言
--help 显示帮助信息
--version 显示版本信息

 gcc  –E  hello.c  –o  hello.i //预处理,生成hello.i

预处理是将引用的头文件的代码加入到C语言代码中,并用实际值替换define定义的字符串,为的是能将hello更好地翻译成汇编语言。程序的预处理过程是将头文件的内容添加到程序里,所以会由原来的十几行变为三千多行。

 gcc  –S  hello.i  –o  hello.s //编译,生成hello.s

编译是由编译器将hello.i预处理文件翻译成hello.s编写文件的过程。其中,hello.s记录了c程序对应的汇编代码,从而便于机器识别,为下一步转换为机器代码做好条件。

gcc  –c  hello.s  –o  hello.o //汇编,生成可重定位目标代码

汇编器(as)将.s汇编语言翻译成为机器语言,在这个过程中,也可以将C程序中应用的库函数一起汇编,最终形成机器可识别的并运行hello.o可执行文件

 gcc  hello.o  –o  hello //链接,生成可执行目标代码

概念:链接是将各种代码和数据片段收集并组合称为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。

作用:主要的任务是符号解析和重定位。链接得到的可执行文件可以被加载到内存中运行。

 ./hello                         //执行hello目标文件

objdump -d hello.o > hello.o.asm //反汇编可重定位目标文件hello.o

objdump -d hello > hello.asm //反汇编可执行文件hello

分析:Hello的一生所经历的过程:第一步,预处理,将hello.c所有的头文件的相关代码合并成一个hello.i文件。第二步,编译,将hello.i或hello.c文件编译成汇编文件hello.s, c语言变成汇编语言.。第三步,汇编,将hello.s翻译成可重定位目标文件hello.o, 汇编语言加上机器代码。第四步,链接,将hello.o与库函数连接成可执行目标程序hello。第五步,Shell运行,在Shell中输入运行指令./hello运行出x+y=3。
 

 操作步骤:

gcc  –E  hello.c  –o  hello.i			//预处理,生成hello.i
gcc  -m32 –S  hello.i  –o  hello.s		//编译,生成hello.s,32位汇编代码
gcc  -m32 –c  hello.s  –o  hello.o		//汇编,生成32位可重定位目标代码
gcc  -m32  hello.o  –o  hello			//链接,生成32位可执行目标代码
./hello                        			//执行hello目标文件
objdump -d hello.o > hello.o.asm		//反汇编可重定位目标文件hello.o
objdump -d hello > hello.asm			//反汇编可执行文件hello

 gdb(调试):

gcc -g ./a.out       // -g 进行调试 a.out 自动生成的可执行文件
run 或者 r 运行程序
quit 退出gdb模式
list 查看我们的源代码
b 或者 break 打断点:
       函数的地方 函数名字
       在第几行打断点
info b 查看断点的情况
print 打印变量:
      arr[0]
      &arr[0]
step s 进去某一个具体的函数调试
shell 去掉我们终端的命令
日志功能
    set logging on
watchpoint
    观察变量是否变化
    info 来查看我们的watchpoint

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值