在 2018-02-02 gnu 发布了 glibc 2.27 版本,其中有很多修改,尤其是向后不兼容的修改,这里根据发布的邮件列表大致整理,如果有错误的地方请联系 我
原邮件列表地址:https://sourceware.org/ml/libc-alpha/2018-02/msg00054.html
主要的新特性
-
支持静态 PIE 可执行文件1
详请参见 INSTALL 中的 –enable-static-pie 选项
注意:使用 –enable-static-pie 选项编译的 libc.a 需要使用 gcc 8 的 -static-pie 来编译 PIE 可执行文件。并且该特性目前只支持 使用 binutils 2.29 的 i386、x86_64 和 x32 平台,以及 使用 binutils 2.30 版本的 aarch64。
-
使用 FMA 指令集优化了 x86_64 平台的以下函数
asin, atan2, exp, expf, log, pow, atan, sin, cosf, sinf, sincosf, tan
-
使用 SSE4.1 指令集优化了 x86_64 平台下的以下函数
trunc, truncf
-
优化了通用的以下函数
expf, exp2f, logf, log2f, powf, sinf, cosf, sincosf
-
malloc 系列函数在检测到 heap corruption 的使用不再打印失败的地址以及栈帧
-
abort 函数会立即终止进程,而不再刷新标准输入输出流
-
在以下 long double 类型是 IEEE 128位格式的平台上,math 库为该该类型实现了_Float128
aarch64, alpha, mips64, riscv, s390, sparc
-
在支持 _Float64x 的以下平台上,math 库实现了接口
aarch64, alpha, i386, ia64, mips64, powerpc64le, riscv, s390, sparc, x86_64
-
math 库为以下类型实现了接口
_Float32, _Float64, _Float32x
-
在 Linux 平台实现了memfd_create 函数 和 mlock2 函数
-
添加了内存保护关键字,头文件 <sys/mman.h> 中声明了以下函数
pkey_alloc, pkey_free, pkey_mprotect, pkey_set, pkey_get
-
增加了 copy_file_range 函数
-
为 sparc M7 平台优化了一下函数
memcpy, mempcpy, memmove, memset
-
ldconfig 处理
include
指令将使用 C/POSIX 整理序2 -
支持 RISC-V ISA 运行在 Linux 上
注意:需要 binutils-2.30, gcc-7.3.0, linux-4.15 以上版本
支持以下 ISA/ABI 对:
- rv64imac lp64
- rv64imafdc lp64
- rv64imafdc lp64d
废弃/移除的特性,以及改变而影响兼容性的特性
-
-
废弃了对 调用了 dlopen 函数的静态链接程序 的支持,将在未来的版本中被移除
-
废弃了对 使用 stdio 内部数据结构和函数的旧程序 的支持,包括 GCC 2.95 中 libstdc++ 提供的 C++ stream
使用以下内部符号的程序将不能在未来的 glibc 版本下正常工作:
_IO_adjust_wcolumn, _IO_default_doallocate, _IO_default_finish, _IO_default_pbackfail, _IO_default_uflow, _IO_default_xsgetn, _IO_default_xsputn, _IO_doallocbuf, _IO_do_write, _IO_file_attach, _IO_file_close, _IO_file_close_it, _IO_file_doallocate, _IO_file_fopen, _IO_file_init, _IO_file_jumps, _IO_fileno, _IO_file_open, _IO_file_overflow, _IO_file_read, _IO_file_seek, _IO_file_seekoff, _IO_file_setbuf, _IO_file_stat, _IO_file_sync, _IO_file_underflow, _IO_file_write, _IO_file_xsputn, _IO_flockfile, _IO_flush_all, _IO_flush_all_linebuffered, _IO_free_backup_area, _IO_free_wbackup_area, _IO_init, _IO_init_marker, _IO_init_wmarker, _IO_iter_begin, _IO_iter_end, _IO_iter_file, _IO_iter_next, _IO_least_wmarker, _IO_link_in, _IO_list_all, _IO_list_lock, _IO_list_resetlock, _IO_list_unlock, _IO_marker_delta, _IO_marker_difference, _IO_remove_marker, _IO_seekmark, _IO_seekwmark, _IO_str_init_readonly, _IO_str_init_static, _IO_str_overflow, _IO_str_pbackfail, _IO_str_seekoff, _IO_str_underflow, _IO_switch_to_main_wget_area, _IO_switch_to_wget_mode, _IO_unsave_wmarkers, _IO_wdefault_doallocate, _IO_wdefault_finish, _IO_wdefault_pbackfail, _IO_wdefault_setbuf, _IO_wdefault_uflow, _IO_wdefault_xsgetn, _IO_wdefault_xsputn, _IO_wdoallocbuf, _IO_wdo_write, _IO_wfile_jumps, _IO_wfile_overflow, _IO_wfile_sync, _IO_wfile_underflow, _IO_wfile_xsputn, _IO_wmarker_delta, or _IO_wsetb
注意:和其他的符号移除不同,这些旧程序不支持使用兼容的符号
-
在 GNU/Linux 上,废除的常量
PTRACE_SEIZE_DEVEL
不再定义在 <sys/ptrace.h> 中 -
libm 不再支持 SVID 错误处理或者
_LIB_VERSION
变量 来控制错误处理使用旧版本的 glibc 库依然可以工作
不再提供 libieee.a 库
math.h 中不再定义 exception 结构体或者
X_TLOSS, DOMAIN, SING, OVERFLOW, UNDERFLOW, TLOSS, PLOSS, HUGE
等宏 -
libm 中的以下函数将不再支持新程序
pow10, pow10f, pow10l
可以使用标准名字 exp10, exp10f, exp10l
-
类型 mcontext_t 将不再和 结构体 sigcontext 相同
-
add-ons 机制被移除
configure 的 –enable-add-ons 选项会被忽略
-
configure 的 –without-fp 选项被忽略
-
以下函数将会检查指定的字符串是否能被作为域名解析
res_hnok, res_dnok, res_mailok, res_ownok
-
在 malloc_info 的输出中,
元素可能会包含其他的 元素"subheaps",其中包含了子堆的数量 -
libresolv 库中的函数 p_secstodate 不再支持新的程序
-
不再支持
tilepro-*-linux-gnu
配置 -
废弃了非标准头文件
<libio.h>
和<_G_config.h>
,在未来的版本中将被移除
构建和运行时需求的修改
- bison 2.7 以及以上版本需要在 intl 子文件夹中生成代码
安全相关的修改
- CVE-2009-5064
- CVE-2017-15670
- CVE-2017-15671
- CVE-2017-15804
- CVE-2017-17426
- CVE-2017-1000408
- CVE-2017-1000409
- CVE-2017-16997
- CVE-2018-1000001
- CVE-2018-6485