LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2443|回复: 13

由外至内加速你的Linux (openSUSE折腾指南)连载C

[复制链接]
发表于 2009-5-5 00:22:07 | 显示全部楼层 |阅读模式
[color="Blue"]A篇:基础概念
[color="Blue"]B篇:工具篇

C篇:手贱要锻炼

建立折腾环境

好了好了,正式开始了,把手套摘下来,点开一个终端。

首先,把上一篇提到的源都加好,然后
  1. su
  2. zypper in gcc webpin build cpp gcc-c++ make
复制代码
你不需要知道装的是什么,你只需要知道,没有他们不行。

开始几个任务练练手。

甲,升级到 gcc 4.5
openSUSE 11.2 默认是 gcc 4.4 可是半个月前刚发布了正式版的 gcc 4.5,既然要折腾,怎么能不升级呢?何况升级以后,优化编译出来的软件跑得更快。

先看看现在机器上是哪个版本的 gcc:(开头是 $ 表示手动输入)
  1. $ which gcc
  2. /usr/bin/gcc
  3. $ l /usr/bin/gcc
  4. lrwxrwxrwx 1 root root 7 04-29 02:52 /usr/bin/gcc -> gcc-4.4*
复制代码
which gcc 是看看现在使用 gcc 命令对应的是哪个可执行文件
l /usr/bin/gcc
是 suse 特有的命令缩写,即 ls -l , 列出文件详情。结果表示 /usr/bin/gcc 本身是个符号链接(或者快捷方式这个说法更熟悉些$#%#%),指向 /usr/bin/ 同目录下的 gcc-4.4 文件。

明显吧,自带的 gcc 是 4.4 版本的。确认一下:
gcc --version

啥也别说了,开始升级吧。
  1. su
  2. zypper in gcc45 libstdc++45 libgomp45 libgfortran45 gcc45-c++ cpp45
复制代码
再说一遍:你不需要知道装的是什么,你只需要知道,没有他们不行。
补充一点:有它们也不一定能行。汗。。。

装完了,在检查升级成果的时候你会郁闷的发现:
gcc --version
还是4.4。煾 ¥%@@$#@^&@$%

rpm -ql gcc45
看看 rpm 文件都装到哪里去了。发现已经有 /usr/bin/gcc-4.5 文件了可是  /usr/bin/gcc 仍然指向 /usr/bin/gcc-4.3

手动搞定它:
  1. su
  2. cd /usr/bin/
  3. rm gcc
  4. ln -s gcc-4.5 gcc
复制代码

不要以为这就完了:
  1. su
  2. cd /usr/bin/
  3. rm cpp c++ g++ cc gcov
  4. ln -s g++-4.5 c++
  5. ln -s gcc-4.5 cc
  6. ln -s cpp-4.5 cpp
  7. ln -s g++-4.5 g++
  8. ln -s gcov-4.5 gcov
复制代码

顺便把 man 也改了吧,免得麻烦。
  1. su
  2. cd /usr/share/man/man1/
  3. rm c++.1.gz cc.1.gz cpp.1.gz g++.1.gz gcc.1.gz gcov.1.gz
  4. ln -s g++-4.5.1.gz c++.1.gz
  5. ln -s gcc-4.5.1.gz cc.1.gz
  6. ln -s cpp-4.5.1.gz cpp.1.gz
  7. ln -s g++-4.5.1.gz g++.1.gz
  8. ln -s gcc-4.5.1.gz gcc.1.gz
  9. ln -s gcov-4.5.1.gz gcov.1.gz
复制代码

gcc --version
发现搞定,如果仍然发现没有搞定,请直接撞墙后再试。

这只是折腾的第一步哦,熟悉一下文件操作而已。啊卡卡。

乙.确定优化参数

优化编译,关键就在优化参数,设定好了以后后面一直用了。
参数1. CHOST
个人电脑 32 位就是 i686-pc-linux-gnu
而 64 位就是 x86_64-pc-linux-gnu
其它的自己查。

参数2. CFLAGS

这是关键中的关键了,它把各种优化参数传给编译器(gcc),在编译时实现优化。

gcc 4.2 以上,-march=native -mtune=native 这两者是必要的优化参数,不管你32位64位AMD/Intel/等等什么的 CPU。也无所谓指令集差别,这两个选项写上以后会自定检测 CPU 支持的指令集,并自动打开相应指令集优化。

更多指令集相关的优化参见:
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
更多优化专用参数参见:
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Optimize-Options.html#Optimize-Options

其它优化参数 -O3。你也可以定成 -O4 O5 ...O9,目前它们和 -O3 是一样的。。。
表示优化级别为3(目前最高)。可能出现各种问题,各种文章都是推荐 O2 的,可是就我本身测试, O3 编译任何东西都没有出现过问题。折腾么,就要对自己狠一点。

一个相对安全的策略:
  1. CFLAGS="-march=native -mtune=native -pipe -O3"
复制代码
里面 -pipe 除了加快编译速度没有别的影响。
相应的,还有一个 CXXFLAGS 参数,直接让他等于 CLAGS 。
CXXFLAGS="${CFLAGS}"

参数3. LDFLAGS
具体参见下面的链接,linker 的优化编译参数。一个相对安全的策略:
  1. LDFLAGS="-Wl,-O1 -s"
复制代码

参考链接:
http://lamp.linux.gov.cn/Linux/optimize_guide.html

参数4.其它
MAKEOPTS="-jN"
大写N要用数字替换,一般是 cpu 核心数 +1 ,如果内存超过 2G 可以随便写大点,后果自负。

丙. 把优化参数写入文件

定下了优化参数以后,写入 /etc/profile.local 文件,没有就创建一个。

这个文件可以设置系统级别的变量,我们要用它设置编译优化参数。说明:这个文件不算是折腾的关键,但是它包含关键内容,而关键的内容会出现在很多关键的文件里面。

sudo vim /etc/profile.local
原则是把上面定下来的参数都 export 一遍,下次启动就生效了。比如我的文件是:
  1. export CHOST="x86_64-pc-linux-gnu"
  2. export CFLAGS="-march=native -mtune=native -pipe -O3"
  3. export CXXFLAGS="${CFLAGS}"
  4. export LDFLAGS="-Wl,-O1 -s"
  5. export MAKEOPTS="-j6"
复制代码

而最关键的文件是 rpmrc, 这个文件本来在:
/usr/lib/rpm/rpmrc
要定义的是里面的 optflags 变量。
32 位机器,把里面这两行 copy 出来:
  1. optflags: i586 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
  2. optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码
写入 /etc/rpmrc
  1. optflags: i586 -O2 -g -m32 -march=i586 -mtune=i586 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
  2. optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码
然后编辑 /etc/rpmrc ,用上面定下来的 CFLAGS 字符的值替换字串中 "-O2 -g -m32 -march=i686 -mtune=i686" 这种部分,前面和后面不变。
比如如果上面的 CFLAGS="-march=native -mtune=native  -pipe -O3"
这两行会换成:
  1. optflags: i586 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
  2. optflags: i686 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码

64位光拷贝 optflags: x86_64 这一行到 /etc/rpmrc ,然后作相应编辑就行了。像上面 CFLAGS 同样的情况,64位的 /etc/rpmrc 只有一行。
  1. optflags: x86_64 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码

其它架构,以此类推。

还有一个文件
sudo vim /usr/lib/rpm/macros
找到
  1. LDFLAGS="${LDFLAGS:-%{-s:-s}}"  ; export LDFLAGS; \
复制代码
把 -s:-s 换成你的 LCFLAGS, 比如你的 LDFLAGS 是 -Wl,-O1 -s,则这一行会成为
  1. LDFLAGS="${LDFLAGS:-%{-Wl,-O1 -s}}"  ; export LDFLAGS; \
复制代码

参数设定完成,可以重启了。

待续
发表于 2009-5-5 00:29:33 | 显示全部楼层
Wonderful!
沙发,o(∩_∩)o...哈哈
把最前面的那2个链接用彩色标记出来好看些,如蓝色。

颜色标记强调下更好
回复 支持 反对

使用道具 举报

发表于 2009-5-5 10:28:15 | 显示全部楼层
GCC4.4.0不建议升级,可能会造成 某些程序编译不过情况。
回复 支持 反对

使用道具 举报

发表于 2009-5-5 17:28:41 | 显示全部楼层
好!终于到实质的内容了,得好好研究一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-5 17:29:50 | 显示全部楼层
Post by linux_pro;1983453
GCC4.4.0不建议升级,可能会造成 某些程序编译不过情况。


我这边 glibc 都通过了哦。目前还没有通不过的。当然,要折腾新版软件呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-5 17:36:37 | 显示全部楼层
Post by zpcat;1983624
好!终于到实质的内容了,得好好研究一下。


我写的帖子都是实质内容
如果你看见水,赶紧拿抹布从屏幕上擦掉
呵呵
回复 支持 反对

使用道具 举报

发表于 2009-5-5 17:38:26 | 显示全部楼层
Post by Thruth;1983631
我写的帖子都是实质内容
如果你看见水,赶紧拿抹布从屏幕上擦掉
呵呵


个人感觉在此贴更能刺激我的折腾得欲望!
回复 支持 反对

使用道具 举报

发表于 2009-5-5 19:10:14 | 显示全部楼层
Post by Thruth;1983626
我这边 glibc 都通过了哦。目前还没有通不过的。当然,要折腾新版软件呵呵

我是交叉编译 i486的东西用gcc 4.4.0
一些软件无法通过。
不是glibc,是uclibc。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-7 00:00:27 | 显示全部楼层
等新版 uclibc 吧,我这里只有 zypper 编译不过。
回复 支持 反对

使用道具 举报

发表于 2009-5-7 01:11:03 | 显示全部楼层
我最想知道的是编译内核的补丁要到那里下及怎样知道那些补丁是自己需要的,看过你的编译内核教程不过有看没有懂,最后还是错误失败告终。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表