如何从可执行文件中查找源文件名?

时间:2012-01-04 09:14:24

标签: c linux

IN LINUX: 不确定是否可能。我有100个源文件和100个相应的可执行文件。 现在,给定可执行文件,是否可以确定相应的源文件。

5 个答案:

答案 0 :(得分:5)

我想你可以尝试一下。

readelf -s a.out | grep FILE

我认为您可以在上述命令中添加一些grepsed魔法并获取源文件名。

答案 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更改为您认为已编写该程序的任何扩展名。