编译器

gcc编译器

提到gcc编译器,先来说一说预处理,编译,汇编,连接。

预处理(文本操作):

预处理功能主要包括宏定义,文件包含,条件编译,去注释等
预处理指令是以#开头的代码行
例如:gcc -E test.c -o test.i
-E选项的作用是让gcc在预处理结束后停止编译过程
-o选项指目标文件,.i文件为已经过预处理的c原始程序

编译(生成汇编):

gcc在这个阶段会进行语法分析,词法分析,语义分析,符号汇总。检查无误后,gcc把代码翻译成汇编语言
例如:gcc -S test.i -o test.s
-S选项的作用是让gcc在编译结束后停止编译过程

汇编(生成机器可识别代码):

汇编阶段是将编译生成的.s文件转化为目标文件
使用-c选项可看到汇编代码已转化为.o的二进制代码
例如:gcc -c test.s -o test.o

连接(生成可执行文件或库文件):

成功编译后就进入连接阶段
例如:gcc test.o -o test

gcc选项:

-E -> 只进行预处理,不会生成文件,需要我们将其重定向到一个输出文件里
-S -> 编译到汇编语言不进行汇编和连接
-c -> 编译到目标代码
-o -> 文件重定向输出到文件
-w -> 不生成任何警告信息
-wall -> 生成所有警告信息
-g -> 生成调试信息,GNU调试器可利用该信息

注:在 gcc编译源代码时指定-g选项可以产生带有调试信息的目标代码,gcc可以为多个不同平台上的不同调试器提供调试信息,默认gcc产生的调试信息是为 gdb使用的

除了一直在说的gcc编译器,EGCS(Experimental/Enhanced GNU Compiler System) 一个编译系统,包括了C/C++/Obj-C/Fortran等编译器。

readelf命令:

用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)

选项:

-a(--all)-> 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I
-h(--file-header) ->  显示elf文件开始的文件头信息
-l (--program-headers或--segments) -> 显示程序头(段头)信息(若有的话)
-S(--section-headers或--sections)-> 显示节头信息(若有的话) 
-g(--section-groups)-> 显示节组信息(若有的话)
-t(--section-details)-> 显示节的详细信息(-S的)
-s(--syms或--symbols)-> 显示符号表段中的项(若有的话)
-e(--headers)-> 显示全部头信息,等价于: -h -l -S 
-n(--notes)-> 显示note段(内核注释)的信息 
-r(--relocs)-> 显示可重定位段的信息
-u(--unwind)-> 显示unwind段信息。当前只支持IA64 ELF的unwind段信息 
-d(--dynamic)-> 显示动态段的信息
-V(--version-info)-> 显示版本段的信息 
-A(--arch-specific)-> 显示CPU构架信息 
-D(--use-dynamic)-> 使用动态段中的符号表显示符号,而不是使用符号段
-x (--hex-dump=)-> 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名
-I(--histogram)-> 显示符号的时候,显示bucket list长度的柱状图
-W(--wide)-> 宽行输出

你可能感兴趣的:(总结,笔记,linux)