dynamic-linker

来源:互联网 发布:淘宝产品市场调查表 编辑:程序博客网 时间:2024/05/26 19:15


-dynamic-linker     file
    设置动态连接器(dynamic linker)的名字。默认的动态连接器或者是/lib64/ld-linux-x86-64.so.2 或者是/usr/lib/libd1.so.1






装载附加的共享库

在ELF系统上,为了执行一个ELF文件,内核要把控制权交给动态连接器/lib64/ld-linux-x86-64.so.2(在linux上动态连接器是/lib64/ld-linux-x86-64.so.2,版本不同也会不同的,在默认的redhat6.2上是/lib/ld-linux.so.2)。在绝对路径/lib/ld-linux.so.1以二进制存放着。假如动态连接器不存在,没有哪个ELF可执行文件能运行。

动态连接器执行以下一个步骤完成从程序到进程映象:

    1.分析可执行文件中的动态信息section,决定需要哪些库。

    2.定位和映象(map)那些共享库,并且分析它们动态信息section决定是否需要附加的共享库。

    3.为可执行程序和那些需要的共享库执行重定位。

    4.调用共享库中提供的任何初始化函数并且安排共享库提供的清除(cleanup)函数在共享库卸栽出进程空间的时候运行。

    5.传控制给程序

    6.为应用程序提供函数的迟延装定服务

    7.为应用程序提供动态转载服务。

环境变量LD_PRELOAD设置共享库名或者用":"把文件名隔开。动态连接器在任何那些请求的共享库之前把环境变量LD_PRELOAD的共享库装载到进程地址空间去。例如:

# LD_PRELOAD=./mylibc.so myprog

这里./mylibc.so将第一时间map到程序myprog的空间。因为动态连接器在找寻标号的时候总是使用第一次碰到的标号,所以我们可以使用LD_PRELOAD来覆盖标准共享库中的函数。这个特性对程序员来说是很有用的,可用来在还没有建好整个共享库的时候对单个函数功能先做调试实验。

我们可以这样:
#gcc -c -fPIC -O3 print.c
#gcc -shared print.o -o print.so.1.0
创建自己的共享连接库


原创粉丝点击