gpt4 book ai didi

c++ - 如何让 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分?

转载 作者:可可西里 更新时间:2023-11-01 18:11:10 26 4
gpt4 key购买 nike

我希望能够动态更改我正在使用的库中的可执行代码。本质上,如果不需要某些函数,我想动态地 NOP 掉它们。

但是,我正在使用的库的 .text 部分是不可写的(大多数程序都是这种情况)。我有库的源代码,所以想使用 GCC 将其编译为可写。

有办法吗?

最佳答案

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

但是,如果这意味着在速度绝对重要的低级例程中(或者 mprotect 不可用),那么您将需要使用其 编译库调用 mprotect 时可写的 .text 部分很可能会发出转换后备缓冲区 (TLB) 刷新,这(尤其是在多处理器环境中)可能并且将会导致瓶颈。如果特定系统通过分页使用硬件保护(现在几乎所有系统都使用),那么更改保护的唯一方法是执行 TLB 刷新,必须在每个引用页、引用页表(页组)、引用页目录(页表组)和每个处理器。最重要的是,这必须在 ring 0 中执行,这需要一个系统调用,它只是将 cherry 放在首位以进行开销。

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

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

总而言之,我的建议是按照最后一段所述,使用稍微修改过的链接描述文件编译您的库。

关于c++ - 如何让 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com