linux so 加载路径(linux so 加载)-编程知识网

so是什么文件?

so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。

1、so文件就跟.dll文件差不多。

2、一般来说,so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较它通常是用的Class文件(字节码)。

3、Linux下的so文件时不能直接运行的,一般来讲,.so文件称为共享库。

4、so文件使用方法

(1)动态库的编译。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 不用该标志外部程序无法连接。相当于一个可执行文件。

(2)动态库的链接

这里有个程序源文件 test.c 与动态库 libtest.so 链接生成执行文件 test:

命令:$ gcc test.c -L. -ltest -o test

命令:$ ldd test执行test,可以看到它是如何调用动态库中的函数的。

so格式文件是什么文件?

SO文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。 根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图。

链接视图是链接器从链接的角度看待静态的ELF文件。

从链接视图看ELF文件,ELF文件由多个section组成,不同的section拥有不同的名称,权限。

而装载视图是操作系统从加载ELF文件到内存的角度看待动态的ELF文件。

从装载视图看ELF文件,ELF文件由多个segment,每一个segment都拥有不同的权限,名称。实际上,一个segment是对多个具有相同权限的section的集合。

ubuntu下怎么打包写好的Qt程序?

你可以参考SQLiteStudio这个Qt写的跨平台SQLite管理工具,它自己打包了依赖的Qt库,可以做到解压即用,兼容不同Linux发行版.道理其实跟Windows版Qt程序自带Qt库差不多.

编译前给连接器传一个参数:

说明:

-Wl 表示告诉编译器将后面的参数传递给链接器.

rpath是gcc的一个参数,当程序被加载时,会搜寻rpath目录,寻找共享库.

rpath添加的目录信息保存在可执行文件中.

$ORIGIN表示可执行文件所在的目录.

也就是运行时程序会先去自己所在的目录的lib里去加载依赖库,没有的话再去系统库里找.

如果你的程序在编译时没有传递rpath参数,那你也可以用patchelf来修改你程序的rpath:

注意:patchelf修改文件后再strip会导致文件损坏.

所以应该先用strip删除符号表缩小二进制文件,然后再用patchelf设置rpath.

题外话,Android上既没有glibc库,也没有库链接器ld-linux.so.3.

如果你要把Debian ARM(如树莓派Raspbian)上的软件放到Android上跑,你一样可以打包程序依赖的共享库,让程序也能跑在Android上,比如PHP:

也就是你把库链接器ld-linux-armhf.so.3和PHP依赖的库都放到/data/local/tmp/web/lib里,然后设置个别名,就能在Android的adb shell里运行树莓派的PHP了.

当然,你也可以用patchelf设置PHP的interpreter和rpath,效果差不多:

linuxso是什么文件?

SO文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。

根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图。链接视图是链接器从链接的角度看待静态的ELF文件。

从链接视图看ELF文件,ELF文件由多个section组成,不同的section拥有不同的名称,权限。而装载视图是操作系统从加载ELF文件到内存的角度看待动态的ELF文件。

从装载视图看ELF文件,ELF文件由多个segment,每一个segment都拥有不同的权限,名称。实际上,一个segment是对多个具有相同权限的section的集合。

扩展资料:

由于Android操作系统的底层基于Linux系统,所以SO文件可以运行在Android平台上。Android系统也同样开放了C/C++接口供开发者开发Native程序。

由于基于虚拟机的编程语言JAVA更容易被人反编译,因此越来越多的应用将其中的核心代码以C/C++为编程语言,并且以SO文件的形式供上层JAVA代码调用,以保证安全性。

而ELF头表记录了ELF文件的基本信息,包括魔数,目标文件类型(可执行文件,共享库文件或者目标文件),文件的目标体系结构,程序入口地址(共享库文件为此值为0),然后是section表大小和数目,程序头表的大小和数目,分别对应的是链接视图和装载视图。