7.11. 编译器和开发工具

glibc DNS 存根解析器可以正确地处理具有相同事务 ID 的并行查询

在以前的版本中,GNU C 库 glibc 中的 DNS 存根解析器无法对具有相同事务 ID 的并行查询进行正确的响应。因此,当事务 ID 相等时,第二个并行响应不会与查询匹配,从而导致超时和重试。

在这个版本中,第二个并行响应被识别为有效。因此,glibc DNS 存根解析器可避免因为未识别的响应而造成的大量超时。

(BZ#1868106)

使用 fgetsgent()fgetsgent_r() 读取配置文件现在更加灵活

/etc/gshadow 文件中特定的结构化条目,或者读取时文件大小的变化,有时会导致 fgetsgent()fgetsgent_r() 函数返回无效的指针。因此,使用这些功能来读取 /etc/gshadow/etc/ 中的其他配置文件的应用会失败,并显示segmentation错误。这个版本修改 fgetsgent()fgetsgent_r(),以便更加灵活地读取配置文件。因此,应用程序现在可以成功读取配置文件。

(BZ#1871397)

glibc 字符串功能现在避免了对 AMD64 和 Intel 64 处理器上的系统缓存造成的负面影响

在以前的版本中,字符串功能的glibc 实现错误地估算了 64 位 AMD 和 Intel 处理器中线程可用的上级缓存量。因此,对大型缓冲区调用 memcpy 函数会对系统的整体缓存性能造成负面影响,或者降低 memcpy 系统调用的速度。

在这个版本中,上层缓存大小不再通过系统中报告的硬件线程数量扩展。现在,字符串现在可以绕过大型缓冲区的缓存,从而避免对系统的其余缓存造成负面影响。

(BZ#1880670)

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

(BZ#1871396)

glibc 动态链接程序现在禁用对64位ARM变体调用约定的lazy绑定。

在以前的版本中,glibc 动态链接程序没有对使用 64 位 ARM(AArch64)变体调用约定的功能禁用 lazy 绑定。因此,动态链路器在这样的功能调用中破坏了参数,从而导致错误的结果或进程失败。在这个版本中,动态链路器在描述的场景中禁用 lazy 绑定,函数参数会被正确传递。

(BZ#1893662)

GCC rebase 到版本 8.4

GNU Compiler Collection(GCC)已更新至上游版本 8.4,它修复了几个程序错误。

(BZ#1868446)