How to check if a file is a DLL?
给出一个文件,我要检查这是一个DLL还是共享对象(Linux)或dylib(Mac OS X)或其他东西。我的主要兴趣是区分Linux和Mac OS X上的可执行文件和DLL。对于Windows,扩展名足以解决我的问题。
我已经检查了魔术数字技术在Linux上不起作用,因为可执行文件和共享对象都具有相同的数字。
- 根据我的研究,看来您对魔术没有足够深入的了解-可能不仅仅是一个数字。看我的答案。
-
埃德(Ed),一个DLL通常包含可执行代码。那不一定使它可以独立执行。可能没有入口点。第二个L实质上代表库或"额外代码存储区"。
-
是的,我了解语义,它仍然是一个可执行文件。 support.microsoft.com/kb/87934
-
@EdS不幸的是,您看到的文章是很老的文章,是指Windows 3.1。在16位Windows中,DLL是可执行文件。实际上,它们几乎与EXE文件的所有方式都相同。文件扩展名实际上是唯一的区别。在Windows 3.0(或3.1?)之前,尚未发明DLL后缀,甚至系统DLL都具有EXE文件扩展名。不过,情况已不再如此。 DLL和EXE文件之间在语义上有一些非常重要的区别,它们超出了32位Windows中的文件扩展名。
-
@CodyGray:根据我使用的定义,可执行文件是包含可执行指令的文件。 .EXE是Windows使用的一种格式(PE),但它只是许多格式中的一种。回顾过去(这差不多是三年前!),我确实认为我的解释对这个问题不是很有帮助。是的,那篇文章严重过时了,在链接它之前,我可能应该更仔细地阅读它:)
Unix(Linux和Mac OS X)命令file知道如何识别文件类型。
man file告诉您用于执行此操作的"魔术"信息,尤其是在哪里可以找到具有该信息的文件。
man 5 magic详细描述了文件,还应告诉您文件的位置。您可以在那里查看并从中拉出所需的任何东西。和/或仅来自file源的婴儿床代码。
更新:
请注意,在Linux上,文件可以同时是可执行文件和共享库。
一个示例是/lib/libc.so.6(可以执行的共享库)。
另一个示例:任何使用-pie标志构建的可执行文件都可以用作共享库。有关详细信息,请参见此答案。
使用file工具(对于Linux和Mac OS)。
编写一个程序,尝试加载DLL-如果成功,则为一个:)
编辑:好吧,这对于可执行文件也可能成功:-/