Glibc 2.34 系统库发布

经过六个月的开发,GNU C Library (glibc) 2.34系统库已经发布,完全符合ISO C11和POSIX.1-2017标准的要求。 新版本包含 66 名开发人员的修复。

Glibc 2.34 中实现的一些改进包括:

  • libpthread、libdl、libutil 和 libanl 库集成到主 libc 结构中,在应用程序中使用它们的功能不再需要使用 -lpthread、-ldl、-lutil 和 -lanl 标志进行链接。 已经为将 libresolv 集成到 libc 中做好了准备。 集成将实现更加无缝的 glibc 更新过程,并将简化运行时实现。 提供存根库是为了向后兼容使用旧版本 glibc 构建的应用程序。 由于 glibc 中提供的结构和函数数量的扩展,在名称与以前未使用的 libpthread、libdl、libutil、libresolv 和 libanl 库存在交叉的应用程序中可能会出现问题。
  • 提供在传统上使用 64 位 time_t 类型的配置中使用 32 位 time_t 类型的能力。 在此类配置中,例如在 x86 系统上,默认值仍然是 32 位 time_t,但现在可以使用“_TIME_BITS”宏更改此行为。 此功能仅在 Linux 内核版本至少为 5.1 的系统上可用。
  • 添加了 _Fork 函数,替代 fork 函数,满足“异步信号安全”的要求,即允许从信号处理程序安全调用。 在 _Fork 执行期间,会创建一个足以调用信号处理程序中的函数(例如 raise 和 execve)的最小环境,而不涉及可能更改锁或内部状态的功能。 _Fork 调用将在 POSIX 标准的未来版本中定义,但目前它作为 GNU 扩展包含在内。
  • 对于Linux平台,已经实现了execveat函数,它允许您从打开的文件描述符运行可执行文件。 新函数还用于执行 fexecve 调用,该调用不需要在启动时挂载伪 FS /proc。
  • 添加了 ISO C2X 标准草案中定义的 timespec_getres 函数,该函数扩展了 timespec_get 函数,具有类似于 POSIX Clock_getres 函数的功能。
  • 添加了 close_range() 函数,该函数允许进程一次关闭整个范围的打开文件描述符。 该功能在 Linux 内核版本至少为 5.9 的系统上可用。
  • 新增 closefrom 和 posix_spawn_file_actions_addclosefrom_np 函数,允许一次性关闭所有数量大于或等于指定值的文件描述符。
  • 在“_DYNAMIC_STACK_SIZE_SOURCE”和“_GNU_SOURCE”模式下,PTHREAD_STACK_MIN、MINSIGSTKSZ 和 SIGSTKSZ 不再是常量,从而允许支持动态大小的寄存器集,例如 ARM SVE 扩展中提供的寄存器集。
  • 链接器实现“--list-diagnostics”选项来显示与 IFUNC(间接函数)定义操作和 glibc-hwcaps 子目录选择相关的信息。
  • 宏 __STDC_WANT_IEC_60559_EXT__ 已实现,旨在检查 ISO C2X 规范附录 F 中定义的功能是否存在。
  • 对于 powerpc64* 系统,已实现“--disable-scv”选项,该选项允许您在不支持 scv 指令的情况下构建 glibc。
  • gconv-modules 文件中仅保留最小的核心 gconv 模块集,其余部分将移动到位于 gconv-modules.d 目录中的附加文件 gconv-modules-extra.conf 中。
  • 对于Linux平台,实现了glibc.pthread.stack_cache_size参数,可用于配置pthread堆栈缓存的大小。
  • 头文件中的 inet_neta 函数已被弃用,以及各种很少使用的功能(dn_count_labels、fp_nquery、fp_query、fp_resstat、hostalias、loc_aton、loc_ntoa、p_cdname、p_cdnname、p_class、p_fqname、p_fqnname、p_option、p_query、p_rcode、p_time、p_type、putlong、putshort、res_hostalias、res_isourserver、res_name inquery、res_queriesmatch、res_随机数, sym_ntop 、 sym_ntos 、 sym_ston )和(ns_datetosecs、ns_format_ttl、ns_makecanon、ns_parse_ttl、ns_samedomain、ns_samename、ns_sprintrr、ns_sprintrrf、ns_subdomain)。 建议使用单独的库来处理 DNS,而不是使用这些函数。
  • 函数 pthread_mutex_concient_np、thread_mutexattr_getrobust_np、pthread_mutexattr_setrobust_np 和 pthread_yield 已被弃用,应使用 pthread_mutex_concient、thread_mutexattr_getrobust、hread_mutexattr_setrobust 和 sched_yield 代替。
  • 停止使用符号链接将已安装的共享对象绑定到 Glibc 版本。 这些对象现在按原样安装(例如,libc.so.6 现在是一个文件,而不是 libc-2.34.so 的链接)。
  • 默认情况下,malloc 中的调试功能被禁用,例如 MALLOC_CHECK_ (glibc.malloc.check)、mtrace() 和 mcheck(),这些功能被移至单独的库 libc_malloc_debug.so 中,过时的函数 malloc_get_state 和 malloc_set_state 也已移至该库中被感动了。
  • 在 Linux 上,像 shm_open 和 sem_open 这样的函数现在需要 /dev/shm 设备才能工作。
  • 已修复的漏洞:
    • CVE-2021-27645:在处理特制的网络组请求时,由于对 free 函数的双重调用,nscd(名称服务器缓存守护进程)进程崩溃。
    • CVE-2021-33574:将 SIGEV_THREAD 通知类型与设置了备用 CPU 关联掩码的线程属性一起使用时,在 mq_notify 函数中访问已释放的内存区域(释放后使用)。 该问题可能会导致崩溃,但不能排除其他攻击选项。
    • CVE-2021-35942:wordexp 函数中的参数大小溢出可能会导致应用程序崩溃。

来源: opennet.ru

添加评论