IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    为什么Linux内核(目前)依赖GCC

    Adam Lee发表于 2014-08-05 20:00:00
    love 0

    最近围绕着Linux内核编译环境发生了很多有趣的事情. 先是LLVMLinux的[1]大批特性进入mainline, 内核几乎可以用Clang编译了[2], 后来又是Linus Torvalds狂喷GCC 4.9.0[3], 很有意思. 而这些事情都有一个共同的背景: 目前Linux内核编译依赖GCC. 那么, 为什么?

    不通用的命令参数

    Linux内核使用了很多GCC的命令参数来进行优化, 其它编译器也一直在试图兼容, 但目前尚未有能完美兼容GCC参数的其它编译器出现.

    不支持的内联汇编

    __asm__ 并不被其它编译器全面支持, 或者所支持的架构平台有限, 即使是如此简单的用法:

    asm("movl %ecx, %eax");
    

    特殊的C语言扩展

    GCC支持很多独有的特殊C扩展, 例如绑定变量与寄存器, 函数嵌套等, 此外大多数其它编译器也不支持结构体中的变长数组, 但是内核中存在, 例如:

    void func(int i) {
        struct foo_t {
            char a[i];
        } foo;
    }
    

    特殊的段标记

    内核中使用了很多段标记例如__refdata, __initdata和__exitdata来优化链接器的行为, 这些特性大多也是GCC独有.

    #define __refdata       __section(.ref.data)
    #define __initdata      __section(.init.data)
    #define __exitdata      __section(.exit.data)
    

    GCC的特殊行为或者bug

    有时候GCC的某个行为是特殊的甚至是错误的, 但是却恰好迎合了某段代码的需要. 例如IA-64平台上GCC会自动重读一个指向volatile数据的指针的指向内容[4].

    ref:

    1, http://llvm.linuxfoundation.org
    2, http://www.phoronix.com/scan.php?page=news_item&px;=MTY2MjY
    3, http://www.phoronix.com/scan.php?page=news_item&px;=MTc1MDQ
    4, https://software.intel.com/en-us/articles/intel-c-compiler-for-linux-kernel-building



沪ICP备19023445号-2号
友情链接