1. 可执行ELF文件自身加载so的情况如下:
- LD_LIBRARY_PATH是个环境变量可以用来指定加载so的路径,并且优先级高于系统默认的。
- PRATH是ELF格式里的一个数据,它的优先级比LD_LIBRARY_PATH还要高。
- RUNPATH也是ELF格式中的一个数据,如果RUNPATH出现,则RPATH就躲起来了(即RPATH不生效了),LD_LIBRARY_PATH又成了首选。
ELF中的RPATH | ELF中的RUNPATH | LD_LIBRARY_PATH环境变量 | 尝试加载目录的数序 |
未设置 | 未设置 | 未设置 | /lib==>/usr/lib |
未设置 | 未设置 | 设置 | ${LD_LIBRARY_PATH}==>/lib==>/usr/lib |
设置 | 未设置 | 未设置 | ${RPATH}==>/lib==>/usr/lib |
设置 | 未设置 | 设置 | ${RPATH}==>${LD_LIBRARY_PATH}==>/lib==>/usr/lib |
设置或未设置 | 设置 | 设置 | ${LD_LIBRARY_PATH}==>${RUN_PATH}==>/lib==>/usr/lib |
设置或未设置 | 设置 | 未设置 | ${RUN_PATH}==>/lib==>/usr/lib |
2. 怎样让可执行文件链接指定的动态库?
系统中存在soname为libpcre.so.1和libpcre.so.3两个动态库,怎样让编译出来的可执行文件链接libpcre.so.1的soname动态库?
解答:首先使用-L指定动态库的位置,然后使用-l:libpcre.so.1的全名即可。-L${PWD}/usr/lib -l:libpcre.so.1。
3. gcc编译怎样指定特定的链接器?
-Wl,--dynamic-linker=/path/lib/ld-linux-x86-64.so.2