01
编译选项和内核编译
首先我们都知道,Linux内核如果用O0编译,是无法编译过的,Linux的内核编译,要么是O2,要么是Os,这点从Linux的Makefile里面可以看出:
当选择了
CONFIG_CC_OPTIMIZE_FOR_SIZE
它会是Os,否则就是O2。
其实O2和Os,都是一些优化选项的集合:
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
gcc -c -Q -Os --help=optimizers > /tmp/Os-opts
前者倾向于基于速度的优化,后者倾向于基于size更小的优化。对比二者的开关选项:
meld /tmp/O2-opts /tmp/Os-opts
发现差异小的可怜:
O2和Os都使能了inline small函数和called once的函数,但是O2里面-finline-functions是关闭的,而Os里面是开的。O2里面optimize-strlen是开的,Os里面这个选项是关闭的。相关选项的含义可以通过"man gcc"看出(有问题,找男人),譬如man gcc后检索inline-functions:
从O0到O1,O2,O3,是一个开启的优化选项逐步加大的过程: