【问题标题】:how to find source file name from executable?如何从可执行文件中找到源文件名?
【发布时间】:2014-06-24 23:43:38
【问题描述】:

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

【问题讨论】:

  • 这 100 个可执行文件中的每一个都来自一个源代码文件,这是一个既定事实吗?
  • 不,所有文件均来自 100 个源文件。
  • 那么你需要重新提出你的问题。
  • @MikeNakis,已编辑问题,可以吗?

标签: c linux


【解决方案1】:

我想你可以试试这个。

readelf -s a.out | grep FILE

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

【讨论】:

  • 这只是一种启发式方法(而@mouviciel 的strings 是仅次于readelf 的第二好的东西);可以轻松剥离或修改可执行文件..
【解决方案2】:

不,因为您认为单个二进制文件仅来自一个源文件的假设是非常错误的。

大多数实际应用程序包含数百个(如果不是数千个)单独的源文件,这些文件全部单独编译,并将结果组合在一起形成二进制文件。

如果您有非stripped 二进制文件,或者(甚至更好)使用debugging information 编译的二进制文件,那么文件中可能(或将会,对于调试信息的情况)保留信息以允许您找出源文件的名称,但一般情况下,除非您自己构建它们,否则您不会拥有这样的二进制文件。

【讨论】:

    【解决方案3】:

    只有当我们假定这 100 个可执行文件中的每一个都来自一个源文件,并且您拥有所有这些源文件并且能够编译所有这些文件是一个既定事实时,您的问题才有意义。

    您可以做的是在每个源文件中声明一个类似于"HERE!HERE!>>>" + __FILE__ 的字符串,然后编写一个实用程序,在可执行文件中搜索“HERE!HERE!>>>”并解析它后面的字符串。 __FILE__ 是一个预处理器指令,它扩展为正在编译的源文件的完整路径名。

    【讨论】:

    • 如果他自己编译可执行文件,他可以启用添加一点调试信息,就可以做到这一点。 GCC 选项 -g1
    【解决方案4】:

    如果可执行文件中存在源文件名,您可以通过以下方式找到它们:

    strings executable | grep '\.c'
    

    但文件名可能存在也可能不存在于可执行文件中,它们可能代表也可能不代表源文件名。

    .c 更改为您认为程序已写入的任何扩展名。

    【讨论】:

      【解决方案5】:

      这种帮助属于“马跑了后关上谷仓门”之类的东西,但它可能对未来的海报有所帮助。

      这是一个老问题。 UNIX 和 Linux 支持由 Mark Rochkind(如果我没记错的话)为他的 SCCS 版本发明的what 命令。正好处理这类问题。对于一个源文件 -> 一种可执行(或目标文件)类型的东西,它只有 100% 可靠。还有其他更重要的用途。

      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 字符串,因此它们在您当前的代码库中不存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        相关资源
        最近更新 更多