【问题标题】:How does one add a RWX section to a gcc executable for Raspberry Pi如何将 RWX 部分添加到 Raspberry Pi 的 gcc 可执行文件中
【发布时间】:2022-12-13 10:27:47
【问题描述】:

我正在尝试添加一个部分(除了预定义的部分)。我希望该部分是 RWX。

到目前为止我所拥有的是:

SECTIONS
{
  .dictionary :
  {
        *(.dictionary)
  }
}
INSERT AFTER .text;

我使用 -T 链接器选项。

我想在运行时将可执行代码放入其中。有点像可写的 .text 部分

我了解如何通过链接器 -N 选项使 .text 部分可写,但不想采用这种方法以避免意外写入。此外,它还排除了共享库的使用。

我也了解如何通过链接器 -zexecstack 选项将堆栈标记为可执行文件,目前正在使用它,但想看看是否可以添加新的部分。

我很难理解通过列出 --verbose 链接器选项获得的默认链接器脚本。

当我使用上面的内容时,我可以很好地链接。我可以尝试将可执行代码放入该部分,但可执行文件崩溃了。

任何人都有任何指示,或者最好是一个可行的解决方案?基本要求是有一个新的部分,我可以在其中分配空间,在其中放置可执行代码,然后从中执行。

【问题讨论】:

  • 作为替代方案,如何在运行时使用 memmap() 来分配然后复制数据?
  • 使用可执行堆栈,这是我的后备方案,比使用 memmap() 更可取。

标签: assembly linker linker-scripts


【解决方案1】:

我可能偶然发现了答案。 -zexecstack 解决方案有效,但通过 Cortex M0+ 处理器上的 BL 将数据放置在远离分支的地方。

所以,我尝试按照此处的说明进行操作:https://sourceware.org/binutils/docs/as/Section.html

而不是在我的 .s 程序集文件中简单地声明一个部分如下:

.section ".dictionary", #alloc, #write, #execinstr
.align 2
H_START:
.space 0x20000
H_END:

这就像一个魅力,解决了我的问题。

【讨论】:

    猜你喜欢
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多