gcc(和其他编译器)支持#ident 预处理器指令:
'#ident' 指令接受一个参数,一个字符串常量。在某些系统上,该字符串常量被复制到目标文件的一个特殊段中。在其他系统上,该指令被忽略。“#sccs”指令是“#ident”的同义词。
我看到(使用十六进制转储),例如将其添加到源文件中:
#ident "Hello there !"
该字符串嵌入到可执行文件中。
现在,是否有任何工具(readelf、objdump、gdb 或其他)可以提取/查看这些字符串?
如果您安装了 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
放置它们的规范。我怀疑它们只是卡在纯数据部分的某个地方,因此可以像上面的字符串一样找到它们。
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 存储库,您的文本可能会被破坏。)