7.11. 编译器和开发工具
glibc
DNS 存根解析器可以正确地处理具有相同事务 ID 的并行查询
在以前的版本中,GNU C 库 glibc
中的 DNS 存根解析器无法对具有相同事务 ID 的并行查询进行正确的响应。因此,当事务 ID 相等时,第二个并行响应不会与查询匹配,从而导致超时和重试。
在这个版本中,第二个并行响应被识别为有效。因此,glibc
DNS 存根解析器可避免因为未识别的响应而造成的大量超时。
使用 fgetsgent()
和 fgetsgent_r()
读取配置文件现在更加灵活
/etc/gshadow
文件中特定的结构化条目,或者读取时文件大小的变化,有时会导致 fgetsgent()
和 fgetsgent_r()
函数返回无效的指针。因此,使用这些功能来读取 /etc/gshadow
或 /etc/
中的其他配置文件的应用会失败,并显示segmentation错误。这个版本修改 fgetsgent()
和 fgetsgent_r()
,以便更加灵活地读取配置文件。因此,应用程序现在可以成功读取配置文件。
glibc
字符串功能现在避免了对 AMD64 和 Intel 64 处理器上的系统缓存造成的负面影响
在以前的版本中,字符串功能的glibc
实现错误地估算了 64 位 AMD 和 Intel 处理器中线程可用的上级缓存量。因此,对大型缓冲区调用 memcpy
函数会对系统的整体缓存性能造成负面影响,或者降低 memcpy
系统调用的速度。
在这个版本中,上层缓存大小不再通过系统中报告的硬件线程数量扩展。现在,字符串现在可以绕过大型缓冲区的缓存,从而避免对系统的其余缓存造成负面影响。
glibc
动态加载程序现在可以避免 libc.so.6
的某些故障
在以前的版本中,当 libc.so.6
共享对象作为主程序运行时(例如,显示 glibc
版本信息),glibc
动态加载程序没有针对使用LD_PRELOAD
环境变量加载的对象正确地重新定位libc.so.6
。因此,当设置了 LD_PRELOAD
时,调用 libc.so.6
有时会导致 libc.so.6
意外终止,并出现segmentation错误。在这个版本中解决了这个程序错误,动态装载程序现在可以正确地处理 libc.so.6的重定位
。因此,上面描述的问题不再发生。
(BZ#1882466)
glibc
动态链接器现在将静态线程本地存储空间的一部分限制为静态 TLS 分配
在以前的版本中,glibc
动态连接器根据先到先服务的原则,为动态TLS使用了所有可用的静态线程本地存储(TLS)空间。因此,在运行时使用 dlopen
函数加载额外的共享对象有时会失败,因为动态 TLS 分配已经消耗了所有可用的静态 TLS 空间。这个问题特别是 64 位 ARM 架构和 IBM Power Systems 发生。
现在,动态链路器将静态 TLS 区域的部分限制为静态 TLS 分配,且不将此空间用于动态 TLS 优化。因此,在使用默认设置的情况下,dlopen
调用可以成功。需要分配的静态 TLS 比默认设置要多的应用程序可以使用新的可调整的glibc.rtld.optional_static_tls
。
glibc
动态链接程序现在禁用对64位ARM变体调用约定的lazy绑定。
在以前的版本中,glibc
动态链接程序没有对使用 64 位 ARM(AArch64)变体调用约定的功能禁用 lazy 绑定。因此,动态链路器在这样的功能调用中破坏了参数,从而导致错误的结果或进程失败。在这个版本中,动态链路器在描述的场景中禁用 lazy 绑定,函数参数会被正确传递。
GCC
rebase 到版本 8.4
GNU Compiler Collection(GCC)已更新至上游版本 8.4,它修复了几个程序错误。