注:组成共享库的目标文件,在编译时需要加-fPIC选项,例如:$ gcc -c -fPIC stack/stack.h
-f 后跟一些编译选项,PIC表示position Independent Code(位置无关代码);
区别:加了-fPIC的共享库,其各段的加载地址并没有定死,可以加载到任意位置,因为指令中的地址都是相对ebx的,没有使用绝对地址,只要根据实际的家在地址修在ebx就好了。这就是PIC的特点。
动态链接器会在哪些目录下搜索共享库?
1)首先在环境变量LD_LIBRARY_PATH保存的路径中查找;(仅适合于开发调试中临时用一下)
2)从缓存文件中查找,该缓存文件是由ldconfig读取配置文件、etc/ld.so.conf获取的;
3)若还未找到则在默认的系统库文件中查找。
1)详解:
两种方式:①:$ LD_LIBRARY_PATH = /home/akaedu/testdir ./main
②:$ export LD_LIBRARY_PATH = /home/akaedu/testdir
./main
区别:①时,仅当前创建的main进程才获得这个环境变量,shell进程本身并不保存该环境变量,以后执行的其他命令也不会获得它。
2)详解:
把libstack.so所在的目录的绝对路径添加到配置文件、etc/ld.so.conf,然后运行ldconfig;
3)详解:
把libstack.so考到/usr/lib,或/lib中。