记得以前如果一个.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 动态库相关推荐

  1. Linux CentOS  复制文件、替换文件 cp 复制文件、cp 覆盖文件 cp替换文件

    Linux CentOS  复制文件.替换文件 cp 复制文件.cp 覆盖文件 cp替换文件 一.Linux 复制文件语法 1. cp [option] src dest 2. option 可选参数 ...

  2. linux sed 选取,linux sed 替换(整行替换,部分替换)、删除delete、新增add、选取...

    sed命令行格式为: sed [-nefri] 'command' 输入文本 常用选项: -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上 ...

  3. 请教大家,如何使用sed命令,替换文件指定行的内容呢?-Linux系统管理-ChinaUnix.net...

    请教大家,如何使用sed命令,替换文件指定行的内容呢?-Linux系统管理-ChinaUnix.net

  4. linux安装替换python3,linux centos 7.x 安装 python3.x 替换 python2.x的过程解析

    前言 一般而言,新的 centos 7.x 中自带的 python 都是 2.x 的版本.对于我们运行 python 软件支持并不友好,所以需要进行升级操作 下载 python3 的包之前,要先安装相 ...

  5. Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51508132 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  6. Linux常见的文件内容查找和替换命令

    在Linux服务器部署和运维过程中,经常出现需要查找或者批量替换某个配置文件,这个时候,借用Linux的一些基础命令,来提高工作效率. 1.vi命令下的查找和替换 1.1 vi下的查找 比如有个bas ...

  7. linux shell 字符串 文件内容 大小写 转换 替换

    目录 字符串大小写替换 文件内容大小写替换<原地置换> 文件内容大小写替换<需重定向> 字符串大小写替换 小写替换大写 [root@localhost ~]# echo &qu ...

  8. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

  9. Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别

    Gazebo作为一个运动仿真环境,可以直接加载编写好的机器人模型(如TIAGo和Yumi等),也可以自己构建多个运动模型,不过稍有难度.在构建复杂运动模型前,我们需要熟悉gazebo模型设置以及插件编 ...

最新文章

  1. CVPR2021直播|点云补全的方法梳理及最新进展分享
  2. SAS vs SSD各种模式下MySQL TPCC OLTP对比测试结果
  3. java生成和读取keystore_Java程序员必知:mybaties运行流程
  4. 大多数日志文件的后缀名是_编程小短文:find,让你随心所欲查找整块磁盘的任意文件...
  5. Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
  6. [置顶] Responder一点也不神秘————iOS用户响应者链完全剖析
  7. C# int转string 每三位加一个逗号
  8. VMware vsphere Hypervisor、VMware vsphere和VMware Workstation小记
  9. fiddler 改成中文版的_fiddler中文版
  10. 【Python实现】运输问题的表上作业法(一):利用伏格尔 (Vogel) 法寻找初始基可行解
  11. 轻松下载网易云音乐中的歌曲
  12. itextpdf生成列表基本用法
  13. 静态类型的 NSUserDefaults
  14. dubbo源码分析第七篇一服务暴露第三小节一远程暴露内核剖析
  15. CSS消除absolute 的影响
  16. ROS中Plugin插件学习
  17. 【圣诞来了】3分钟教你用java画一颗彩色圣诞树,送给别人作为圣诞礼物吧
  18. win10下Abaqus 6.14 安装
  19. 在iOS设备中跑Python脚本
  20. Office Excel 文件格式保存--兼容模式

热门文章

  1. Python图片爬取方法总结
  2. 第四十四节,subprocess系统命令模块
  3. 批处理taskkill运行结束不掉程序以及停留问题
  4. kangle web server源代码安装简明教程
  5. [论文笔记] Anatomy of a crowdsourcing platform - Using the example of microworkers.com (IMIS, 2011)...
  6. Visual C++ 控制栏
  7. MapReduce开发总结
  8. 零基础Java学习之this关键字
  9. 如何在数字前面填充0,在股票代码前面补上0的三种方法
  10. messageSource can't replace {0} by params