背景
ldd是用于查看可执行文件的动态链接库依赖。(也可使用pmap进行查看)
Q:什么是动态链接呢?
- 有动态链接就有静态链接。静态链接是把依赖的第三方库函数打包到一起,其最后生成的可执行文件非常大。动态链接并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从第三方库中读取自己所需的方法。
- 动态链接库,linux下的后缀为so(Shared Object),windows下的后缀为dll(Dynamic Link Libaray)。
注:更多动态链接相关内容可参考下述文章:
https://zhuanlan.zhihu.com/p/235551437
使用
可以使用ldd
查看文件的动态链接依赖,如查看ls依赖的结果如下:
1 | (venvStudy) [root@node1 build_so]# ldd /bin/ls |
通常安装某软件若是报错缺失某个依赖文件时,再结合apt-file
查看文件所在包,然后使用apt
进行安装。
注:Ubuntu下使用
apt-file
涉及到的命令如下:
apt install apt-file
apt-file update
apt-file search libpthread.so.0
CentOS下使用命令yum provides libpthread.so.0
扩展
在技术交流群看到其他人为了防止python代码泄露,有把python代码打包成动态链接库so的,自己不知道还可以这样操作,在此进行记录下。需要先安装Cython
,该库是通过类似python的语法去编写c扩展并可以被python调用。其即具备了python快速开发的特点,又可以让代码运行起来像c一样快,同时还可以方便的调用c library。安装命令如下:pip install Cython -i [https://pypi.mirrors.ustc.edu.cn/simple](https://pypi.mirrors.ustc.edu.cn/simple)
快速开始
新建文件hello.py
,该文件为被打包的目标文件:
1 | def hello(name): |
新建文件setup.py
,该文件是调用Cython
进行打包的文件:
1 | from distutils.core import setup |
接下来直接执行python setup.py
,可以看到打包编译的过程,如果没有报错的话结果输出如下:
1 | (venvStudy) [root@node1 build_so]# ll |
此时已经生成了动态链接库so文件,可以将hello.py
删除,也可以正常调用hello,build
目录下是生成的临时文件。到这里只是大概了解了如何将python代码打包为so文件,想要更好的工程实践见下一部分内容。
工程实践
可使用下述代码进行打包,来自[https://github.com/ArvinMei/py2so/blob/master/py2so.py](https://github.com/ArvinMei/py2so/blob/master/py2so.py)
。
1 | import sys, os, shutil, time |