应用程序中是否可以存在同一库(具有相同名称)的两个不同版本?

发布于 2024-10-09 07:25:52 字数 267 浏览 0 评论 0原文

我有这样的场景:

产品->平台-> mylibs(version-1)

产品-> mylibs(version-2)

即产品直接使用 mylibs (version-2)。产品还使用平台(这也是一个动态库),平台使用我的库(版本1)。

产品和平台使用的库名称相同。只是版本不同,这两个版本不兼容。

有没有一种方法可以在Linux中使用“.so”库,平台可以链接到一个版本,而产品可以链接到具有相同名称的同一库的另一个版本?

I have some scenario like this:

Product-> Platform-> mylibs(version-1)

Product-> mylibs(version-2)

i.e Product uses mylibs (version-2) directly. Product also uses platform (which is also a dynamic lib) and platform uses my libs (version-1).

The names of the libs used by product and platform are same. Only versions are different and both these versions are not compatible.

Is there a way with ".so" libs in linux that Platform can link to one version and product can link to another version of the same libs having the same name?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傲娇萝莉攻 2024-10-16 07:25:52

请注意,默认情况下即使更改库的名称也是不够的,因为符号名称会发生​​冲突。
您的库应该使用 soname 和版本符号,在这种情况下,它们甚至可以被称为相同的。

$ make
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1  -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1
gcc  -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver  -o program program.c libplatform.so.1 libmylibs.so.2
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2
$ LD_LIBRARY_PATH=$PWD ldd ./program
    linux-vdso.so.1 =>  (0x00007fff1e3ff000)
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000)
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000)
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000)
$ LD_LIBRARY_PATH=$PWD ./program
lib version 2, platform lib version 1

Note, even changing the names of the libs won't be enough by default, as symbol names would conflict.
Your libs should use soname and versioned symbols, in which case they can even be called the same.

$ make
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1  -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1
gcc  -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver  -o program program.c libplatform.so.1 libmylibs.so.2
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2
$ LD_LIBRARY_PATH=$PWD ldd ./program
    linux-vdso.so.1 =>  (0x00007fff1e3ff000)
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000)
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000)
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000)
$ LD_LIBRARY_PATH=$PWD ./program
lib version 2, platform lib version 1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文