使 .text 部分只执行
Make .text section execute-only
一段时间以来,我一直在尝试让我的 .text 部分只执行,但链接器坚持要将 rodata 与其合并并使其成为 RE。想象一个简单的链接描述文件,我需要 3 个可加载段,.text E、.rodata R、.data RW。
我怎样才能做到这一点?
作为备份解决方案,我可以 post 处理 ELF 二进制文件,但是我仍然需要 3 个可加载段。谢谢。
通过一些工作,有可能实现这一目标。因此,您需要做的第一件事是分离 .text 和 .rodata 段,我只能通过手动创建 MEMORY 区域,然后将它们用于每个部分来做到这一点的代码。 GCC 永远不会将数据发送到代码段中(如果发送了,那就是错误)。这是一个示例 64 位 RISC-V 链接描述文件:
https://gist.github.com/fwsGonzo/9184d9352ef37bce0ad03e4cef0c0f13
但是,链接器将拒绝从可执行段中删除 read-bit。为了解决这个问题,我们需要使用 chperm post-process 二进制文件:
https://gist.github.com/fwsGonzo/e3dbcd9097953e7e113fd3f3ada04316
简单地这样称呼它:
chperm <file> 0 x
在 CMake 中你会 post-process 像这样:
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
一段时间以来,我一直在尝试让我的 .text 部分只执行,但链接器坚持要将 rodata 与其合并并使其成为 RE。想象一个简单的链接描述文件,我需要 3 个可加载段,.text E、.rodata R、.data RW。
我怎样才能做到这一点?
作为备份解决方案,我可以 post 处理 ELF 二进制文件,但是我仍然需要 3 个可加载段。谢谢。
通过一些工作,有可能实现这一目标。因此,您需要做的第一件事是分离 .text 和 .rodata 段,我只能通过手动创建 MEMORY 区域,然后将它们用于每个部分来做到这一点的代码。 GCC 永远不会将数据发送到代码段中(如果发送了,那就是错误)。这是一个示例 64 位 RISC-V 链接描述文件:
https://gist.github.com/fwsGonzo/9184d9352ef37bce0ad03e4cef0c0f13
但是,链接器将拒绝从可执行段中删除 read-bit。为了解决这个问题,我们需要使用 chperm post-process 二进制文件:
https://gist.github.com/fwsGonzo/e3dbcd9097953e7e113fd3f3ada04316
简单地这样称呼它:
chperm <file> 0 x
在 CMake 中你会 post-process 像这样:
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