gcc编译

.o与.obj区别:

没有太大区别,都是2进制文件
win下的.obj,linux下是.o

gcc编译流程:

预处理:	展开头文件/宏替换/去掉注释/条件编译 
编译:将预处理后的文件转换成汇编语言(编译器做)
汇编:汇编转机器码,生成.s(汇编器做)
链接:连接目标代码,即.o(链接器做)

gcc常用命令:

-E	只激活预处理,	生成.i
-S	只激活预处理和编译	生成.s
-c	只激活预处理,编译,和汇编		生成.o
-o	制定目标名称,gcc默认的目标名是 a.out	生成a.out

-C 	预处理的时候, 不删除注释信息
-g 	只是执行编译器,并在编译的时候,产生调试信息。
-ggdb	生成 gdb 的可以使用的调试信息
-static	禁止使用动态库,直接可以运行
-share	尽量生成动态库,需要连接动态库再执行


-pipe	使用管道代替编译中临时文件:
gcc -pipe -o hello hello.c 

-ansi 	使用c++98标准去编译代码

-O0 、-O1 、-O2 、-O3
编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。

-include filename 相当于在代码中使用 #include<filename>
gcc hello.c -include /root/myfun.h 

-I	指定头文件路径
-l	指定链接的库
-L	指定链接的库文件路径

-w		不生成警告信息。
-Wall	生成所有警告信息。

动态库与静态库

静态库:.so
动态库:.a

编译:	静态库(全部)载入可执行程序。
汇编:	汇编转机器码。
链接:	动态库(需要的)载入可执行程序。

目标文件和可执行文件(.o与a.out区别)

结构和内容相似,因此跟可执行文件采用同一种格式存储。

目标文件:	(windows的COFF  Linux的.o)
源代码编译后未进行链接的中间文件。(.c变.o)

常见的可执行文件格式主要有:
Windows 的 PE(Portable Executable)
Linux 的 ELF(Executable and Linkable Format)
都是通用目标文件格式(COFF,Common Object File Format)的变种。

在 Windows 下,目标文件文件(COFF文件)和可执行文件(PE文件)统称为 PE-COFF 文件。
Linux 统称为 ELF 文件。

linux默认生成的a.out原因:	Unix 最初使用的a.out。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.版本 2 .局部变量 段, 段, , "0" .局部变量 表目录, 表目录, , "0" .局部变量 现行位置 .局部变量 段数 .局部变量 段内存地址, , , "0" .局部变量 段占用文件大小 .局部变量 代码入口地址 .局部变量 表的数量, 整数型 .局部变量 计次, 整数型 .局部变量 计次2, 整数型 .局部变量 代码段地址, 整数型 .局部变量 文件对齐度 .局部变量 DOS数据, 字节集 .局部变量 首选装载地址, 整数型 .局部变量 控制台程序, 逻辑型 现行位置 = 取字节集数据 (文件, #整数型, #MZ头长度 - 3) + 1 ' DOS数据 = 取字节集中间 (文件, #MZ头长度 + 1, 现行位置 - #MZ头长度 - 1) .如果真 (取字节集数据 (文件, #整数型, 现行位置) ≠ #PE署名) 返回 () .如果真结束 现行位置 = 现行位置 + 2 段数 = 取字节集数据 (文件, #短整数型, 现行位置) 重定义数组 (段, 假, 段数) 重定义数组 (段内存地址, 假, 段数) 现行位置 = 现行位置 + 32 代码入口地址 = 取字节集数据 (文件, #整数型, 现行位置) 代码段地址 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 4 首选装载地址 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 4 文件对齐度 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 28 控制台程序 = 取字节集中间 (文件, 现行位置, 2) = { 3, 0 } 现行位置 = 现行位置 + 24 表的数量 = 取字节集数据 (文件, #整数型, 现行位置) 重定义数组 (表目录, 假, 表的数量) .计次循环首 (表的数量, 计次) 表目录 [计次].地址 = 取字节集数据 (文件, #整数型, 现行位置) 表目录 [计次].大小 = 取字节集数据 (文件, #整数型, 现行位置) .计次循环尾 () .计次循环首 (段数, 计次) ' 段 [计次].名称 = 取字节集中间 (文件, 现行位置, 8) 现行位置 = 现行位置 + 8 段 [计次].内存大小 = 取字节集数据 (文件, #整数型, 现行位置) 段内存地址 [计次] = 取字节集数据 (文件, #整数型, 现行位置) 段占用文件大小 = 取字节集数据 (文件, #整数型, 现行位置) 段 [计次].数据 = 字节集删尾空 (取字节集中间 (文件, 取字节集数据 (文件, #整数型, 现行位置) + 1, 段占用文件大小)) 现行位置 = 现行位置 + 12 段 [计次].属性 = 取字节集数据 (文件, #整数型, 现行位置) .计次循环尾 () .计次循环首 (表的数量, 计次) .变量循环首 (段数, 1, -1, 计次2) .如果真 (表目录 [计次].地址 ≥ 段内存地址 [计次2]) 表目录 [计次].段号 = 计次2 表目录 [计次].地址 = 表目录 [计次].地址 - 段内存地址 [计次2] 跳出循环 () .如果真结束 .变量循环尾 () .计次循环尾 () .计次循环首 (段数, 计次) .如果真 (段内存地址 [计次] = 代码段地址) 代码入口地址 = 代码入口地址 - 代码段地址 生成PE文件 (首选装载地址, 段, 计次, 代码入口地址, 文件对齐度, 表目录, DOS数据, 控制台程序) 跳出循环 () .如果真结束 .计次循环尾 ()

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值