gcc(和其他编译器)support #ident预处理程序指令:
'#ident'指令接受一个参数,一个字符串常量。一些 系统,该字符串常量被复制到一个特殊的段中 对象文件。在其他系统上,该指令被忽略。 '#sccs' 指令是'#ident'的同义词。
我看到(带有十六进制转储),例如将其添加到源文件中:
#ident "Hello there !"
此字符串嵌入在可执行文件中。
现在,有没有可以提取/查看这些字符串的工具(readelf,objdump,gdb或其他工具)?
答案 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存储库,则可能会破坏您的文本。)