【问题标题】:How to tell the linking type of an elf file?如何判断elf文件的链接类型?
【发布时间】:2012-11-19 15:23:51
【问题描述】:

我正在做一个检查 elf 文件的脚本,在某些时候它需要检查它的链接类型。
所以,
Linux 中是否有任何工具或稳定的方式可用于检查输出文件是完全静态链接还是动态链接?

'ld.so --verify' 可以检查文件是否是动态链接的,但它也会检查它是否可以被这个链接器处理,所以我不能用结果来确定链接类型。

'nm','file' 等其他工具会检查输出文件并通过打印消息提供有关链接类型的一些信息,这使得使用起来不太可靠......例如如果我将脚本写入“文件 $filename”的标准输出的 grep 单词“动态链接”“静态链接”,作为对链接类型的验证,感觉不可靠..

那么,有什么简单的方法或者小工具可以检查链接类型吗?或者为什么不可能?

【问题讨论】:

    标签: linux static-linking dynamic-linking


    【解决方案1】:

    您可以在二进制文件上使用ldd,如果它是动态链接的,它会打印共享库并返回0,如果它是静态链接的,它会返回1

    【讨论】:

    • 谢谢。但是我检查了ldd的源代码,不要认为ldd只有在它不是动态链接时才返回1,也可能是其他原因,所以我不能使用那个结果。
    • @user1836141 true,如果文件不存在或者不是elf,你可以在使用ldd之前检查一下,还要注意任何其他命令都会有同样的问题。
    • 有一个名为'readelf -d'的命令检查elf文件的动态部分,但不幸的是,即使其中没​​有动态部分,它也会返回0....否则它可能是解决方案。另一种可能的解决方案是使用'readelf -h'列出elf标题部分,然后grep输出......这又......一点也不漂亮,但可能比其他人更可靠......我不知道......希望我能得到一些更好的解决方案。
    • @user1836141 即使是这样,如果文件不存在或者不是精灵,它仍然会失败,关键是,你应该在调用 ldd 或其他之前进行这些检查,就是这样最可靠的方法。
    • 可以的。但是我真的需要确定在 ldd 中会返回多少错误案例,如果错误多于文件名 failed 左右,那么我自己做所有检查感觉就像重做 ldd 代码的一半 :) 但是是的。可以做到的。谢谢!
    【解决方案2】:

    我不知道有什么实用程序可以专门满足您的需求 - 如前所述,ldd 可以(ab-)用于确定它。 file 也可能有用。但是信息在 ELF 头中,只需要正确解析,所以编写一个简单的程序来做应该不难......

    【讨论】:

    • 如何使用ldd来做到这一点?我猜如果没有现成的工具,那么我需要解析精灵头。
    • 我想这可能取决于您的 ldd 版本 - 我有报告 not a dynamic executable 用于静态链接的二进制文件并以 1 退出代码退出,其中使用动态二进制文件,它列出依赖项并使用 0... 退出
    • 是的,但是正如 Mux 在楼上回答的那样,我认为 ldd 返回错误 1 ​​不仅在它没有动态链接时,也可能是其他错误。所以....
    • 对,所以除非你先检查一下(文件存在,是文件而不是符号链接,目录等,你有它的读取权限,等等......)你可能会得到错误的错误。在这方面file 可能比ldd 更有用,因为您将获得更合适的文件类型文本指示。
    猜你喜欢
    • 2011-04-28
    • 2022-01-22
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多