Linux库静态替换解析:为什么覆盖动态链接库so会导致进程闪退
总结
遇到一个这样的问题,我最近把公司git ci自动化的流程向更先进的开源社区的方式推进了一点,我们修改了服务端so库,将新编译的so用cp指令覆盖掉旧的so会直接导致所有进程闪退。
但是我们发现先rm旧的文件,再复制新的文件不会导致闪退,这个就非常纳闷了,处于不理解和好奇就深入研究了一下,最终总结是这样:
这个闪退应该是分了几个流程:
- 加载so的时候是把整个so用文件映射到内存里,然后利用文件系统的lazy_load读内存
- cp的时候会复用旧的inode,操作系统对这个文件的索引会被改变
- 程序读取到原来没有的[……]