此外、我在 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 中合并上述代码。 这样其他人就可以开箱即用