读PLDI 04 Best Paper Award 《Automatically Proving the Correctness of Compiler Optimizations》
By Sorin Lerner.Todd Millstein and Craig Chambers in Washington U

本博自从接触编译器到现在,几乎都每天都能听到bug这个关键字,编译器中的bug很痛苦,首先,人写的程序很复杂,编译器设计者很难想出所有的情况并一并处理之;其次,编译器的bug很难调,要先排除程序本身的错,接着需要知道到底是分析时出错还是变换时出错;还有这些错都是在怎样的分析和变换中出了错;最后还要担心错误会不会越不越多,没有对编译器整体的理解,很难给编译器打上正确的补丁,从而有可能这个例子补对了,其他又错了一片.
作者在文章里就编译优化正确性的自动证明做了一些尝试,这些尝试在读完文章之后觉得很了不起,只是这里面提到的工作做下来,也是需要很大的积累和投入.作者的尝试我概括如下:将优化分为转换和具体优化两个部分.代码的转换是所有优化都要做的,而并非所有的转换都是优化,所以作者通过增加利益驱动模块来判断某个转换是否是优化,这样优化的自动证明问题,就变成了某个转换正确性的自动证明问题;正确性的定义:转换前后的语义保持不变.接着作者按照转换依据的信息来自转换语句之前还是之后,将转换分成两种模式,即前向转换模式和后向转换模式.然后分别对这两种模式进行讨论,而自动证明也分别针对这两种模式来论述. Continue reading »

 

反汇编器和汇编器是两个互逆的过程,后者将汇编源文件转换为机器码,前者将机器码转换成汇编语言。

汇编器通过将汇编指令符号转换为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

 

Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。

引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小
Continue reading »

 

先来介绍一下n32和O32是啥,N32和O32就是MIPS系统上不同的ABI,即Application Binary Interface。MIPS体系结构最早只有o32的系统,但后来改进了寄存器的功能和分配方式,于是就又有了N32,相对于O32,N32的速度更快些。但二者目前在龙芯系统上还无法兼容。因为龙芯目前官方只支持O32,而N32有只有zhllg的overlay中有,所以使用gentoo来安装O32的工具链需要额外解决些问题,所以才有了这篇文章,之所以之前又写了N32的安装方法,是因为有zhllg大牛的技术支持,使得能直接安装N32的工具链。 Continue reading »

 

不管怎样,龙芯是咱们应该骄傲的,但是用它来编译东西确实很慢,我们很需要一个交叉编译器,能够在性能稍好的平台上为龙芯平台编译程序,x86是目前比较常见的平台,本博在实际工作中,需要在gentoo系统上安装支持龙芯n32的交叉编译器,下面分享一下本博的安装过程。
crossdev是gentoo系统下很方便的交叉编译环境安装和卸载工具,想进一步了解可以参考本博的这篇文章Gentoo中的交叉编译利器–crossdev,这里只讨论有了crossdev之后的安装过程。
首先,我们需要支持n32的gcc,glibc,linux-header,insight和binutils.其中,gcc,gdb,insight和linux-header都已经有了官方支持,我们还需要glibc的一些patch。头疼打patch这种繁重的劳动?别急,已经有国内的开源爱好者们做好了这些,我们仅仅需要几个附加步骤即可。 Continue reading »

 

strace- system calls and signals trace.跟踪系统中调用和信号信息。
最简单的情况下,strace ls 会执行ls命令直到结束,监听记录ls进程执行过程中的系统调用信息和进程接收的信号,每个系统调用的名字、参数和返回值都打印到标准输出,也可以使用-o选项输出到文件。strace是很有用的调试工具,对于源码不可见的程序,非常有用,因为系统调用和信号是用户态和内核态之间交互的接口,strace将有助于程序员定位bug,
如下,为在博主电脑上运行 Continue reading »

 

折腾了半天的ebuild,将记录张贴如下:

  • ebuild 包含下载,解压,编译安装包的全部信息,还有卸载和配置内容。大多数ebuild用bash脚本编写。简单来说就是一个Portage系统的底层z直接接 口,它可以通过命令执行ebuild文件中提供的子功能。包括下载源码包(fetch),解压(unpack),配置(configure),编译 (make),安装目标文件(install)甚至包括重新打包为二进制压缩包(package)
  • 例如,以我现在正在安装的cross-mips64el-unknown-linux-gnu/gcc为例,需要使用gcc-4.4.2.ebuild。运行 ebuild gcc-4.4.2.ebuild help 会得到能执行的命令,如下 Continue reading »
  •  
  • 什么是Crossdev[I]
  • sys-devel/crossdev
    Available versions: 0.9.18-r10 ~0.9.19 **99999999
    Installed versions: 0.9.18-r10(03:44:50 PM 11/29/2009)
    Homepage: http://www.gentoo.org/
    Description: Gentoo Cross-toolchain generator

    交叉编译时很多嵌入式开发必须的工具,因为资料太少,遇到的问题又很难解决,所以交叉的开发环境一直让很多程序员头疼。我们就来了解一下gentoo下如何构建交叉编译环境。
    先说说工具链,工具链是用来组建一个系统的工具包集合,因为它们使用输入和输出连接在一起,所以称为链。通常工具链包括以下几部分: Continue reading »

     

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

    • 什么是GCC

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

     

    不知不觉,一个多月的时间,Fred Chow的讲义就被翻译完了。感谢那些奉献代码的人,在编译器优化上所做的努力和探索永没有止境。

    感谢忍住我蹩脚的英语和汉语,看了这些翻译的朋友们。在这个翻译的过程中,深深感到自己的水平很不足,很多翻译别说雅和达,连信这个简单的要求都很难达到。争取将这些资料进一步的完善,能够给更多的人一个可靠的参考。希望大家多提意见和建议.

    单就我个人,还是在翻译的过程中,学到了很多,原先都是单纯的看ppt,但是发现那样的话,印象不顾深刻,所以就决定一点点的翻译。自这个博客创建以来,一直希望能将这里搞成编译爱好者们喜欢的网站,呵呵我将继续努力。
    Fred Chow是Open64的几个元老级人物之一,高屋建瓴,统观全局的讲述,让我在翻译的过程中很是佩服,只有在这样的积累下,才能讲出这么详实概括的课程。 Continue reading »

    2009-2011© 编译点滴 Suffusion theme by Sayontan Sinha

    无觅相关文章插件,快速提升流量