Site Navigation:
 
 

12. 开发工具

这一节覆盖了各种开发工具和特性。

12.1. 运行时

下面是 glibc 中的新特性

  • 支持继承优先级和保持优先级的互斥量(mutex)。这是 POSIX 标准中包含的特性。

    • 继承优先级的互斥量自动防止等待互斥量带来的优先级反转。内河自动提升持有互斥量的线程,直到互斥量被释放。

    • 保持优先级允许为获得互斥量的线程设置优先级,直到互斥量被释放。这个特性对于 robust mutex 不适用。

  • 用于主机名查找的 getaddrinfo() 接口在排序目标地址时可以定制规则,通过 /etc/gai.conf 文件。

  • NIS 和 NIS+ 的速度有很大提升。

  • 完善 RFC 3542 支持 (IPv6 的高级套接字 API)。

  • 动态符号查找的速度大大提高。

12.2. 工具

链接器包含对新的 ELF 符号散列表格式的支持。使用 --hash-style 链接器选项来应用这种格式。

12.2.1. 内核头文件

本次发布的内核头文件是直接从内核导出的,使用 2.6.18 内核新引入的 headers_install 特性。因此,glibc-kernheaders 软件包被去除,取代它的是 kernel-headers,它是 kernel 的子软件包。

开发者会看到新的内核头文件与过去有所不同,包括但不限于如下内容:

  • 文件 <linux/compiler.h> 被去除,因为它对于用户空间没有意义。

  • _syscallX() 被去除。用户空间应当使用 C 库中的 syscall()

  • PAGE_SIZE 在某些体系中被去除,因为可能是一个变量。用户空间应当使用 sysconf(_SC_PAGE_SIZE)getpagesize()

  • 头文件 <asm/atomic.h><asm/bitops.h> 被去除。它们不是为用户空间使用的,在一些体系中会出错,而另一些体系中会悄悄执行非原子操作。C 编译器提供了自己的内部原子操作,适于在用户空间使用。

  • #ifdef __KERNEL__ 保护的内容被彻底忽略,使用 unifdef 工具。定义 __KERNEL__ 以访问用户空间不应可见的内容这种作法不再有效。

另外,一些其他不适于用户空间使用的头文件被去除。还有更多的头文件被修改,以去除不合适的内容。

[注意]内核头文件的修改并不是 Fedora 特有的

这些修改是自上游继承的,并不是 Fedora 特有的。任何发行版如果使用最新正式导出的内核头文件,都将是这样。

12.2.2. GCC 编译器集合

这一版本的 Fedora 使用 GCC 4.1 构建,同时将其包含在发行版中。

12.2.2.1. 警告
  • Fedora 开发者对 ELF 格式中,提供动态链接的符号的 .hash 段做了变动。新的 .gnu.hash 段,使用 gcc--hash-style=gnu 参数来生成,提供与过去的 hash 段相同的功能,但是带来了 50% 的动态链接性能提升。使用新的 hash 函数生成的可执行程序和库与旧的 glibc 以及动态链接器不兼容。要使用过去的 hash 规则,与过去基于 glibc 的版本兼容,可以传递 --hash-style=sysv 选项。

  • 需要 GDB 6.1 或更新的版本来调试可执行文件,除非编译时指定了 -fno-var-tracking 编译选项。

  • 选项 -fwritable-strings 不再可用。

  • 英语的诊断信息以 Unicode 编码,如果无法阅读,请将环境变量 LC_CTYPE 设置为 C 或者换用其他终端模拟程序。

  • 在大多数系统中不再安装 specs 文件。普通用户不会注意它,需要调整这个文件的开发者可以使用 -dumpspecs 选项来生成并用于编辑。

12.2.2.2. 代码生成
  • 包含了 SSA 代码优化程序。它提供了更好的 constant propagaion, partial redundancy elimination, load and store code motion, strength reduction, dead storage elimination, better detection of unreachable code 以及累计的尾递归。

  • 自动向量化得到支持。这一技术在某些情况下,对于重复的循环可以获得更高性能。

12.2.2.3. 语言扩展
  • 新加入的 sentinel 属性使得编译器在遇到 execl(char *path, const char *arg, ...) 这样的需要一个 NULL 参数列终结符的函数中,缺失了 NULL 的情况下会发出警告。

  • cast-as-lvalue , conditional-expression-as-lvalue , 和 compund-expression-as-lvalue 扩展都被去除。

  • #pragma pack() 的语义被修正为更接近其他编译器。

  • 对声明时带有 register 修饰符的变量取地址时,产生错误而不是警告。

  • 不完整的类型的数组会引发错误。这意味着不能对结构体的定义进行前向引用。

  • 基本的编译器,不使用任何优化时 (-O0),经测试在实际代码中速度提高了 25%。

  • 在多线程程序中库可以包含函数作用域的静态变量了。嵌入式程序员可以用选项 -fno-threadsafe-statics 关掉这一特性,但普通用户永远不要这样做。

12.3. Ruby

Ruby 的默认搜索路径 $: 被修改,以符合 Ruby 打包准则rbconfig 模块的 Config::CONFIG 中的一些条目也有调整。最重要的变动是:

  • sitedir 及相关目录 (sitelibdir, sitearchdir) 位于 rubylibdir 之下。它们在 /usr/lib/ruby/site_ruby 目录中,而不是 /usr/lib/site_ruby

  • 平台无关的纯 Ruby 代码位于 /usr/lib,即使是 x86_64 体系也是如此,之前是位于 /usr/lib64。这个变动影响到 Config::CONFIG 中的 rubylibdirsitelibdir 条目。

$: 中列出的目录仍然不变,因此已有代码例如 /usr/lib/site_ruby 不需要修改。但是它们都标为过时,将在 Fedora Core 8 中去除。请遵照 Ruby 打包准则。特别的,Ruby 库只应当安装到 sitelibdirsitearchdir。即使不是打包 RPM,也应当遵守这一规则。