Category Archives: GCC

介绍GCC编译器及GNU工具链相关内容

GNU工具链学习笔记

1..so为动态链接库,.a为静态连接库。他们在Linux下按照ELF格式存储。ELF有四种文件类型。可重定位文件(Relocatable file,*.o,*.a),包含代码和数据,可用来连接成可执行文件或共享目标文件;可执行文件(Executable File),ELF可执行文件;共享目标文件(Shared Object File,*.so),包含代码和数据;核心转储文件(Core Dump File),进程意外终止时,系统将该进程的地址空间内容和其他信息保存到该文件中。 file命令可以查看。 2,Objdump程序,来自binutils,可以查看Object file内的结构。-h:打印各个段基本信息;-s所有段内容以16进制打印;-d:将所有包含指令的段反汇编。 3, ar -t libc.a;查看libc.a压缩了那些.o文件。 4, collect2 是ld连接器的包装,它调用ld链接目标文件,并对结果做处理,包括收集所有与程序初始化相关的信息并构造初始化结构。 5,readelf:查看ELF文件。 -s:打印符号信息;

Posted in GCC, 编译技术, 编译理论实践和应用 | Tagged , , , , , , , , | 2 Comments

反汇编器和汇编器

反汇编器和汇编器是两个互逆的过程,后者将汇编源文件转换为机器码,前者将机器码转换成汇编语言。 汇编器通过将汇编指令符号转换为opcode和解析符号名为存储位置的形式创建目标代码,该目标代码就是机器码.其中符号解析是汇编器的关键部分.很多汇编器还提供宏支持来方便文本替换.相对于高层语言的编译器,汇编器简单很多.最早的汇编器出现在20世纪50年代,很多现代汇编其器都支持指令调度优化.Linux下使用最频繁的汇编器是gas,Gnu Assembler,因为它是GCC的默认后端,是Binutils的一部分。 反汇编器的输出通常是可读的汇编码格式,因此它时反向工程的重要工具。通常汇编语言允许常数和注释,但是在生成机器码时这些信息通常被删除,所以,在机器码上的反汇编操作只能产生无常数和注释的汇编码,所以程序员很难读懂,也很难转换为原来的高级代码。现在也有些编译器通过使用符号调试信息和交互式允许用户为特定区域的代码和值使用符号代替的方式来增强可读性。现在常见的反汇编器有:各种调试器都包含反汇编器,如GNU Binutils中的objdump就是gdb的交互式反汇编器,其他的还有PVDasm,一个支持多CPU反汇编器,OllyDbg–32位汇编级分析调试器,ILDASM–.NET Framework SDK中,用来反汇编PE文件等等 参考: http://en.wikipedia.org/wiki/Assembly_language#Assembler http://en.wikipedia.org/wiki/GNU_Assembler http://en.wikipedia.org/wiki/Disassembler

Posted in GCC, 编译技术, 编译理论实践和应用 | Tagged , , , , , , , , , | 1 Comment

GCC中的pie和fpie选项

Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。 引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小

Posted in GCC, 编译技术, 编译理论实践和应用 | Tagged , , , , , , , , , , , , , | 1 Comment

GCC初窥

这是gcc maillist中某国际友人 laurent@guerby.net 做的2个小时报告的ppt,报告题目为。最近一直想深入了解gcc,而这个ppt基本包含本博想了解的内容,所以将其翻译并分享到这里。翻译过程中,很多地方可能有错,请大家不吝赐教。

什么是GCC
GCC–GNU Compiler Collection,即GNU 编译器集合。GCC即可作为本地编译器也能作为交叉编译器,它支持很多高级语言和多个编译和目标平台。GCC的网址 http://gcc.gnu.org.它是FSF基金会版权所有的自由软件. Continue reading

Posted in GCC, 编译技术, 编译理论实践和应用 | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | 1 Comment

Gcc和Open64中的-fPIC选项

选项 -fPIC PIC是Position-Independent Code的缩写。在计算机系统中,PIC和PIE(Position-Independent Executable)是可以在主存中不同位置执行的目标代码。PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。 要想实现位置无关,代码必须通过特定的方式编写、编译才行。比如对于固定地址的绝对跳转指令,就需要使用相对应的相对跳转指令代替,相对位置的计算通过对指令计数器的计算得到。在某些特定的体系结构上(如AMD64),共享库就必须支持PIC。

Posted in GCC, open64, 编译技术, 编译理论实践和应用 | Tagged , , , , , , , , , | 2 Comments