IN LINUX: 不确定是否可能。我有100个源文件和100个相应的可执行文件。 现在,给定可执行文件,是否可以确定相应的源文件。
答案 0 :(得分:5)
我想你可以尝试一下。
readelf -s a.out | grep FILE
我认为您可以在上述命令中添加一些grep
和sed
魔法并获取源文件名。
答案 1 :(得分:2)
不,因为你的假设是单个二进制文件来自一个源文件,所以非常错误。
大多数真正的应用程序包含数百个(如果不是数千个)单独源文件,这些文件都是单独编译的,结果一起形成二进制文件。
如果你有非stripped二进制文件,或者(甚至更好)用debugging information编译的二进制文件,那么可能(或者,对于调试信息)可能是文件中留下的信息允许你弄清楚源文件的名称,但一般情况下你不会有这样的二进制文件,除非你自己构建它们。
答案 2 :(得分:1)
如果我们假设这100个可执行文件中的每一个都来自单个源文件,并且您拥有所有这些源文件并且能够全部编译它们,那么您的问题才有意义。
您可以做的是在每个源文件中声明一个类似"HERE!HERE!>>>" + __FILE__
的字符串,然后编写一个实用程序,搜索“HERE!HERE!>>>”在可执行文件内部并解析它后面的字符串。 __FILE__
是一个预处理程序指令,它扩展为正在编译的源文件的完整路径名。
答案 3 :(得分:1)
这种帮助属于“在马逃跑后关闭谷仓门”的事情,但它可能有助于未来的海报。
这是一个老问题。 UNIX和Linux支持由Mark Rochkind发明的what
命令(如果我没记错的话),因为他的SCCS版本。正是处理这类问题。对于一个源文件,它只有100%可靠 - >一个exectuable(或目标文件)类的东西。还有其他更重要的用途。
char unique_id[] = "@(#)identification information";
@(#)
被称为“什么字符串”,并不作为将源代码编译成可执行映像的副产品而出现。从命令行使用what
。内部代码使用可能是这样的(假设您只获得一个文件名作为答案,因此请仔细选择您的字符串):
char *foo(char *whoami, size_t len_whoami)
{
char tmp[80]={0x0};
FILE *cmd;
sprintf(tmp, "/usr/bin/grep -F -l '%s' /path/to/*.c", unique_id);
cmd=popen(tmp, "r");
fgets(whoami, len_whoami, cmd);
pclose(cmd);
return whoami;
}
将返回源代码文件名,其中包含构建可执行文件的what
字符串。换句话说,正是你所问的,除了我确定你从未听说过what
字符串,所以它们在你当前的代码库中不存在。
答案 4 :(得分:0)
如果源文件名存在于可执行文件中,您可以使用以下命令找到它们:
strings executable | grep '\.c'
但是文件名可能存在也可能不存在于可执行文件中,它们可能代表也可能不代表源文件名。
将.c
更改为您认为已编写该程序的任何扩展名。