c – 如何让GCC将.text段编译为ELF二进制文件中的可写?

我希望能够动态更改我正在使用的库中的可执行代码.从本质上讲,如果不需要某些功能,我想动态nop.

但是,我使用的库的.text部分是不可写的(大多数程序都是如此).我有库的源代码,因此希望使用GCC将其编译为可写.

有没有办法做到这一点?

解决方法

在一般意义上,mprotect是sys / mman.h(检查 http://linux.die.net/man/2/mprotect)下的首选选项(在符合POSIX的系统上).只需获取进程可执行部分的地址和系统页数,并调用mprotect来请求权限权限;写信给它;然后,再次调用mprotect以释放写入权限.

但是,如果这意味着在速度极为重要的低级例程(或者mprotect不可用)上,那么你将需要编译库,其.text段可写,因为调用mprotect很可能会发出一个翻译旁视缓冲区(TLB)刷新(特别是在多处理器环境中)可以并且将导致瓶颈.如果特定系统通过分页使用硬件保护(现在几乎都是),那么更改保护的唯一方法是执行TLB刷新,必须在每个引用的页面上执行,引用的页面表(页面组),引用页面目录(页表组)和每个处理器.最重要的是,这必须在响铃0中执行,这需要一个系统调用,只需将樱桃放在顶部以便开销.

在后一种情况下,最简单的解决方案是正常编译库,然后使用–writable-text(如ggiroux所述)对其进行objcopy.

另一种解决方案是自己定义链接器映射文件linker.ld.然后,您可以明确指定任何部分的权限.它不太复杂;如果系统依赖.请参阅http://www.math.utah.edu/docs/info/ld_3.html中的文档.您还可以查看系统提供的linker.ld文件并从那里进行修改.传递-Wl,– verbose到gcc将指示链接器吐出所有相关文件(包括认的linker.ld),然后您可以在其中修改.text部分的权限并使用新的重新编译库(永远) linker.ld文件.

总而言之,我的建议是在最后一段中说明并使用略微修改链接描述文件编译您的库.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...