2

gcc(和其他编译器)支持#ident 预处理器指令:

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

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

#ident "Hello there !" 

该字符串嵌入到可执行文件中。

现在,是否有任何工具(readelf、objdump、gdb 或其他)可以提取/查看这些字符串?

4

2 回答 2

1

如果您安装了 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放置它们的规范。我怀疑它们只是卡在纯数据部分的某个地方,因此可以像上面的字符串一样找到它们。

于 2013-04-02T20:22:56.603 回答
0

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

顾名思义#sccs,它最初旨在与旧的 SCCS 版本控制系统一起使用,该系统可以在文件签出时扩展文件中的关键字。您可以对稍微更现代的 RCS 和 CVS 系统执行类似的操作,它们具有不同的关键字语法。我不记得 SCCS 的详细信息,但对于 RCS 或 CVS,您可以使用以下内容:

#ident "$Header:$"

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

#ident $Header: /path/to/foo.txt,v 1.6 2013/04/02 20:21:33 yourname Exp $

然后,您可以使用该ident命令来查找类似的字符串,即使在二进制文件中也是如此。(ident是 RCS 的一部分,而不是 CVS。)

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

#ident "$Header: anything you like here$"

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

于 2013-04-02T20:23:59.307 回答