LD_LIBRARY_PATH环境变量

LD_LIBRARY_PATH环境变量

我正在尝试测试LD_LIBRARY_PATH环境变量。我有一个程序test.c如下:

int main()
{
     func("hello world");
}

我有两个文件 func1.c 和 func2.c:

// func1.c
#include <stdio.h>
void func(const char * str)
{
     printf("%s", str);
}

// func2.c
#include <stdio.h>
void func(const char * str)
{
     printf("No print");
}

我想以某种方式执行以下操作:

  • func1.c和转换func2.c为 .so 文件 - 两者具有相同的名称func.so(它们将被放置在不同的文件夹中,例如dir1dir2
  • 编译test.cst 我只提到它有一个依赖项func.so,但我没有告诉它它在哪里(我希望使用环境变量来查找它)
  • 设置环境变量,第一次尝试dir1,第二次尝试dir2观察每次运行test程序的不同输出

以上可行吗?如果是这样,如何执行步骤2?

我对步骤 1 执行了以下操作(func2 的步骤相同):

$ gcc -fPIC -g -c func1.c
$ gcc -shared -fPIC -o func.so func1.o

答案1

使用ld -soname

$ mkdir dir1 dir2
$ gcc -shared -fPIC -o dir1/func.so func1.c -Wl,-soname,func.so
$ gcc -shared -fPIC -o dir2/func.so func2.c -Wl,-soname,func.so
$ gcc test.c dir1/func.so
$ ldd a.out
    linux-vdso.so.1 =>  (0x00007ffda80d7000)
    func.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f639079e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6390b68000)
$ LD_LIBRARY_PATH='$ORIGIN/dir1:$ORIGIN/dir2' ./a.out
hello world
$ LD_LIBRARY_PATH='$ORIGIN/dir2:$ORIGIN/dir1' ./a.out
No print

-Wl,-soname,func.so(这意味着-soname func.so传递给)在输出中ld嵌入SONAME的属性。func.so您可以通过以下方式检查它readelf -d

$ readelf -d dir1/func.so 

Dynamic section at offset 0xe08 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [func.so]
...

func.so与链接SONAMEa.out其属性中有NEEDED

$ readelf -d a.out

Dynamic section at offset 0xe18 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [func.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

如果没有-Wl,-soname,func.so,您将得到以下结果readelf -d

$ readelf -d dir1/func.so 

Dynamic section at offset 0xe18 contains 24 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

$ readelf -d a.out

Dynamic section at offset 0xe18 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [dir1/func.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

相关内容