是否可以将 MergedGlobals 重新定位到特定的 bss/数据区域?

问题描述 投票:0回答:1

我正在使用 MPU 授予对特定内存区域的访问权限。 (目标是微控制器+zephyr-rtos,rust编译为静态库)。应用程序因 MPU 故障而崩溃。我跟踪了它尝试访问的全局变量,这些全局变量被放入合并的内存区域中,这些区域位于被授予访问权限的内存之外。请参阅地图文件中的以下片段:

.bss..L_MergedGlobals.510
                0x0000000020425038       0x60 /home/marius/...
...
.data..L_MergedGlobals
                0x0000000020456d54        0x8 /home/marius/...
 

我找不到有关这些合并全局变量的太多信息,仅在 llvm 文档中提到了一点

全局变量可以用unnamed_addr来标记,它

表示地址不重要,只有内容。如果这样标记的常量具有相同的初始值设定项,则可以与其他常量合并。请注意,具有有效地址的常量可以与 unnamed_addr 常量合并,结果是地址有效的常量。

然而,该地址对我来说很重要。

所以我的问题是:

  1. 在我自己编写的代码中,我可以指示链接器将值放入特定区域


    #[link_section=stringify!(some_region)]

    
    但是,代码不是我自己编写的,我无法以同样的方式控制它,有没有办法告诉 rustc/llvm 将所有这些合并的值放入特定的命名区域,以便我可以授予对线程的访问权限指定的区域?

  2. 如何找出这些合并的全局变量在 Rust 代码中的位置?我怀疑它们来自某个外部库,甚至可能是核心库。

谢谢!

rust linker llvm zephyr-rtos
1个回答
0
投票
发现这里发生了什么事。

我查看了 Rust 的拆解,看到了一堆这样的行:

...$core..ops..deref..Deref$GT$5deref11__stability4LAZY..., .L_MergedGlobals+16
所以我查看了我取消引用事物的地方。事实证明,我尝试访问的对象位于可访问区域内,但对该对象的引用也是全局的,并且未授予对该对象的访问权限。该引用是 &'static 引用。更改代码以使引用不是静态后,MergedGlobals 消失了。

似乎 &'static 引用被编译器标记为 unnamed_addr,因此它们位于 MergedGlobals 区域中

© www.soinside.com 2019 - 2024. All rights reserved.