有一个模板
template<class TValue>
class CDynList{
public:
CDynList(char className[]="");
private:
char name[32];
在另一个文件中,创建了该类的全局对象
CDynList<int> intList("intList");
编译、链接、运行。构造函数必须将字节从 className 复制到对象的 name 字段中。但这不会发生。汇编代码的分析包含必要的操作,但构造函数本身并没有在任何地方调用。
在定义对象变量的同一文件中,有一个向对象添加数据的函数。
bool AppendInt(int i){
return intList.append(i);
}
该函数有效,但类名不可用。构造函数的描述。它在包含文件中。
template<class TValue>
CDynList<TValue>::CDynList(char *className){
bzero(this->name, 32);
mcopy(this->name, className, strlen(className)%31);
};
“找到”解决方案。这是一个链接描述文件和一个过程调用。脚本:
SECTIONS {
PROVIDE (__base = .);
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
.init_array :
{
PROVIDE (__init_array_start = .);
*(.init_array);
PROVIDE (__init_array_end = .);
}
}
程序:
extern "C"
{
extern size_t __init_array_start;
extern size_t __init_array_end;
extern size_t __base;
inline void static_init()
{
for (void (**p)() = reinterpret_cast<void(**)()>(__init_array_start); p < reinterpret_cast<void(**)()>(__init_array_end); ++p)
(*reinterpret_cast<void(**)()>(reinterpret_cast<size_t>(p)+__base))();
}
};
但是当我尝试加载已编译的 UEFI 文件时,我收到“未找到”错误。
在 Habré https://habr.com/post/390837/#comment_17313761的评论中找到了问题的答案
但是需要正确配置ld脚本,否则镜像可能无法启动。我得到了这个脚本:
还有一个调用全局构造函数的函数:
出于某种原因,没有 volatile 和 reinterpret_cast,会在 __init_array_count 中输入 0,但这很可能是由于优化造成的,并不重要。