这一节覆盖了各种开发工具和特性。
下面是 glibc 中的新特性
支持继承优先级和保持优先级的互斥量(mutex)。这是 POSIX 标准中包含的特性。
继承优先级的互斥量自动防止等待互斥量带来的优先级反转。内河自动提升持有互斥量的线程,直到互斥量被释放。
保持优先级允许为获得互斥量的线程设置优先级,直到互斥量被释放。这个特性对于 robust mutex 不适用。
用于主机名查找的 getaddrinfo() 接口在排序目标地址时可以定制规则,通过 /etc/gai.conf 文件。
NIS 和 NIS+ 的速度有很大提升。
完善 RFC 3542 支持 (IPv6 的高级套接字 API)。
动态符号查找的速度大大提高。
链接器包含对新的 ELF 符号散列表格式的支持。使用 --hash-style 链接器选项来应用这种格式。
本次发布的内核头文件是直接从内核导出的,使用 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 特有的。任何发行版如果使用最新正式导出的内核头文件,都将是这样。 |
这一版本的 Fedora 使用 GCC 4.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 选项来生成并用于编辑。
包含了 SSA 代码优化程序。它提供了更好的 constant propagaion, partial redundancy elimination, load and store code motion, strength reduction, dead storage elimination, better detection of unreachable code 以及累计的尾递归。
自动向量化得到支持。这一技术在某些情况下,对于重复的循环可以获得更高性能。
新加入的 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 关掉这一特性,但普通用户永远不要这样做。
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 中的 rubylibdir 和 sitelibdir 条目。
$: 中列出的目录仍然不变,因此已有代码例如 /usr/lib/site_ruby 不需要修改。但是它们都标为过时,将在 Fedora Core 8 中去除。请遵照 Ruby 打包准则。特别的,Ruby 库只应当安装到 sitelibdir 和 sitearchdir。即使不是打包 RPM,也应当遵守这一规则。