rt-thread平臺 動態裝載實現原理

原理分析: a、在連接腳本link.lds裏定義了專門存放動態符號表的段RTMSymTab。app

b、內核對外提供可延時綁定的接口在rtm.h中經過RTM_EXPORT將一對對符號+地址構成的表存放到RTMSymTab段工具

#define RTM_EXPORT(symbol)                                            \
const char __rtmsym_##symbol##_name[] SECTION(".rodata.name") = #symbol; ==》 __wrap_"#symbol   \
const struct rt_module_symtab __rtmsym_##symbol SECTION("RTMSymTab")= \
{                                                                     \
    (void *)&symbol,                                                  \
    __rtmsym_##symbol##_name                                          \
};

 

c(rt-thread原生方案)、編譯的時候經過scons --target=ua -s,內核將有延時綁定的接口頭文件路徑運行放在rtua.py中,    app使用的bsp目錄下帶M_前綴的編譯選項。根據編譯腳本的配置,都將保存在elf文件中。    缺點1:由於其不能區分哪些接口使用內核的,哪些使用C庫的,應用調用的posix接口所有來自內核,這須要內核封裝不少C庫的接口。也就是C庫成爲了內核的一部分。    缺點2:不支持鏈接第三個動態庫。spa

c(改進方案)、scons --export生成kernel_export_conf文件,app執行make的時候會將-wrap過的符號自動加上前綴_wrap_    一、經過wrap解決缺點1,使用wrap修飾的接口使用內核,不然使用C庫。    二、經過完善dlmoudle模塊,支持動態自動查找。    三、經過-shared,將未找到的符號,置0,ndx爲UND,其實及時標記延時綁定(elf相關,readelf工具)。    四、經過–e main解決app的入口不必定是main問題。  線程

d、運行的時候dlmodule_load先讀取並解析elf文件,將其中須要重定位符號表的從新賦值綁定。 e、建立線程,運行app。code

相關文章
相關標籤/搜索