linker-scripts - 使 .text 部分只执行
问题描述
我一直试图让我的 .text 部分只执行一段时间,但是链接器坚持将 rodata 与它合并并使其成为 RE。想象一个简单的链接器脚本,我需要 3 个可加载段,.text E、.rodata R、.data RW。
我怎样才能做到这一点?
作为备份解决方案,我可以对 ELF 二进制文件进行后处理,但是我仍然需要 3 个可加载段。谢谢。
解决方案
通过一些工作,有可能实现这一目标。因此,您需要做的第一件事是将 .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
推荐阅读
- php - 如何从 html 表单中读取 rss 提要
- c# - .Net MVC 中使用 HttpClient 的 Json 对象序列化
- python - 使用opencv进行YUV帧平均
- apache-kafka - 我可以清空当地的卡夫卡国营商店吗
- python - 记录和 paramiko 奇怪的行为
- powershell - 使用 import-pssession 但使用 enter-pssession 时缺少对象方法
- python - 在我的不和谐机器人 python 中从维基百科获取解析器错误
- php - 创建表单时,我收到通知:未定义索引:
- sql - 未嵌套的 json 字符串数组
- android - 在 Fragment 中实现 onBackPressed()