glibc升级导致系统段错误问题解决方案

系统:阿里云ECS CentOS6.5 当前GLIBC版本:2.12 准备升级GLIBC版本:2.19

一,GLIBC介绍
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。内核实现一个功能,glibc要花很久才会用上,由于glibc和内核不是一块开发的,所以glibc需要去兼容不同版本的内核,而内核也要去兼容不同版本的 glibc,双方都背负了太多的历史包袱。
GLIBC官网: http://www.gnu.org/software/libc/

二,升级GLIBC原因
当前ECS上需要装一个nginx,给出的版本是1.15.9,因为用的nginx是已经编译好的,所以编译步骤会不会报错暂时忽略,nginx具体编译参数如下所示:

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.1.1b 26 Feb 2019
TLS SNI support enabled
configure arguments: --prefix=/root/mysql-installer/nginx-1.15.x/deploy/nginx-1.15.9-std --user=nginx --group=nginx --with-pcre=/root/mysql-installer/nginx- 1.15.x/.Source-code-std/third-party/pcre-8.43 --with-zlib=/root/mysql-installer/nginx-1.15.x/.Source-code-std/third-party/zlib-1.2.11 --with-openssl=/root/mysql-installer/nginx-1.15.x/.Source-code-std/third-party/openssl-1.1.1b --with-openssl-opt=enable-tls1_3 --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module

在nginx的sbin目录下,验证时,发现:

当时以为是GLIBC库版本过低,于是自己就下载了GLIBC2.19版本的开始编译,编译过程不再赘述。

三,问题出现的原因
1,编译完成后,需要在系统中指定库文件的路径,于是就在/etc/ld.so.conf.d/glibc.conf(自己手动创建得文件),写入库文件路径:
/opt/glibc-2.19/lib
2,使用ldconfig -v 将库文件生效加载一遍
2,将库文件中的/opt/glibc-2.19/lib/libc.so.6做软连接到系统识别的路径下:
ln -sv /opt/glibc-2.19/lib/libc.so.6 /lib64/libc.so.6
做完这一步无论输入什么命令(实际是已执行),系统都显示段错误:
segmentation fault

四,解决方案
如果是ssh登陆的话,这个时候一定不能退出,否则的话是无论如何也登录不进去的,ldconfig是一个动态链接库管理命令,其中有一个-l参数,文档中是这么描述的:
-l Manually link individual libraries(手动连接单个库).
在其他相同配置的机器下,查看下/lib64/libc.so.6

发现libc.so.6其实是一个软连接文件,这个时候需要你手动的使用ldconfig链接原来的so文件

这个时候系统就恢复如初,不会报段错误之类的问题。

总结: GLIBC是系统底层依赖的文件,自己不要随随便便编译,如果真要升级,那就使用yum升级,不要自己编译,因为编译出来的版本和内核版本之间不一定能兼容在一起,这是个很麻烦的事。

原文地址:https://blog.51cto.com/berniem2m/2369131

时间: 2024-08-25 19:25:33

glibc升级导致系统段错误问题解决方案的相关文章

tomcat ssi配置及升级导致ssi include错误问题解决

最近tomcat升级版本时,遇到了ssi解析的问题,记录下解决的过程,还有tomcat ssi配置的要点. tomcat 配置SSI的两种方式 Tomcat有两种方式支持SSI:Servlet和Filter. SSIServlet 通过Servlet,org.apache.catalina.ssi.SSIServlet,默认处理”*.shtml”的URL. 配置方式: 修改tomcat的 conf/web.xml文件,去掉下面配置的注释: <servlet> <servlet-name&

Linux-Ubuntu 开机一直提示系统内部错误的解决方案

刚装完系统后,才安装一个输入法重启电脑后,竟然就提示'内部错误'需要提交报告,什么状况? 出现'内部错误'的原因是因为Ubuntu引入 Apport , 其实出现的错误并不会对正常使用系统造成印象,所以关闭即可.Apport Ubuntu Wiki [html] view plaincopyprint? sudo gedit  /etc/default/apport 把enabled=1  的值改成0 即 [html] view plaincopyprint? enabled=0 重启计算机,你

CentOS误删除glibc导致系统系统一系列错误的解决办法

因为升级glibc不成功,将老版本的glibc删除,导致系统大部分命令都不能使用,系统不能正常启动.解决办法如下:系统:CentOS release 6.5 (Final)内核:2.6.32-431.el6.x86_64插入系统盘选择系统救援模式默认会将原操作系统挂在到/mnt/sysimage目录下#chroot /mnt/sysimage //切换到原操作系统#mkdir /mnt/cdrom //创建光驱挂载目录#mount /dev/sr0 /mnt/cdrom //挂在光驱#cd /m

oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案

导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0,0) 的存储定义"错误.初步分析是由于数据表是空表导致该问题. Oracle 11G在用EXPORT导出时,空表不能导出 11GR2中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法:一. insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segment.导出时则可导出空表.二. 设置deferred_segment_cr

配置系统未能初始化 错误的解决方案

今天修改了App.config,结果运行的时候出现了 "配置系统未能初始化" 的错误.找了半天才发现是下面的原因造成的: MSDN里写到"如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.". 配置系统未能初始化 错误的解决方案,布布扣,bubuko.com

一个多线程问题引发的血案-(代码段执行完毕,子进程未执行完毕导致段错误)

今天遇到一个问题,gdb执行程序完全没有问题,但直接执行就会段错误,百思不得其解,各种纠结,各种搜索引擎都试了一遍,无果!后来问题还是被我自己挖出来了. 看下边一段代码: int TaskSendControl() { pthread_t prov_thread[CLIENT_NUM]; int prov[CLIENT_NUM]; for(int i=0; i< CLIENT_NUM; i++) { prov[i] = i; if( pthread_create(&prov_thread[i

linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其他g++版本未知)

一.描述 目前已经linux64位系统中g++4.4.7下发现了该bug.其他的版本还未测试. 经测试,如果传入wcsncpy函数第一个参数(即目标缓冲区)的地址不能被4整除的话就必定会发生段错误. 经调试,函数的汇编代码中有使用到movdqa指令,该指令要求参数必须内存对齐,如果参数(目标缓存区)不是内存对齐的,就会造成段错误. 二.测试代码 #include <wchar.h> #pragma pack(1) struct Kom { char c; wchar_t s[32]; }; #

【C语言】 strlen()入参空指针导致段错误

背景: 在工作中调试sqlite3相关代码的时候,调用printf()打印sqlite3_exec()的执行日志:因为sqlite3_exec()保存日志的参数传入时为NULL,且没有执行错误,所以再传入printf()时仍然为NULL:如果判断日志不为空时才打印,则无段错误. 分析: Core was generated by `./hello.cgi'. Program terminated with signal SIGSEGV, Segmentation fault. #0 strlen

Linux系统无法启动故障解决方案

Linux系统无法启动故障解决方案 2011-09-27 09:42 佚名 比特网 我要评论(0) 字号:T | T 不管你多么喜爱你的Linux系统机器,有时候你都必须恢复你的系统.是的,即使一台Linux系统机器也可能遭受系统崩溃:不管是由于视频配置错误.内核更新出错.或是由于init脚本配置错误,这种情况都是必然的. AD:2014WOT全球软件技术峰会北京站 课程视频发布 当你的心爱的linux系统出现故障的时候,你是如何来解决的呢?没有操作系统能够确保100%可靠.终有一天,即使Lin