问题场景

一个新项目需要脱离平台,参考平台的初始化方式,借助自定义段来完成各个模块的初始化工作,这个很简单,各个模块提供一个初始化变量,该变量挂上各个模块对应的初始化钩子,并利用__attribute__((section(“module”)))来修饰,将多个模块的初始化变量都放在同一个段,只需要遍历这个段,就可以实现多个模块的初始化,细节就不赘述了

#define  _module_init __attribute__((section("module")))struct module_obj {char name[32];int (*mp_engine_init)();int(*dp_engine_init)();
}struct module_obj  _module_init test_modlue = {.name = "test_module",.mp_engine_init = NULL,.dp_engine_init = NULL
};

问题1:如何获取段的起始地址与结束地址?

可以在链接的时候通过链接脚本来获取到段的起始地址与结束地址。
利用ld -verbose > test.lds来生成一个默认的链接脚本,打开该脚本,去掉头尾的注释,在.bss段前面加上

.module :
{_start_module_init = .;*(.module)_end_module_init = .;
}

然后在主函数中导入这两个变量,以及编写初始化逻辑

extern struct module_obj _start_module_init;
extern struct module_obj _end_module_init;struct module_obj *ptr = NULL;
for(ptr = &_start_module_init; ptr < &_end_module_init; ptr++)
{//因为随意写的demo,所有没有判空什么的printf("start init :%s\n",ptr->name);ptr->mp_engine_init();ptr->dp_engine_init();printf("end init :%s\n",ptr->name);
}//编译的时候需要加上-T test.lds 来指定链接脚本,如果链接脚本不在当前目录,也可以通过-L来指定链接脚本目录

问题2:各个模块以库的形式提供时,如何使用呢?

以上demo编写时,采用的各个模块与目标程序一起编译,因此存在着很严重的耦合问题,需要将各个模块以库的形式进行提供,由于项目对性能要求很高,因此采用了静态库的方式进行处理。

以前关于编译链接这块的了解很少,都是背的八股文,以为静态库只要链接了,就被被链接到可执行程序中去,即可执行程序中有静态库的所有符号。

实际用的时候被打脸了。链接了该库,但是找不到该库的任何符号,而且自定义段的内容为空。

编写demo测试结果为,只有引用了链接的库的符号时,才会将该库链接到可执行文件中去,因此,产生一个问题,为了解耦才引入的静态库,但是需要引用库内的符号才能链接进可执行程序。

于是参考项目的编译脚本(平台部分的代码看不到,脚本可以看到),发现在编译期间使用了一个编译
选项

-Wl,–whole-archive -ltest_module -Wl,–no-whole-archive

其中test_module为静态库的名字,添加这个编译选项后,即使没有使用该静态库,该静态库也会被链接进可执行程序。

多模块初始化解决方案相关推荐

  1. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  2. Nodejs模块初始化

    模块初始化 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象.之后,缓存起来的导出对象被重复利用. 主模块 通过命令行参数传递给NodeJS以启动程序的模块被称为 ...

  3. ALLEGRO模块无法移动解决方案

    ALLEGRO模块无法移动解决方案 在allegro的一个pcb图里,如果让已经fix的物体移动需要,先unfix在move,但是有些时候unfix之后依然无法移动,下面介绍一下我遇到的情况,选中的这 ...

  4. NetBeans 尚未部署该模块错误 解决方案

    NetBeans 尚未部署该模块错误 解决方案 参考文章: (1)NetBeans 尚未部署该模块错误 解决方案 (2)https://www.cnblogs.com/hxl77/p/4617031. ...

  5. HC-SR04模块初始化

    在进行初始化的时候我们首先要了解超声波模块的工作原理 VCC 供 5V电源,GND 为地线,TRIG 触 发 控 制 信 号 输入,ECHO 回响信号输出等四个接口端 最后看时序图,也就是模块初始化的 ...

  6. BLAM源码解析(一)—— 模块初始化

    接下来写一个开源SLAM算法系列吧,本期介绍BLAM算法.BLAM算法是伯克利的一位大牛写的,首先名字就很有意思,BLAM表示 B(erkeley) L(localization) A(nd) M(a ...

  7. import numpy出现ImportError: DLL load failed: 找不到指定的模块的解决方案

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  8. 金蝶BOS8.2 EAS客户端一直初始化解决方案

    解决方案的客户端启动后,客户端界面一直显示"初始化" 在BOS工作空间工程路径下新建sp文件夹,如在E:\bosworkspace8.2\Project_0\lib 新建sp文件夹 ...

  9. 社群团购平台物流模块整体解决方案-快递鸟

    中国社交电商蓬勃发展,在国民经济中的作用日趋明显.据网经社"电数宝"显示,2020年社交电商市场规模为23000.5亿元,同比增长11.62%.预计2021年交易规模达到28650 ...

最新文章

  1. 阅读豆丁网----基于模型的混合多目标算法的研究
  2. Bitcoin Core P2P网络层
  3. python 动态类型_python学习--动态类型
  4. 2高并发服务器:多路IO之poll
  5. mysql 视图触发器,MySql视图触发器存储过程详解
  6. git clone 获取指定分支的指定commit版本
  7. random_shuffle 和transform算法
  8. linux c 读写mbr_Linux系统启动那点事
  9. python实现炫酷二维码
  10. 手机升降式摄像头有什么优缺点?
  11. cas → 注销登录后跳转到登录页
  12. FlashBuilder 4.6序列号破解
  13. 精益创业实战 - 第1章 基本理念
  14. 大数据职业理解_大数据职业发展方向
  15. linux系统优点和缺点,Linux系统和Windows系统的各自的优缺点有哪些
  16. cura切片软件闪退,添加打印机闪退,导入模型闪退
  17. ABAP 类方法获取长文本内容
  18. mysql的备份恢复原理_MySQL备份恢复-mysqldump原理
  19. Vue3数组使用push,导致数组每一个元素都改变
  20. smss.exe是什么进程?详解Windows会话管理器中的smss.exe

热门文章

  1. 新手学做网站的建议教程
  2. 基于TIA博途的顺序队列(FIFO)先进先出SCL算法程序(V15版本)
  3. gogodroid--android 上的IPV6工具
  4. Java 面向对象(六)
  5. 关于两个模块同时使用Arduino Mega硬串口问题
  6. VR全景制作的展示方式你了解多少?具体有哪些?
  7. 软件测试-5-移动应用测试
  8. 计算机对无人机专业的发展前景,无人机应用专业就业前景大好! 2019年4月1日,人力资源社会保...
  9. Kotlin/DSL(Anko),原汁原味Kotlin开发Android---Activity Fragment与AnkoUI分离,强大的复用,更加便捷的开发
  10. 再先进的在线教学,也要回归这个本质