【问题标题】:Finding haskell executable if statically linked via glibc or musl如果通过 glibc 或 musl 静态链接,则查找 haskell 可执行文件
【发布时间】:2021-03-17 20:14:03
【问题描述】:

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

我也想知道是否有适用于任何可执行文件(基本上是不随 Haskell 的 RTS 提供的可执行文件)的非基于 Haskell 的解决方案

【问题讨论】:

  • This answer 声称“一个可执行文件不存储它从中提取目标文件的任何静态库的踪迹。”我想这会归结为某种取证......

标签: linux haskell linker glibc static-linking


【解决方案1】:

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

例子:

$ ./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,我可以确认构建是基于基于musl 的Alpine Linux。您可以通过ldd 明确确认它确实是静态链接的:

$ ldd ./tldr
        not a dynamic executable

【讨论】:

    【解决方案2】:

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

    • nm 你的可执行文件

    • nmglibcmusl

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

    来自Get list of static libraries used in an executable

    【讨论】:

    • 不幸的是,这不起作用,因为没有符号。如果你想玩一个可执行文件,你可以使用这个:github.com/psibi/tldr-hs/releases/download/v0.9.0/…
    • 我链接的问题和其他地方的共识似乎是没有直接的方法可以做到这一点。一个很好的解释是 here 从理论上我想你可以搜索字节模式,但函数往往会被优化器破坏。很想看看有没有人想出点什么……
    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2011-08-22
    • 2013-06-24
    相关资源
    最近更新 更多