本文介绍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


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