什么是静态链接库?

静态链接库,即static library或 statically-linked library。和动态链接库,即dynamic library 或dynamicly-linked library相对,是Windows和Linux系统中比较常用的库文件。Windows中分别用SLL和DLL文件表示,Linux中分别是.a和.so文件.

静态链接库实际是一些object files(.o文件)和头文件的压缩包,通过GNU工具链中的ar(archiver)程序创建。

静态链接库、动态链接库和共享库

那为何还要有动态链接库呢?静态练级库虽然能很好的节省编译时间。对于一个简单的ls程序,我们需要有屏幕输出,有字符串和格式操作,有文件系统访问等等函数,都要在一个程序中。此时,这个程序会很大。一个小小的ls可能都会有好几兆。如果还有个rm程序,同样也需要屏幕输出,文件系统访问。那么这两个东西,我们可以放到两个库文件里,在执行ls,或者rm的时候,用到屏幕输出操作,就将相应的函数对应的机器码载入内存中,执行。然后再从内存中释放。接着载入文件系统访问的相关函数。这样我们的程序就能变小很多。这种可以动态装载到内存中的库文件就是动态链接库了。Windows下的DLL文件就是动态链接库。

Continue reading »

 

今天需要对Debian中的默认启动程序做配置,就顺便重新认识一下Linux下的启动过程,并总结对比Debian和Gentoo。

Init创世纪!

再来回顾一下Linux PC的启动过程

  1. BIOS检测硬件,并查找硬盘MBR(Master Boor Record)上的指令
  2. MBR指向GRUB,LILO之类的boot loader
  3. Grub查询载入操作系统内核的位置,并载入指定的内核
  4. 内核载入之后启动init进程。
  5. init启动脚本/etc/rc.d/rc.sysinit, 接着根据运行级别不同,启动指定的进程。

init是系统中所有进程的父进程,它确保所有的文件系统(/etc/fstab中指定的)都已经正确挂在,接着就执行/etc/init.d下的一系列脚本来启动服务。接着init就会激活终端,并将进程agetty和他绑定。agetty确保用户能在终端登录。

实际上init会根据不同的运行级别来启动不同的进程。这个运行级别的控制在/etc/inittab中。 Continue reading »

 

上篇文章前瞻-主流处理器中的数据并行支持(SIMD)》 介绍了当今主流CPU中的SIMD扩展,本文将介绍前人是物和利用SIMD来做优化的,下篇<前瞻-拿起SIMD的武器II>将探讨如何使用CPU的向量指令为程序做优化

已有在SIMD上的优化工作:

正如之前提到的,SIMD对具有以下特性的程序性能提升明显:天然数据并行,访存模式重复、在局部数据上重复操作、控制流数据无关。很多应用有这方面的特性,并能通过使用SIMD扩展提高性能,但实际仅有小部分从中获益,接下来将介绍在单核处理器上,利用Intel的SIMD扩展针对某些应用提升性能的研究,如多媒体,数据安全,数据库和一些科学计算应用。

多媒体处理

多媒体处理需要软件和硬件的很多支持。如MPEG-1,MPEG-2,MPEG-4,MPEG-7,H.263,JPEG2000等需要实时做复杂的媒体处理.3D图像和立体视频处理都需要更强劲的实时处理.因为各种媒体都需要不同的处理方式,技术支持、算法和硬件,因此针对他们的SIMD扩展改进也很不同。 Continue reading »

 
  1. root密码多少? loongson
  2. 如何添加新用户? adduser username
  3. 怎么修改IP? vim /etc/network/interfaces
  4. 如何重启网络? /etc/init.d/networking restart
  5. 如何启动ssh? /etc/init.d/ssh start
  6. 为啥root账户在/目录下修改,都提示 read only filesystem?因为根分区在挂载时以只读挂载.可以执行 mount / -o remount,rw. 如果以后都想要root在/下可写,可以修改/etc/init.d/discover,把倒数第二行mount的命令注掉即可。 Continue reading »
 

上篇文章,以论文为主要依据,介绍了LLVM的概况和中间表示,本篇关注论文的后半部分内容–架构设计和LLVM的整体评测:

LLVM的架构设计:

总览

LLVM的架构设计以让传统的链接时,安装时,运行时和空闲时代码转换都能透明地在LLVM中间表示上展开为目的。上图就是LLVM的高层设计架构。包括静态的编译器前端用于生成LLVM中间表示;连接器用于做连接时优化,尤其是过程间优化。连接器的输出被JIT或者机器代码生成器生成机器代码。在机器代码生成时,可以通过插入低代价的抽样指令来测量运行时的profile,检测热代码,并将空闲时进行优化。

Continue reading »

 

LLVM新版本相对于2.6增加了很多新特性并对很多功能做了改进.包括生成代码质量显著提高、生成调试信息的改进以及核心架构生的很多新特性。最令人兴奋的特性是Clang(LLVM的前端)能自举。自举是任何编译器实际开发中最令人兴奋的里程碑,而且也标志着Clang对复杂的C++标准大部分支持。

