如果通过 glibc 或 musl 静态链接,则查找 haskell 可执行文件

Finding haskell executable if statically linked via glibc or musl

我有一个通过 ghc 构建的可执行文件,我知道它是静态编译的。我想知道它是通过 glibc 还是基于 musl 的静态链接(主要是因为不鼓励基于 glibc 的静态链接:

我也对一个答案感兴趣,看看是否有适用于任何可执行文件的 非 Haskell 解决方案(基本上是不发货的可执行文件使用 Haskell 的 RTS)。

虽然它仅限于基于 haskell 的可执行文件,但找到它的一种方法是使用 --info 选项:

示例:

$ ./tldr +RTS --info -RTS
 [("GHC RTS", "YES")
 ,("GHC version", "8.6.5")
 ,("RTS way", "rts_thr")
 ,("Build platform", "x86_64-alpine-linux")
 ,("Build architecture", "x86_64")
 ,("Build OS", "linux")
 ,("Build vendor", "alpine")
 ,("Host platform", "x86_64-alpine-linux")
 ,("Host architecture", "x86_64")
 ,("Host OS", "linux")
 ,("Host vendor", "alpine")
 ,("Target platform", "x86_64-alpine-linux")
 ,("Target architecture", "x86_64")
 ,("Target OS", "linux")
 ,("Target vendor", "alpine")
 ,("Word size", "64")
 ,("Compiler unregisterised", "NO")
 ,("Tables next to code", "YES")
 ]

x86_64-apline-linux,我可以确认该构建是基于 Alpine Linux,它基于 musl。您可以通过 ldd 明确确认它确实是静态链接的:

$ ldd ./tldr
        not a dynamic executable

nm 命令列出目标文件中的符号名称。如果这些还没有从您的可执行文件中删除,您可以:

  • nm 你的可执行文件

  • nm glibcmusl

  • 比较列表以找到匹配的符号。 comm 命令可以帮助解决这个问题。

来自Get list of static libraries used in an executable