glibc - 在同一个进程中加载​​ musl libc.so 和 gcc libc.so?

标签 glibc elf libc musl

我有一个用 musl libc 编译的共享库

$ readelf -d ./libinterop_d.so 

Dynamic section at offset 0x8ecb0 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/musl/lib]
 0x000000000000000c (INIT)               0x46350
 0x000000000000000d (FINI)               0x7664a
 0x0000000000000019 (INIT_ARRAY)         0x28e700
 0x000000000000001b (INIT_ARRAYSZ)       64 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x28e740
 0x000000000000001c (FINI_ARRAYSZ)       16 (bytes)
 0x0000000000000004 (HASH)               0x158
 0x0000000000000005 (STRTAB)             0xc940
 0x0000000000000006 (SYMTAB)             0x2bc0
 0x000000000000000a (STRSZ)              203286 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000003 (PLTGOT)             0x28f000
 0x0000000000000002 (PLTRELSZ)           28056 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x3f5b8
 0x0000000000000007 (RELA)               0x3e358
 0x0000000000000008 (RELASZ)             4704 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffff9 (RELACOUNT)          46
 0x0000000000000000 (NULL)               0x0

它链接到 musl 的 libc.so

$ ldd ./libinterop_d.so 
    linux-vdso.so.1 =>  (0x00007fff566c9000)
    libc.so => /usr/local/musl/lib/libc.so (0x00007f111398c000)

现在我无法将此共享对象加载到 Java 应用程序中。 但是,如果我将链接恢复回 GNU 的 libc.so,它就可以工作了。

是否可以在同一个进程中同时拥有 GNU 和 musl libc.so? java 应用程序依赖于 GNU 的 libc.so,但我希望我的共享对象使用 musl 的 libc.so

也许有办法将 musl 的 libc.so 重命名为 musl-libc.so

最佳答案

Is it possible to have both GNU and musl libc.so in the same process?

可以同时加载它们,是的。但结果会立即崩溃,所以这是一个无用的事情。

but I want my shared object use musl's libc.so

但为什么呢?

无论如何,你永远不会让 musl 和 glibc 合作,你的选择是要么对一切都使用 glibc,要么对一切都使用 musl。

Maybe there is a way to rename musl's libc.so to musl-libc.so

它们已经以不同的方式命名:libc.solibc.so.6。图书馆的命名并不重要。重要的是它们都提供相同(冲突)符号。

关于glibc - 在同一个进程中加载​​ musl libc.so 和 gcc libc.so?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30151808/

相关文章:

linux - 根据 gdb 信息源找不到源文件

c - getifaddrs 返回 'bad file descriptor'/使应用程序崩溃

libc - 我刚刚在我的机器上销毁了 libc.so。我现在能做什么?

c++ - 乌类图 E : Sub-process/usr/bin/dpkg returned an error code (1)

c - 在 Linux 中分发针对非标准 glibc 编译的 C 程序(即 glibc 2.24)需要什么?

assembly - 创建新的 ELF 可执行文件

linux - .rodata 部分加载到可执行页面

linux - 反汇编为 Intel 语法的 x86 ELF 反汇编程序

c++ - 相当于 LocalAlloc(LMEM_ZEROINIT, size) 的 Posix

c++ - Glibc 的静态链接