如何将项目共享"system calls"作为单例对象构建和链接到引导加载程序?
How to build and link project sharing "system calls" to bootloader as a singleton object?
我正在尝试构建一个解决方案,其中将有两个项目:"bootloader"(在重置后启动并执行smth)和"mainApplication"从bootloader获得控制。
最初,我只是从这里复制了这个例子:https://visualgdb.com/tutorials/arm/bootloader/
本教程的最后一部分描述了"系统调用"——将指向引导加载程序中某个函数的指针传递给主应用程序,然后从那里调用该函数。
其目的不是传递指向函数的指针,而是传递指向类的对象的指针。
教程中的修改示例如下:
引导程序:
//sys.h
class SysCalls
{
public:
SysCalls();
int sum(int, int);
};
//sys.cpp
#include "sys.h"
SysCalls::SysCalls()
{
}
int SysCalls::sum(int a, int b)
{
return a + b;
}
// main.cpp
#include <sys.h>
...
SysCalls _sys;
void *g_Syscalls[] __attribute__((section(".syscalls"))) = { (void *)&_sys };
主要应用程序:
//main.cpp
#include <sys.h> // the same header as in bootloader
extern "C" void *g_Syscalls[];
SysCalls *_sys = (SysCalls*) g_Syscalls[0];
int main(void)
{
...
int sum = _sys->sum(1, 2);
...
我得到一个链接器错误:
undefined reference to `SysCalls::sum(int, int)'
这是可以预测的,但是。。。
我想知道有什么好方法可以建造这个吗?一些链接器配置?或者我应该将sys.cpp也包含到mainApplication中,并以某种方式使内容不包含在最终二进制文件中吗?
此外,展望未来——如果谈论像所示的sum函数这样只使用堆栈的简单人员,这只是一个链接器问题,但如果我想创建一种"系统服务",比如说使用了一些堆的singleton对象,那么问题是——如果有什么好的方法可以在从bootloader传输控制时冻结该对象使用的堆部分,它被创建到主应用程序的位置,主应用程序应该使用它…
指向数据成员由引导加载程序实例化的对象的指针在应用程序中无效,除非引导加载程序的RAM是永久分配的,而不是由应用程序重用。这本身需要通过链接器进行内存分区。在没有这种内存分区的情况下,唯一有效的类类型是包含不使用静态数据的静态成员函数的类型,因此指向类的指针的唯一好处是具有指向集合if函数的单个指针(这可能不是没有优点的)。
无论哪种方式,虽然可以使用某种链接器配置来管理您的需求,但链接器脚本通常是神秘的,并且不能在工具链之间移植。一个更简单的解决方案是创建一个向量表,其中填充了指向函数、类或对象的指针(尽管有以前的注意事项),并使用链接器和/或编译器链接器指令在ROM中的已知和保留位置定位表。同样的表位置也可以放在应用程序链接映射中。然后,通过将该表作为指针数组进行访问,为每个访问点提供一个已知的索引,就可以简单地提供入口点。
向量不需要是指向函数的指针,您可以将它们(通过强制转换)解释为指向任何实体的指针。尽管存在应用程序上下文中关于对象有效性的宝贵警告。
许多中间件软件组件都使用这种方法。其中一个例子是SoftDevices BT NRF中间件。在链接器脚本中,它为静态对象提供了一些RAM,也为本地堆栈提供了一些空间。"主"程序将此RAM排除在外(SDev占用的闪存区域也被排除在外)。它工作得很好。
它不是真正的引导加载程序-引导加载程序是一个单独的存在,可以访问SDev),因为NRF引导加载程序支持OTA
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 如何在构建链接列表时调整头、尾指针
- 在树莓派上用libtorch构建程序时的链接问题
- 未知的 GCC 链接器错误,但已成功构建
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 链接两个使用 c++ 构建的库_static
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 如何在Windows上链接动态构建的cmake文件
- 使用cmake构建google测试单元测试时出现链接器错误
- 使用 gcc 6 构建 OpenJDK8 时出现链接错误
- 如何在bazel中使用make规则链接库构建
- 使用 pybind11 构建库,链接其他共享库
- 使用 VS2017 构建 OpenSSL 后出现一些链接错误。 " OPENSSL_init_ssl referenced in function _main " ?
- 当我分离编译和链接时,代码不构建
- 尝试使用 gradle 构建指向静态库的 c++ 项目链接时找不到头文件
- Vscode C++调试使用 cl.exe 和 / 链接构建的代码.exe - 调试器不附加
- dev - c++中Boost链接/构建的问题
- 外部链接是否增加了链接/构建时间