linux动态库替换,不要使用 cp 替换正在使用中的Linux 动态库
记得以前如果一个.so被 load 了,应该和程序本身一样,不能覆盖啊,强行覆盖也不会覆盖原来的inode,而是创建新的inode并替换当前目录里面的inode, 原来打开的文件还是正确的。
但是最近发现在 Linux i386 上面 load .so 以后覆盖 .so ,没有任何提示,正在运行的程序退出时侯则通常都会 segfault. 和 sparc 很像了。
难道我记错了吗?
用 strace 看了一下,cp 打开目标文件的时侯,都是在 open 加 O_WRONLY|O_TRUNC|O_LARGEFILE 参数,但是打开正在使用的程序时,就会返回 ETXTBSY, 动态库直接成功。
怀疑 ld-linux.so 在处理 .so 时侯是不是有什么问题,于是 strace 了一下动态库的 load 过程, 发现就是 open O_RDONLY 以后mmap 加 MAP_DENYWRITE 参数,但是 man 了一下 mmap, man page 说这个 MAP_DENYWRITE 参数现在已经被忽略了,原因是会造成 denial of service (我不是很明白这个为啥会造成 DoS),看起来就是这个原因了,mmap 这样并不能阻挡其他程序改写 .so 文件。
但是为啥主程序就可以呢?还是得看 kernel 代码。发现 kernel 内部在加载主程序的时侯,是用的 do_mmap 函数来 mmap 文件的(binfmt_elf.c),参数也有 MAP_DENYWRITE,因为是 kernel 内部函数,所以这个 MAP_DENYWRITE 实际是有效的,在 do_mmap_pg_off 函数(mmap.c)里面也确实可以看到对 MAP_DENYWRITE 参数的处理。
结论就是,Linux ,至少是现在的 Linux 下面无法像 Windows 一样,保护正在使用的 .so 文件,因此开发过程中如果要更新代码,请不要使用 cp 这么粗暴原始的替换方式,还是用 install 来做吧
linux动态库替换,不要使用 cp 替换正在使用中的Linux 动态库相关推荐
- Linux CentOS 复制文件、替换文件 cp 复制文件、cp 覆盖文件 cp替换文件
Linux CentOS 复制文件.替换文件 cp 复制文件.cp 覆盖文件 cp替换文件 一.Linux 复制文件语法 1. cp [option] src dest 2. option 可选参数 ...
- linux sed 选取,linux sed 替换(整行替换,部分替换)、删除delete、新增add、选取...
sed命令行格式为: sed [-nefri] 'command' 输入文本 常用选项: -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上 ...
- 请教大家,如何使用sed命令,替换文件指定行的内容呢?-Linux系统管理-ChinaUnix.net...
请教大家,如何使用sed命令,替换文件指定行的内容呢?-Linux系统管理-ChinaUnix.net
- linux安装替换python3,linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
前言 一般而言,新的 centos 7.x 中自带的 python 都是 2.x 的版本.对于我们运行 python 软件支持并不友好,所以需要进行升级操作 下载 python3 的包之前,要先安装相 ...
- Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51508132 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...
- Linux常见的文件内容查找和替换命令
在Linux服务器部署和运维过程中,经常出现需要查找或者批量替换某个配置文件,这个时候,借用Linux的一些基础命令,来提高工作效率. 1.vi命令下的查找和替换 1.1 vi下的查找 比如有个bas ...
- linux shell 字符串 文件内容 大小写 转换 替换
目录 字符串大小写替换 文件内容大小写替换<原地置换> 文件内容大小写替换<需重定向> 字符串大小写替换 小写替换大写 [root@localhost ~]# echo &qu ...
- 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...
- Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别
Gazebo作为一个运动仿真环境,可以直接加载编写好的机器人模型(如TIAGo和Yumi等),也可以自己构建多个运动模型,不过稍有难度.在构建复杂运动模型前,我们需要熟悉gazebo模型设置以及插件编 ...
最新文章
- CVPR2021直播|点云补全的方法梳理及最新进展分享
- SAS vs SSD各种模式下MySQL TPCC OLTP对比测试结果
- java生成和读取keystore_Java程序员必知:mybaties运行流程
- 大多数日志文件的后缀名是_编程小短文:find,让你随心所欲查找整块磁盘的任意文件...
- Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
- [置顶] Responder一点也不神秘————iOS用户响应者链完全剖析
- C# int转string 每三位加一个逗号
- VMware vsphere Hypervisor、VMware vsphere和VMware Workstation小记
- fiddler 改成中文版的_fiddler中文版
- 【Python实现】运输问题的表上作业法(一):利用伏格尔 (Vogel) 法寻找初始基可行解
- 轻松下载网易云音乐中的歌曲
- itextpdf生成列表基本用法
- 静态类型的 NSUserDefaults
- dubbo源码分析第七篇一服务暴露第三小节一远程暴露内核剖析
- CSS消除absolute 的影响
- ROS中Plugin插件学习
- 【圣诞来了】3分钟教你用java画一颗彩色圣诞树,送给别人作为圣诞礼物吧
- win10下Abaqus 6.14 安装
- 在iOS设备中跑Python脚本
- Office Excel 文件格式保存--兼容模式
热门文章
- Python图片爬取方法总结
- 第四十四节,subprocess系统命令模块
- 批处理taskkill运行结束不掉程序以及停留问题
- kangle web server源代码安装简明教程
- [论文笔记] Anatomy of a crowdsourcing platform - Using the example of microworkers.com (IMIS, 2011)...
- Visual C++ 控制栏
- MapReduce开发总结
- 零基础Java学习之this关键字
- 如何在数字前面填充0,在股票代码前面补上0的三种方法
- messageSource can't replace {0} by params