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

时间:2015-05-10 13:09:23

标签: 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

2 个答案:

答案 0 :(得分:4)

  

是否可以在同一个过程中同时使用GNU和musl libc.so?

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

  

但我希望我的共享对象使用musl的libc.so

但为什么?

无论如何,你永远不会让musl和glibc合作,你的选择是要么将glibc用于所有事情,要么将musl用于所有事情。

  

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

他们已经的名称不同:libc.solibc.so.6。图书馆的命名并不重要。它们都提供相同的(冲突的)符号这一事实非常重要。

答案 1 :(得分:-1)

绝对可能但是你需要编写自己的加载器。这是一项重要的任务 - 尽管您可以从现有的“穆斯林”中复制大部分内容。和' glibc'装载机。