首页 > 解决方案 > 使 .text 部分只执行

问题描述

我一直试图让我的 .text 部分只执行一段时间,但是链接器坚持将 rodata 与它合并并使其成为 RE。想象一个简单的链接器脚本,我需要 3 个可加载段,.text E、.rodata R、.data RW。

我怎样才能做到这一点?

作为备份解决方案,我可以对 ELF 二进制文件进行后处理,但是我仍然需要 3 个可加载段。谢谢。

标签: linker-scripts

解决方案


通过一些工作,有可能实现这一目标。因此,您需要做的第一件事是将 .text 和 .rodata 段分开,我只能通过手动创建 MEMORY 区域来做到这一点,然后将它们用于代码的每个部分。GCC 永远不会将数据发送到代码段中(如果是,那就是一个错误)。这是一个示例 64 位 RISC-V 链接描述文件:

https://gist.github.com/fwsGonzo/9184d9352ef37bce0ad03e4cef0c0f13

但是,链接器将拒绝从可执行段中删除读取位。为了解决这个问题,我们需要使用 chperm 对二进制文件进行后处理:

https://gist.github.com/fwsGonzo/e3dbcd9097953e7e113fd3f3ada04316

简单地这样称呼它:

chperm <file> 0 x

在 CMake 中,您将像这样对它进行后处理:

add_custom_command(
    TARGET ${NAME} POST_BUILD
    COMMAND ${CHPERM} ${CMAKE_CURRENT_SOURCE_DIR}/${NAME} 0 x
)

我在为自己实现此功能时写了一些话: https ://github.com/riscv/riscv-gnu-toolchain/issues/668


推荐阅读