0

我看到加载threadx模块时,数据部分是在运行时从字节池(在_txm_module_manager_internal_load)分配的。

  1. 有没有办法提前(在模块序言等)定义模块数据的位置?

  2. 模块代码如何知道其全局变量的位置?编译器无法知道它们的地址,因为数据的位置是在运行时确定的(我想在程序集移植的某个地方,数据部分的某个相对地址会随着通过它访问全局变量的每个模块而改变,但是我对手臂组件不太熟悉,无法自己找到它)。

4

2 回答 2

1
  1. 每个模块的数据位置是在运行时确定的。这是为了允许在不同的位置多次加载相同的模块,每个实例都有单独的数据。

  2. 全局变量位于数据区域中。这些模块被编译为与位置无关的代码和与位置无关的数据。在加载模块时,模块启动代码会提供数据的加载地址。对于每个体系结构和编译器,如何实现这一点的细节是不同的。

于 2020-10-15T08:10:56.913 回答
0

@Andrés 已正确回答,但我想添加一些信息。您必须使用与位置无关的代码和数据构建模块(例如,如果使用 ARM 编译器,则使用 ROPI 和 RWPI 选项)。GCC 选项如下所示(我将位置独立所需的相关编译器选项加粗):

arm-none-eabi-gcc -c -g -mcpu=cortex-m4 **-fpie -fno-plt -mpic-data-is-text-relative -msingle-pic-base** txm_module_preamble.s

如果您还有其他问题,请告诉我们。

于 2020-10-16T16:20:25.603 回答