Linux:RHEL 7特性说明(七):编译程序及工具
June 19, 2015
Red Hat Enterprise Linux 7.0 是 Red Hat 的下一代操作系统完整套件,旨在用于关键任务企业级计算以及顶级企业级软件和硬件零售商认证。
Table of Contents
GCC 工具链
在 Red Hat Enterprise Linux 7.0 中,gcc 工具链是根据 gcc-4.8.x 发行系列开发,并包含大量针对 Red Hat Enterprise Linux 6 的改进和 bug 修复。同样,Red Hat Enterprise Linux 7 也包含binutils-2.23.52.x。这些版本与 Red Hat Developer Toolset 2.0 中的等效工具对应。Red Hat Enterprise Linux 6 和 Red Hat Enterprise Linux 7 gcc 的 binutils 版本对比请查看:
Red Hat Enterprise Linux 7.0 工具链的主要特点如下:
- 构建符合 C++11 的应用程序的实验性支持(其中包括所有 C++11 语言支持)和一些 C11 功能的实验性支持。
- 改进的并行应用程序编程支持,其中包括 OpenMP v3.1, C++11 类型和自动内存访问的 GCC 内嵌,以及事务内存的实验性支持(其中包括 Intel RTM/HLE 内联函数、内嵌以及代码生成)。
- 新的本地注册分配程序(LRA),提高代码性能。
- DWARF4 现在作为默认 debug 格式使用。
- 各种新的具体架构选项。
- 支持 AMD 产品线 15h 和 16h 处理器。
- 接期(Link-time)优化支持。
- 改进的警告和诊断。
- 各种新的 Fortran 功能。
GLIBC
在 Red Hat Enterprise Linux 7.0 中,glibc 库(libc, libm, libpthread, NSS 插件及其他)是根据 glibc 2.17 发行本开发的,其中包含大量针对 Red Hat Enterprise Linux 6 对等产品的改进和 bug 修复。
Red Hat Enterprise Linux 7.0 glibc 库主要特点如下:
- 实验性 ISO C11 支持。
- 新的 Linux 接口:prlimit, prlimit64, fanotify_init, fanotify_mark, clock_adjtime, name_to_handle_at, open_by_handle_at, syncfs, setns, sendmmsg, process_vm_readv, process_vm_writev。
- 使用流 SIMD 扩展(SSE)、补充流 SIMD 扩展 3(SSSE3)、流 SIMD 扩展 4.2(SSE4.2)以及高级矢量扩展(AVX)为 AMD64 和 Intel 64 架构新优化的字符串功能。
- 为 IBM PowerPC 和 IBM POWER7 新优化的字符串功能。
- 使用为 IBM System z10 和 IBM zEnterprise 196 特别优化的程序为 IBM S/390 和 IBM System z 新优化的字符串功能。
- 新区域:os_RU, bem_ZA, en_ZA, ff_SN, sw_KE, sw_TZ, lb_LU, wae_CH, yue_HK, lij_IT, mhr_RU, bho_IN, unm_US, es_CU, ta_LK, ayc_PE, doi_IN, ia_FR, mni_IN, nhn_MX, niu_NU, niu_NZ, sat_IN, szl_PL, mag_IN。
- 新编码:CP770, CP771, CP772, CP773, CP774。
- 新接口:scandirat, scandirat64。
- 已添加检查 FD_SET, FD_CLR, FD_ISSET, poll 和 ppoll 文件描述符版本的功能。
- nscd 守护进程现在支持 netgroup 数据库缓存。
- 新功能 secure_getenv() 可让您安全访问该环境,如果在 SUID 或者 SGID 进程中运行会返回 NULL。这个功能替换了内部功能 __secure_getenv()。
- 现在如果传递违反那些值规范的盐字节(salt bytes),crypt() 功能会失效。在 Linux 中,crypt() 功能将查看 /proc/sys/crypto/fips_enabled 文件决定是否启用了 FIPS。如果启用了该模式,则无法在使用摘要算法 5(MD5)或者数据加密标准(DES)算法的加密字符串中使用。
- 现在 clock_* 功能套件(在
中说明)可直接在主 C 库中使用。之前必须将其与-lrt 链接方可使用这些功能。这一变化的效果是使用此功能的单线程程序,比如 clock_gettime()(它未与 -lrt 链接)将不再会在运行时暗自载入 pthreads 库,同时也不会再受到其他代码(比如 C++ 运行时库)所支持的与多线程关联的消耗的困扰。 - 新的标头
和功能 getauxval() 可让您在经过 Linux 内核时轻松访问 AT_* key-value 对。该标头还定义与 AT_HWCAP 密钥关联的 HWCAP_* 二进制数。 - 已为低层具体平台功能记录了已安装标头的新等级。PowerPC 添加第一个附带功能的事务以便提供基于时间的注册访问。
GDB
在 Red Hat Enterprise Linux 7.0 中,GDB 调试程序来自 gdb-7.6.1 发行本,并包含大量针对 Red Hat Enterprise Linux 6 操作系统对等产品的改进和 bug 修复。
这个版本与 Red Hat Developer Toolset v2.0 中的 GDB 版本对应,以下列出了 Red Hat Enterprise Linux 6 和 Red Hat Enterprise Linux 7.0 GDB 版本之间的不同:
Red Hat Enterprise Linux 7.0 中包含的 GDB 主要新功能有:
- 使用新的 .gdb_index 部分和新的 gdb-add-index shell 命令更迅速地载入符号。注:在 Red Hat Enterprise Linux 6.1 及之后的版本中就有这个功能。
- gdbserver 现在支持标准输入/输出(STDIO)连接,例如:(gdb) target remote | ssh myhost gdbserver – hello
- 使用 -location 参数的 watch 命令有更多行为。
- 可使用一个新命令 info vtbl 显示虚拟方法表。
- 使用新命令 info auto-load, set auto-load 和 show auto-load 控制文件的自动载入。
- 使用 set filename-display absolute 命令显示源文件名的绝对路径。
- 使用新命令 record btrace 控制有硬件支持的流量记录。
Red Hat Enterprise Linux 7.0 所提供 GDB 的主要 bug 修复如下:
- 已将 info proc 命令更新为可用于 core 文件。
- 在下级的所有匹配的位置中设置断点。
- 断点位置的文件名部分现在与源文件名称结尾部分匹配。
- 现在可在内联函数中使用断点。
- 现在可将模板实例化时将模板参数列入范围。
另外,Red Hat Enterprise Linux 7.0 提供一个新软件包 gdb-doc,该软件包包含 PDF、HTML以及信息格式的 GDB 手册。该 GDB 手册在之前的 Red Hat Enterprise Linux 版本中由主 RPM 软件包提供。
性能工具
Red Hat Enterprise Linux 7.0 中包含对一些性能功能的最新更新版本,比如 oprofile, papi 和elfutils,提供性能、可移植性及功能性改进。
此外还有 Red Hat Enterprise Linux 7.0 首先采用的功能:
- 支持 Performance Co-Pilot
- SystemTap 支持在整个非特权用户空间运行的基于 DynInst 检测,同时也支持基于 Byteman 的Java 应用程序精确探测。
- 硬件事务内存的 Valgirnd 支持以及矢量化建模指令的改进。
12.4.1. Performance Co-Pilot
Red Hat Enterprise Linux 7.0 引进 Performance Co-Pilot(PCP)支持,这是一个用来对系统级性能测定进行采集、归档和分析的工具、服务及库套件。其轻加权、分布式架构的特点使其特别适合复杂系统的集中分析。
可使用 Python、Perl、C++ 界面添加性能指标。分析工具可直接使用这些客户端 API(Python、C++ 和 C),且大量网页程序可使用 JSON 界面查看所有可用性能数据。
有关详情请参考 pcp 和 pcp-libs-devel 软件包 man page 中的具体论述。pcp-doc 软件包包括两本来自 upstream 项目的免费公开图书:
http://oss.sgi.com/projects/pcp/doc/pcp-users-and-administrators-guide.pdfhttp://oss.sgi.com/projects/pcp/doc/pcp-programmers-guide.pdf
12.4.2. SystemTap
Red Hat Enterprise Linux 7.0 包含 systemtap 版本 2.4,它可提供一些新功能。这些包括可选的纯用户空间脚本执行、更丰富且有效的 Java 探测、虚拟机探测、改进的报错信息以及大量 bug 修复和新功能。特别是:
- 使用 dyninst 二进制编辑库,SystemTap 现在可以执行一些纯用于用户空间层的脚本;无需提供内核或者 root 特权。这个模式可使用 stap –dyninst 选择,只启用那些对用户自己的进程产生影响的探测或者操作类型。注:这个模式与引发 C++ 异常的程序不兼容。
- 与 byteman 工具联合支持向 Java 应用程序中注入探测的新方法。新的 SystemTap 探测类型 java(“com.app”).class(“class_name“).method(“name(signature)”).*,该探测类型启用了对进入退出某个应用程序的独立方法的探测,无需进行系统范围内的追踪。
- 在 SystemTap 驱动程序中添加了新的程序,该程序可以启用在服务器中运行的由 libvirt 管理的 KVM 事务中执行远程任务。它可将编译的 SystemTap 脚本通过专门的安全 virtio-serial 链接自动且安全地传送到虚拟机中。新的虚拟机端守护进程将载入该脚本并将其输出结果传送回主机。这个方法比 SSH 更快速、有效,且不需要在主机和虚拟机之间建立 IP 级网络连接。要测试此功能,请运行以下命令:
stap --remote=libvirt://MyVirtualMachine
- 另外,对 SystemTap 诊断信息有了大量改进:
- 现在很多信息给出相关手册页供参考。这些页面给出对出错信息的解释及建议修正。
- 如果怀疑脚本输入包含排版错误,则会以分类列表方式向用户提供建议。当用户指定名称与可接受名称不匹配时会在很多上下文中使用这个建议功能,比如探测功能名称、标记符、变量、文件、别名等等。
- 已改进诊断重复信息删除。
- 在信息中添加 ANSI 颜色使其更容易理解。
12.4.3. Valgrind
Red Hat Enterprise Linux 7.0 包含一个检测框架 Valgrind,该框架附带大量工具用于配置应用程序。这个版本是基于 Valgrind 3.9.0 发行本,且包含针对 Red Hat Enterprise Linux 6 和 Red Hat Developer Toolset 2.0 副本的大量改进,后者是在 Valgrind 3.8.1 的基础上开发的。
Red Hat Enterprise Linux 7.0 中包含的 Valgrind 的主要新功能如下:
- 在安装了 DFP 程序的主机中支持 IBM System z 十进制浮点指令。
- 支持 IBM POWER8 (Power ISA 2.07) 指令。
- 支持 Intel AVX2 指令。注:只适用于 64 位架构。
- Intel 事务同步扩展初期支持,包括受限制事务内存(RTM)以及硬件锁定省略(HIE)。
- 在 IBM PowerPC 中对硬件事务内存的初期支持。
- 已将转移缓存默认大小增加到 16 个扇区,表现为大程序需要插入并存储大量代码。同样,可追踪的与内存映射的片段数已增加了 6 倍。转移缓存中的最大扇区数可由新标签 –num-transtab-sectors 控制。
- Valgrind 不再临时生成整个对象的映射以便从中读取数据,而是通过一个小的固定缓存读取。这样可在 Valgrind 从大的共享对象中读取 debug 信息时避免虚拟内存尖波。
- 使用的禁止显示列表(如果指定 -v 选项就会显示)现在为每个使用的禁止显示提示文件名以及定义禁止显示的行号。
- 现在可以使用新标签 –sigill-diagnostics 控制在即时(just-in-time,JIT)编译程序遇到它无法转译的指令时是否给出诊断信息。实际行为 — 向应用程序发出 SIGILL 信号 — 保持不变。
- 已改进 Memcheck 工具,增加了下述功能:
- 处理向量化代码能力的提升,大量减少错报。使用 –partial-loads-ok=yes 标签可从中获益。
- 更好地控制泄露检查。现在可以指定应显示的泄露类型(definite/indirect/possible/reachable),哪些应被视为错误,以及哪些应通过给出泄露抑制而禁止显示。这可通过在 suppression 条目中分别使用选项 –show-leak-kinds=kind1,kind2,..、–errors-for-leak-kinds=kind1,kind2,.. 和自选 match-leak-kinds: 行完成。注:生成的泄露抑制包含这个新行,这比之前的发行本要更具体。要获取与之前发行本相同的行为,请在使用它们前从生成的抑制中删除 match-leak-kinds: 行。
- 使用更好的试探法减少泄露检查程序中的 possible leak 报告。可用的试探法为std::stdstring、带有析构函数元素的新[ ]分配的阵列以及指向使用多个继承的 C++ 项目内置部分提供有效内部指针探测。可使用 –leak-check-heuristics=heur1,heur2,… 选项进行选择。
- 对于堆上分配块更好的 stacktrace 捕获控制。使用 –keep-stacktraces 选项有可能独立控制是否为每个分配和取消分配进行栈跟踪。可使用这个选项生成更好的 “use after free”出错信息,或者通过记录更少的信息减少 Valgrind 的资源消耗。
- 更好地报告泄漏禁止显示使用。已使用禁止显示列表(指定 -v 选项时会显示)现在为每个泄漏禁止显示在上次泄漏搜索中禁止显示的块和字节数。
- 使用以下监控命令改进了 Valgrind GDB 服务器整合:
- 新的监视器命令 v.info open_fds 给出打开的文件描述符及附加信息列表。
- 新的监视器命令 v.info execontext 可显示 Valgrind 记录的栈追踪信息。
- 新的监视器命令 v.do expensive_sanity_check_general 运行某些内部一致性检查。
编程语言
Ruby 2.0.0
Red Hat Enterprise Linux 7.0 提供最新的 Ruby 2.0.0。版本 2.0.0 与 Red Hat Enterprise Linux 6 中所包含版本 1.8.7 的主要不同点在于:
- 新的解释程序 YARV(另一个 Ruby VM),该程序可限制降低载入时间,特别是那些有大树结构或者文件的应用程序。
- 新且迅速的 “Lazy Sweep” 垃圾收集程序。
- Ruby 限制支持字符串编码。
- Ruby 限制支持内部线程而不是绿色线程。
有关 Ruby 2.0.0 的详情请参考该项目的 upstream 页:https://www.ruby-lang.org/en/
Python 2.7.5
Red Hat Enterprise Linux 7.0 包含 Python 2.7.5,它是 Python 2.7 系列发行本的最新版本。这个版本包含很多性能改进,并向前兼容 Python 3。Python 2.7.5 中的主要变化如下:
- 排序的字典类型
- 快速的 I/O 模块
- 集合及代码词典解读
- sysconfig 模块
有关这些变化的完整列表请参考 http://docs.python.org/dev/whatsnew/2.7.html。
Java 7 及多个 JDK
Red Hat Enterprise Linux 提供 OpenJDK7 作为默认 Java 开发套件(JDK),Java 7 作为默认 Java 版本。所有 Java 7 个软件包(java-1.7.0-openjdk, java-1.7.0-oracle, java-1.7.0-ibm)允许平行安装多个版本,类似于内核。平行安装的功能可让用户同时尝试多个 JDK 版本,以便在需要时调节性能并解决问题。准确的 JDK 与原来一样通过备选方法进行选择。
本系列文章来自 RHEL 7.0 的发行注记,完整内容请移步:https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/index.html
0 Comments