更新GCC和Glibc

  前几天上linuxfans.org,发现sejishikong已经更新了GCC 4和Glibc2.7,于是下回了RPM包,先更新glibc,以前编译和运行Linux程序,总是抱怨glibc的版本太低,很多软件都不能运行,而这个库又极为重要,不能随便更新,稍有不慎就会系统无法使用。这次是MagicLinux的官方补丁,应该可以放心地安装了。
  不过下载RPM包后,如何安装就成了一个问题,一般的RPM包都是rpm -ivh 完成安装,rpm -Uvh完成升级,可是glibc太重要了,Linux里几乎所有的程序都依赖于此库,能动态地更新吗?我怕直接更新有问题,就犯了一个严重的错误,居然用rpm -e glibc --nodeps来卸载,结果一下子系统里什么程序都不能使用了。完了,我只好重新启动系统,用MagicLinux的急救盘想chroot来把RPM包装上,结果根本不行。chroot说/bin/sh不存在,可是这个程序明明存在的,这下惨了。我最终想了一个方法,就是把原先的rpm包里的东西解压出来,然后全部复制到根分区里。事实证明,此方法可行!
  后来,我在那个帖子后面找到里最方便更新glibc的方法,就是使用rpm的--aid选项,这个选项可以成功地更新glibc,而且不用重启。我按这一方法果然可行。Linux真强大,原来连安装glibc这样的库都可以不用重启。
  之后,我启动了原来需要glibc2.6以上版本才能运行的Linux版QQ,说实话,不满意,腾讯就折腾出这样一个东西,比eva差远了。
  后来,我接着更新了gcc,原来是gcc3,现在是gcc4,gcc4相对于gcc3,编译的速度好像并没有什么本质的上升,不过好像更严格了,而且里面的出错信息全成了中文。GCC出错信息变中文,感觉有点怪怪的,里面的话听起来总觉得有些别扭。用它编译fltk时,它还出一个很奇怪的警告:“提领类型双关的指针将破坏强重叠规则”,这句话完全不知道它说什么,感觉还有点搞笑。

 

Linux Comments(0) 2008年8月19日 08:37

GCC对标准C的一个奇妙扩展:词法定界

 

   最近在写Tenshi的解释器,觉得解释器也算是一个比较特殊的程序。如果能用gcc编译器提供的一些扩展,可能会提高程序的可读性与效率,至于移植性,由于gcc本身就是移植性很好的编译器,所以不大担心其在其它平台在的使用。我认真看了一下GCC的使用手册,重点看了一些GCC对C语言的一些扩展,有很多很有用,如把标签作为普通值,然后用goto任意跳转,还有designator来初始化结构体与共用体,case的范围扩展等等。其中有一个很有趣,就是GCC可以对C语言进行词法定界。

  据文档说,对此,编译器使用的方法叫“trampoline”,并给出了trampoline的pdf说明文档的地址,我已下载,准备好好看一下,了解一下它的奇妙之处。

测试代码如下: 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef const char * (*GetName)();
  5.  
  6. struct Person{
  7.         const char *name;
  8.         GetName getName;
  9. };
  10.  
  11. typedef struct Person Person;
  12.  
  13. Person *NewPerson(const char *name){
  14.         Person *person=(Person*)malloc(sizeof(Person));
  15.         person->name=name;
  16.         const char *getname(){
  17.                 return person->name;
  18.         }
  19.         person->getName=getname;
  20.         return person;
  21. }
  22.  
  23. int main(){
  24.         Person *moligaloo=NewPerson("Moligaloo");
  25.         printf("%s",moligaloo->getName());
  26.         free(moligaloo);
  27.         return 0;
  28. }
  29.  
  30.  
  31.  

 

C Comments(1) 2008年5月11日 08:26