第 33 章 编译程序及工具

使用 FCoE 从 SAN 引导时的多个程序错误

目前通过以太网光纤通道( Fibre Channel over Ethernet,FCoE)从存储区域网络(Storage Area Network,SAN)引导的实现出现了多个程序错误。红帽的目标是在将来的 Red Hat Enterprise Linux 7 版本中修复这些错误。关于受影响的程序错误和临时解决方案(如果有),请联系您的红帽支持代表。

Valgrind 无法运行根据早期 Open MPI 版本构建的程序

Red Hat Enterprise Linux 7.2 只支持 1.10 版本的 Open MPI 应用程序二进制接口(Application Binary Interface,ABI),它和之前附带的 Open MPI ABI 1.6 不兼容。因此,根据之前的 Open MPI 版本构建的程序无法运行在 Red Hat Enterprise Linux 7.2 附带的 Valgrind 下运行。临时解决方案是在链接到 Open MPI 1.6 的程序使用 Red Hat Developer Toolset 版本的 Valgrind。

GCC 生成的综合函数会干扰 SystemTap

GCC 优化可为其他函数的特定内联副本生成综合函数。这些综合函数类似一级函数,并干扰类似 SystemTap 和 GDB 的工具,因为 SystemTap 探测可同时放在综合函数和实函数入口点。这样就造成每个单一底层函数调用中有多个 SystemTap 探测。
要临时解决这个问题,SystemTap 脚本需要采用反措施,比如探测与内联部分函数有关的递归和抑制探测。例如:以下脚本:
probe kernel.function("can_nice").call { }
可尝试以下操作以避免出现上述问题:
global in_can_nice% probe kernel.function("can_nice").call { in_can_nice[tid()] ++; if (in_can_nice[tid()] > 1) { next } /* real probe handler here */ } probe kernel.function("can_nice").return { in_can_nice[tid()] --; }
注:这个脚本不会考虑所有可能的情况。在有些情况下可能无法如预期工作,例如:缺少 kprobes 或者 kretprobes,或者缺少真正的递归。

ABRT 收集回溯时会生成 SELinux AVC

如果使用 /etc/abrt/plugins/CCpp.conf 配置文件的 CreateCoreBacktrace 选项禁用 ABRT 的新自选功能,即允许在从崩溃的进程中收集回溯时不需要在磁盘中写入 core-dump 文件,则在 abrt-hook-ccpp 工具尝试使用 sigchld 访问崩溃的进程以便获取该进程栈中的函数列表时会生成 SELinux AVC 信息。

即使报告监测点命中 GDB 也会保持其活跃

有时在 64 位 ARM 架构中,GDB 可错误地保持监测点活跃,即使已报告它们命中。这样就造成第二次命中这些监测点,只有这次才不会再将硬件指示识别为监测点,而是显示一个通用 SIGTRAP 信号。可采用几个方法临时解决这个问题,并停止出现大量 SIGTRAP 报告。
* 命中监测点后如果看到 SIGTRAP 则请输入 continue 命令。
* 在 ~/.gdbinit 配置文件中添加以下行,让 GDB 忽略 SIGTRAP 信号:
handle SIGTRAP nostop noprint
* 使用软件监测点而不是对应的硬件监测点。注:使用软件监测点进行调试要缓慢很多,且只能使用 watch 命令(不是 rwatch 或者 awatch)。请在您的 ~/.gdbinit 配置文件中添加以下行:
set can-use-hw-watchpoints 0

使用 grubaa64.efi 引导失败

由于 pxeboot 或者 PXE 配置文件中的问题,使用 7.2 grubaa64.efi 引导装载程序安装 Red Hat Enterprise Linux 7.2 可能会失败,也可能会在引导操作系统时会有显著延迟。作为临时解决方案,请在安装 Red Hat Enterprise Linux 7.2 时使用 7.1 grubaa64.efi 文件而不是 7.2 grubaa64.efi 文件。

GCC 的 MPX 功能需要 libmpx 库的 Red Hat Developer Toolset 版本

libmpx library 的 gcc-libraries 版本缺少 libmpxwrappers 库。这样造成内存保护扩展(MPX)功能可能无法在 GCC 中正常工作,且该应用程序可能无法正确链接。要临时解决这个问题,请使用 libmpx 库的 Red Hat Developer Toolset 4.0 版本。