您的位置:首页 > 其它

SylixOS动态加载器系列文章(2) 功能介绍

2015-06-30 15:31 936 查看

本文介绍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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: