SylixOS动态加载器系列文章(2) 功能介绍
本文介绍SylixOS加载器的功能和APISylixOS中的ELF文件SylixOS中的ELF文件有以下几种:l 内核模块文件(*.ko)。内核模块文件由源文件编译得到的目标文件链接生成,属于“可重定位文件”。l 可执行文件。SylixOS可执行文件由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,应用程序文件必须指定程序入口。l 动态链接库文件(*.so)
本文介绍SylixOS加载器的功能和API
SylixOS中的ELF文件
SylixOS中的ELF文件有以下几种:
l 内核模块文件(*.ko)。内核模块文件由源文件编译得到的目标文件链接生成,属于“可重定位文件”。
l 可执行文件。SylixOS可执行文件由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,应用程序文件必须指定程序入口。
l 动态链接库文件(*.so)。由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,但是没有程序入口。
l 静态链接库文件(*.a)。根据编译得到的目标文件使用归档命令(ar)生成,用于程序链接。
SylixOS应用程序源码编写完成后,首先要使用gcc将源文件编译为中间目标文件,然后再根据情况链接成内核模块、应用程序或库,其流程如图:
图 1‑1 SylixOS ELF文件生成流程
SylixOS动态加载器功能
SylixOS动态加载器具备以下功能:
l 支持内核模块、位置无关的可执行程序及动态库加载。
l 支持加载应用时自动加载应用所依赖的库文件,自动解决依赖关系。
l 支持程序运行过程中通API接口手动加载。
l 支持C++,全局对象自动构建、销毁等操作,支持C++异常处理。
动态库自动装载
链接动态库
自动装载动态库其实是在程序运行前自动装载所依赖的库文件,而具体依赖于哪些库文件在链接时决定。例如,运行下面的链接命令可将libvpmpdm.so、libsubfun.so、libm.a、libgcc.a链接到app可执行程序。链接器会根据条件加载动态库或静态库,本例中的libm.a和libgcc.a为编译器自带的静态库。
arm-sylixos-eabi-g++ -mcpu=cortex-a8 -nostdlib –fPIC –shared–o app app.o
–lvpmpdm -lsubfun –lm –lgcc
链接完成后,可使用arm-sylixos-eabi-readelf命令查看应用程序所依赖的动态库。
C:\Users\Administrator\workspace\app\Debug>arm-sylixos-eabi-readelf-d app
Dynamic section at offset 0x2cc contains 12 entries:
Tag Type Name/Value
0x00000001(NEEDED) Sharedlibrary: [libvpmpdm.so]
0x00000001(NEEDED) Sharedlibrary: [libsubfun.so]
0x00000004(HASH) 0x94
0x00000005(STRTAB) 0x1d4
0x00000006(SYMTAB) 0xe4
0x0000000a(STRSZ) 133 (bytes)
0x0000000b(SYMENT) 16 (bytes)
0x00000003(PLTGOT) 0x8354
0x00000002(PLTRELSZ) 8 (bytes)
0x00000014(PLTREL) REL
0x00000017(JMPREL) 0x25c
0x00000000(NULL) 0x0
下载动态库
使用RealCoder可下载动态库到SylixOS系统,在下载之前,需确定动态库文件在SylixOS系统中的路径。SylixOS中应用程序动态库的搜索路径依次如下:
l shell当前目录,注意不是应用程序所在目录。
l LD_LIBRARY_PATH环境变量中包含的搜索路径。
l PATH环境中包含的搜索路径
以上环境变量中的路径以“:”隔开,动态库查找顺序同路径顺序,可使用“env”命令查看SylixOS环境变量,如下:
[root@sylixos_station:/]# env
variable show >>
VARIABLE REF VALUE
-------------------- -----------------------------------------------------
TERMCAP /etc/termcap
TERM vt100
PATH_LOCALE /usr/share/locale
LC_ALL
LANG C
LD_LIBRARY_PATH /usr/lib:/lib:/usr/local/lib
PATH /usr/bin:/bin:/usr/pkg/sbin:/usr/local/bin
NFS_CLIENT_PROTO udp
NFS_CLIENT_AUTH AUTH_UNIX
SYSLOGD_HOST 0.0.0.0:514
FIO_FLOAT 1
SO_MEM_PAGES 8192
TSLIB_CALIBFILE /etc/pointercal
TSLIB_TSDEVICE /dev/input/touch0
MOUSE /dev/input/mouse0:/dev/input/touch0
KEYBOARD /dev/input/keyboard0
TZ CST-8:00:00
TMPDIR /tmp/
LICENSE SylixOS license: BSD/GPL.
VERSION 1.1.1-rc1
SYSTEM SylixOS kernel version: 1.1.1-rc1 GEMINI(b)
内核模块自动装载
而对于内核模块文件,一方面它不依附任何应用程序,所有无法在启动应用时自动装载。如果要实现内核模块的装载,可在SylixOS启动脚本中使用装载命令实现。SylixOS内核模块装载器不能解决内核模块间的依赖关系,需自行决定模块的加载顺序。SylixOS不会自动去搜索某个路径,需在加载命令中指定,但SylixOS推荐将内核模块下载到“/lib/modules”目录或其子目录。
SylixOS官网:www.sylixos.com
SylixOS源码下载:git.sylixos.com
更多推荐
所有评论(0)