This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM64:AM64xx A53核心上的裸机 C++不调用全局对象## 39;构造函数

Guru**** 1715510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1232345/sk-am64-bare-metal-c-on-a53-core-of-am64xx-is-not-calling-global-objects-constructors

器件型号:SK-AM64

此外、我在 AM64xx 的 A53内核上运行裸机 C++时也遇到问题。 我在 mcu_plus_sdk_am64x_08_05_00_24上、使用 gcc-arm-aarch64-none-eabi_9_2_1。 问题在于当前 SDK 似乎不处理 init_array、fini_array 等、因此不会调用全局对象的构造函数、而其他每个对象的构造函数则会调用。

我通过执行以下操作解决了这一问题:

-确保链接器脚本包含正确的段并且这些段是在 elf 文件中输出的。 仅当我在 ro_data 等段中注入以下内容时、此方法才有效:

provid_dhided (__preinit_array_start =。);
保留(*(.preinit_array))
provid_dhided (__preinit_array_end =。);
provid_dhided (__init_array_start =。);
保留(*(sort_By_init_priority (.init_array*) sort_By_init_priority (.ctors.*)))
keep (*(.init_array exclude_file (* crtbege.o * crtbegate?.o * crtend.o * crtend?.o).ctors)
provid_dhided (__init_array_end =。);
prove_hided (__fini_array_start =。);
保留(*(sort_By_init_priority (.fini_array*) sort_By_init_priority (.dters.*)))
keep (*(.fini_array exclude_file (* crtbege.o * crtbegy?.o * crtend.o * crtend?.o).dtors)
prove_hided (__fini_array_end =。);

但是、如果我创建了名为.preinit_array、.init_array 和.fini_array 的单独段、这些段会被 elf2rprc.js 去除。

 在我的主程序中添加以下代码:

extern void (*__preinit_array_start [])(void)__attribute__(弱));
extern void (*__preinit_array_end [])(void)__attribute__(弱));
extern void (*__init_array_start [])(void)__attribute__(弱));
extern void (*__init_array_end [])(void)__attribute__(弱));
extern void (*__fini_array_start [])(void)__attribute__(弱));
extern void (*__fini_array_end [])(void)__attribute__(弱));

void _libc_init_array (void)
{
size_t 计数;
size_t i;

count =_ preinit_array_end -_ preinit_array_start;
对于(I = 0;I < count;I++)
__ preinit_array_start[i]();

count =__ fini_array_end -_ fini_array_start;
对于(I = 0;I < count;I++)
__fini_array_start[i]();

count =__init_array_end -__ init_array_start;
对于(I = 0;I < count;I++)
___ init_array_start[i]();

所以... 与上述一切运行,但:

1)它是丑要注入这些段在其他地方...  如果 elf2rprc.js 位于名称正确的段中、为什么要去除它们?

2)最好在 SDK 的未来版本中的\mcu_plus_sdk_am64x_08_05_00_24\source\kernel\nortos\DPL\A53\boot_ARMv8.c 中合并上述代码。 这样其他人就可以开箱即用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然,我忘了说,添加的函数将被调用为 main ()中的第一件事...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的提问。

    问题是当前的 SDK 似乎没有处理 init_array

    您能否尝试使用最新的 MCUSDK (www.ti.com/.../08.06.00.43) 并更新结果?

    此致

    阿什瓦尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    几个月前、我遇到了同样的问题: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1171562/sk-am64-a53-gcc-global-variable-constructor-not-called

    我手动调用 main 开始处的构造函数作为变通方法、直到现在

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    手动调用构造函数是不够的、因为在 libc 中也有一些构造函数要调用。 如果你检查 init_array 结构,你会看到。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不、它不会修复任何问题。 只需查看 github.com/.../boot_armv8.c 就可以看出 、其中不包含对 init_array 的任何引用。 正如我在帖子中提到的、你只需插入我在那里建议的代码、并修复可以剥离该部分的 js 脚本。。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="188545" url="~/support/processors-group/processors/f/processors-forum/1232345/sk-am64-bare-metal-c-on-a53-core-of-am64xx-is-not-calling-global-objects-constructors/4692897 #4692897"]手动调用您的构造函数是不够的,因为在 libc 中也有一些构造函数可被调用。 如果你检查 init_array 结构,你会看到。有更多的对象

    我明白了、是的、这是一个问题。 正如另一个线程中的 Pekka VARiS 所说的、TI 尚不支持 C++、因此我不知道我们是否可以对此做任何事情。 也许一些 TI 人员可以告诉我们何时获得 C++支持的时间表。

    我看到您已找到权变措施。 我肯定不会将预编译库用于调试目的、也因为我已经在 DLP 源代码中注入了自己的修改的 interruptAPI、以实现更严格的延迟。 所以下次我修改代码时、我将把代码复制到我的 boot_armv8.c 中、并希望一切能够顺利进行。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dario:

    我通过执行以下操作解决了这一问题:

    -确保链接器脚本包含正确的段并且这些段是在 elf 文件中输出的。 仅当我在 ro_data 等段中注入以下内容时、此方法才有效:

    [/报价]

    谢谢详细的解释。

    正如给定的 e2e 线程 SK-AM64:A53 GC 全局变量构建器未调用中 提到的、 目前我们在 Sitara 系列的 A53内核上没有 C++裸机的示例和支持。  

    此致、

    图沙尔