访问可执行文件中的#ident信息?

时间:2013-04-02 20:00:58

标签: c linux gcc

gcc(和其他编译器)support #ident预处理程序指令:

  

'#ident'指令接受一个参数,一个字符串常量。一些   系统,该字符串常量被复制到一个特殊的段中   对象文件。在其他系统上,该指令被忽略。 '#sccs'   指令是'#ident'的同义词。

我看到(带有十六进制转储),例如将其添加到源文件中:

#ident "Hello there !" 

此字符串嵌入在可执行文件中。

现在,有没有可以提取/查看这些字符串的工具(readelf,objdump,gdb或其他工具)?

2 个答案:

答案 0 :(得分:0)

如果安装了RCS,我认为ident命令会显示它们。这假设您以传统方式格式化它们:$keyword: value $

如果没有这个关键字,将ident字符串输入二进制文件的传统方法是将它们放在静态变量中,例如。

static char const rcsid[] =
"$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $";

问题在于您收到有关未使用变量的警告,编译器可能会对它们进行优化。因此,您必须在代码中使用变量的伪造来防止这种情况发生。此外,如果将ident字符串放入头文件中,则必须遵循命名约定以避免冲突。

我找不到#ident放置它们的规范。我怀疑它们只是卡在纯数据部分的某个位置,因此可以像上面的字符串一样找到它们。

答案 1 :(得分:0)

strings -a会找到它 - 还有很多其他东西。 (实验表明,没有strings的{​​{1}}找不到它;显然它没有存储在数据部分中。)

正如名称-a所暗示的那样,它原本打算与旧的SCCS版本控制系统一起使用,该系统可以在检出文件时扩展文件中的关键字。您可以使用稍微更现代的RCS和CVS系统执行类似操作,这些系统具有不同的关键字语法。我不记得SCCS的细节,但对于RCS或CVS,你可以有类似的东西:

#sccs

将在RCS或CVS结账时扩展到,例如

#ident "$Header:$"

然后,您可以使用#ident $Header: /path/to/foo.txt,v 1.6 2013/04/02 20:21:33 yourname Exp $ 命令查找类似的字符串,即使在二进制文件中也是如此。 (ident是RCS的一部分,而不是CVS。)

即使您没有使用RCS或CVS,您仍然可以使用相同的关键字语法:

ident

(但如果您将文件检入RCS或CVS存储库,则可能会破坏您的文本。)