LLVM是苹果公司主导开发的下一代编译器,目标是能实现全时优化,即在编译时静态分析源代码实现优化;链接时分析所有源码文件做更加激进有效的过程间优化;运行时使用实时编译进行实时优化,并采集使用信息;空闲时利用使用信息实现反馈优化。但目前LLVM还很不完善,很多功能还亟待开发和完善。目前LLVM仅支持C语言和部分C++.

LLVM已经应用在不少场合。如,Google用它作为一个Python解释器的底层实现(Unladen Swallow)。苹果公司用它实现Mac OS中OpenCL的底层支持。

Chris Lattner 声明 LLVM 2.7发布的邮件
LLVM 2.7 release notes

 

距离GCC 4.4的发布一年之久,GNU终于发布GCC 4.5了。新版本带来了很多新特性,包括使用MPC库在编译时完成复杂的算术计算,C++0x支持增强,使用部分Graphite完成自动并行化,支持新的ARM处理器,Intel Atom优化和调优支持,以及AMD Orochi优化支持等。今年稍晚发布的Fedora 14,Ubuntu 10.10,OpenSUSE 11.3,都将有GCC4.5,估计Gentoo马上就会有支持了,磨拳擦掌准备试用喽:)详细支持如下:

总体说明:

  • 编译GCC需要MPC库
  • 故纸堆里的旧系统和很久没有更新和测试的系统在GCC4.5中被标记为待放弃,包括IRIX, Solaris 7, Tru64 UNIX V5.1.
  • GCC4.4中标记为待放弃的支持被放弃
  • 移除Itanium 1变种支持,但Itanium2编译的程序能在Itanium1上正确执行
  • GCC生成的调试信息包括了更多DWARF 3的特性,甚至包含了DWARF4的一些特性.GDB7.0之前的版本将无法使用这些特性.所以调试GCC4.5编译的程序需要使用GDB7.0及以上版本.也可以使用选项 -gdwarf-s  -gstrict-dwarf来禁止生成DWARF4信息,或者-gdwarf-2 -gstrict-dwarf让GCC严格执行DWARF2标准.
  • X86上,浮点运算在GCC4.5上使用严格C99语法编译时,可能会运行变慢。这是为了和标准一致,可以通过选项-fexcess-precision=fast来避免严格的标准限制。
  • noinline属性不再能阻止整个函数拷贝。但可以通过新的属性noclone做到。

Continue reading »

 

读论文<LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation> CGO 04

1,写在前面的话

全时优化(LifeLong Optimization)对于每个编译爱好者来说,太有魅力了。我在起初也是被这个题目所吸引打算一探究竟。本文是04年LLVM的最早两位开发者Chris Lattner和Vikram Adve所写,发表在04年的CGO上,

先来说说LLVM的历史。2000年LLVM开始开发,2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。Apple已经将它用在OpenCL的流水线优化,Xcode已经能使用llvm-gcc编译代码。可以说05年之前LLVM一直都是学术界的东西,05年之后用于工业界.而这篇文章写在04年.本博最近听过一个关于LLVM的讨论会,会中有资深人士提到LLVM现在越来越像一个普通的编译器。说这番话的意思是,我们可以从这篇文章里找到LLVM的架构设计和早期的一些实现思想,但请不要迷信LLVM现在有多么神奇,每个架构都会有它的优缺点。

这篇文章,我现在已经读完了理论和介绍部分,性能评测部分还没有读。所以标题里面加了个1,因为接下来,还想作几件事,一是读完文章,二是跟踪一下Chris Lattner最近几年的文章,三是尝试将Open64和LLVM做个对比,最后看看代码。所以敬请期待之后的系列文章。
Continue reading »

 

本博在实际工作中,曾经安装过不少龙芯电脑的系统,可谓稍有经验,这里略微介绍一些常见问题。

  1. 内核通用吗?一般龙芯2F使用MIPSIII的指令级,内核格式都为64位的文件。所以不管时O32系统还是N32系统,只要硬件相同都是通用的,不过别忘了连同/lib/modules 和/lib/firmware一起使用:)
  2. 龙芯到底有多少种系统?很多,按照ABI分为3类:O32,N32,N64.O32是出厂时自带的系统,一般龙芯盒子中的华镭,龙芯本中的loonux、红旗和龙芯一体机中的共创都是O32系统。这类系统基本都是在debian的基础上做做山寨化。当然也有英文版的debian系统,这个比较干净一些。对于O32的系统,源的问题最头疼,因为各个公司画地为牢,大家都努力维护自己的源,又都缺人手,所以都不完美,试了几个都不太好,装着装着就会出依赖问题,除非一直跟着升级,不然一次apt-get dist-upgrade,那简直是噩梦。N32的系统,zhllg基于Gentoo的已经有了,龙芯论坛里就能找到下载链接。因为Gentoo是自己直接编译,问题相对少些。debian的还没有。N64的系统,有憨牛LFS的,没有试过。至于为啥会有这么多系统,得问问MIPS,因为有不少改进,就产生了不少问题。请参考本博<好大一筐梅普斯>.N32系统据说比O32快20%-30%。因为龙芯本身是64位处理器,所以64位系统也没问题.
  3. Continue reading »

 

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:打印符号信息;
Continue reading »

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

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