Glibc 2.31 系统库发布

经过六个月的开发 发表 系统库发布 GNU C库 (glibc) 2.31,完全符合ISO C11和POSIX.1-2008的要求。 新版本包括来自 58 位开发人员的修复。

在 Glibc 2.31 中实现 改进 您可以注意:

  • 添加了 _ISOC2X_SOURCE 宏以启用未来 ISO 标准草案中定义的功能 C2X。 当使用 _GNU_SOURCE 宏或使用“-std=gnu2x”标志构建 gcc 时,也会启用这些功能;
  • 对于头文件“math.h”中定义的将结果舍入为较小类型的函数,根据 TS 18661-1:2014 和 TS 规范的要求,在文件“tgmath.h”中建议了相应的通用类型宏18661-3:2015;
  • 添加了 pthread_clockjoin_np() 函数,该函数等待线程完成,同时考虑到超时(如果在完成之前发生超时,该函数将返回错误)。 不像 pthread_timedjoin_np(),在 pthread_clockjoin_np() 中,可以定义用于计算超时的计时器类型 - CLOCK_MONOTONIC(考虑系统在睡眠模式下花费的时间)或 CLOCK_REALTIME;
  • DNS 解析器现在支持 /etc/resolv.conf 中的 trust-ad 选项和 _res.options 中的 RES_TRUSTAD 标志,设置后,DNSSEC 标志将在 DNS 请求中传输 AD (经过验证的数据)。 在此模式下,服务器设置的 AD 标志可供调用 res_search() 等函数的应用程序使用。 默认情况下,如果没有设置建议的选项,glibc不会在请求中指定AD标志,并在响应中自动清除它,表明缺少DNSSEC检查;
  • 为 Glibc 构建工作系统调用绑定不再需要安装 Linux 内核头文件。 64位RISC-V架构是个例外;
  • 被淘汰 漏洞 CVE-2019-19126,这可以让你绕过保护
    具有 setuid 标志的程序中的 ASLR 并通过操作 LD_PREFER_MAP_32BIT_EXEC 环境变量来确定加载的库中的地址布局。

破坏兼容性的更改:

  • Totalorder()、totalordermag() 和其他浮点类型的类似函数现在接受指针作为参数,以消除有关在状态中转换值的警告 为NaN,按照TS 18661-1为未来C2X标准提出的建议。
    直接传递浮点参数的现有可执行文件将继续运行,无需修改;

  • 长期弃用的 stime 函数不再可用于 glibc 链接的二进制文件,并且其定义已从 time.h 中删除。 要设置系统时间,请使用clock_settime函数。 将来,我们计划删除已弃用的 ftime 函数,以及 sys/timeb.h 头文件(应使用 gettimeofday 或clock_gettime 代替 ftime);
  • gettimeofday 函数不再传递有关系统范围内时区的信息(此功能在 4.2-BSD 时代是相关的,并且已被弃用多年)。 现在应该向“tzp”参数传递一个空指针,并且应该使用 localtime() 函数来获取基于当前时间的时区信息。 使用非零“tzp”参数调用 gettimeofday 将返回时区结构中的空 tz_minuteswest 和 tz_dsttime 字段。 gettimeofday 函数本身在 POSIX 下已被弃用(建议使用 Clock_gettime 而不是 gettimeofday),但没有计划将其从 glibc 中删除;
  • settimeofday 不再支持同时传递用于设置时间和时间校正偏移的参数。 调用 settimeofday 时,参数之一(时间或偏移量)现在必须设置为 null,否则函数调用将失败并出现 EINVAL 错误。 与 gettimeofday 一样,settimeofday 函数在 POSIX 中已被弃用,建议用 Clock_settime 函数或 adjtime 系列函数替换;
  • 对 SPARC ISA v7 架构的支持已停止(目前保留 v8 支持,但仅适用于支持 CAS 指令的处理器,例如 LEON 处理器,而不是 SuperSPARC 处理器)。
  • 如果在“懒惰”,其中链接器在第一次调用该函数之前不会搜索该函数的符号,dlopen 函数现在强制进程终止(以前在失败时返回 NULL);
  • 对于 MIPS 硬浮点 ABI,现在使用可执行堆栈,除非构建通过“-enable-kernel=4.8”参数显式限制 Linux 内核 4.8.0+ 的使用(对于 4.8 以下的内核,崩溃是在某些 MIPS 配置中观察到);
  • 与时间操作相关的系统调用周围的绑定已移至使用 time64 系统调用(如果存在)(在 32 位系统上,glibc 首先尝试操作 64 位时间类型的新系统调用,如果没有,则失败回到旧的 32 位调用)。

来源: opennet.ru

添加评论