向 C 二进制文件添加 ASCII 注释?
Add ASCII comments to a C binary?
我的 C 编程经验极少。
操作系统是Linux。当您对程序文件执行 less
时,它会显示一堆随机字符,但也会显示原始 C 源代码中的一些可读 ASCII 字符。
有没有办法强制在二进制文件中显示注释,最好是在程序文件的开头附近,以便其他人了解它的用途?评论的格式不必很漂亮,连续的一行文字即可。
注释只出现在源代码中,不会出现在二进制文件中。如果您在二进制文件中找到任何可读文本,那是因为您遇到了程序使用的字符串文字。
二进制文件只能由计算机而不是人类读取,因此无论如何在其中包含注释是没有任何意义的。
如果您出于未知原因需要带有注释的二进制文件之类的东西,请从 C 源代码生成 反汇编。它将包含机器代码以及 C 代码和 C 代码注释。
话虽这么说,您 可以 强制程序 link 一个字符串到二进制文件,即使该字符串未被程序使用,通过添加一些东西喜欢:
volatile const char foo [] = "STOP LOOKING AT MY BINARY!";
在某些格式中,您可以将文本字符串添加到一个特殊的 节。但是,这需要对 C 和目标文件格式有更深入的了解,并且是 implementation/OS 具体的。
您可以 - OTOH - 从您的程序中打印一些解释性文本。举个例子试试 less -h
。
二进制文件不应使用 less
实用程序进行流式传输,在不太开明的日子里,您可能会通过这样做严重提升您的终端设置。使用 strings
或 objdump
实用程序在二进制文件中搜索字符串会更安全。
没有好的 方法可以将注释添加到二进制文件中;二进制格式并不意味着人类可读,并且通常不允许自由格式的文本。正如 Lundin 建议的那样,您可以将一些字符串对象添加到您的源代码中,这些对象可以从已编译的二进制文件中提取出来。下面是使用 objdump
工具的示例:
#include <stdio.h>
int main( void )
{
const char *str = "This is a test of the Emergency Broadcast System.";
puts( str );
return 0;
}
编译后,我们可以提取常量字符串数据如下:
[fbgo448@n9dvap997]~/prototypes/words: objdump -d -j.rodata -C foo
foo: file format elf64-x86-64
Disassembly of section .rodata:
0000000000400610 <_IO_stdin_used>:
400610: 01 00 02 00 00 00 00 00 54 68 69 73 20 69 73 20 ........This is
400620: 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 45 6d a test of the Em
400630: 65 72 67 65 6e 63 79 20 42 72 6f 61 64 63 61 73 ergency Broadcas
400640: 74 20 53 79 73 74 65 6d 2e 00 t System..
在ELF格式中,字符串常量存储在二进制文件的.rodata
部分。
不过,这已经很漂亮了。
我的 C 编程经验极少。
操作系统是Linux。当您对程序文件执行 less
时,它会显示一堆随机字符,但也会显示原始 C 源代码中的一些可读 ASCII 字符。
有没有办法强制在二进制文件中显示注释,最好是在程序文件的开头附近,以便其他人了解它的用途?评论的格式不必很漂亮,连续的一行文字即可。
注释只出现在源代码中,不会出现在二进制文件中。如果您在二进制文件中找到任何可读文本,那是因为您遇到了程序使用的字符串文字。
二进制文件只能由计算机而不是人类读取,因此无论如何在其中包含注释是没有任何意义的。
如果您出于未知原因需要带有注释的二进制文件之类的东西,请从 C 源代码生成 反汇编。它将包含机器代码以及 C 代码和 C 代码注释。
话虽这么说,您 可以 强制程序 link 一个字符串到二进制文件,即使该字符串未被程序使用,通过添加一些东西喜欢:
volatile const char foo [] = "STOP LOOKING AT MY BINARY!";
在某些格式中,您可以将文本字符串添加到一个特殊的 节。但是,这需要对 C 和目标文件格式有更深入的了解,并且是 implementation/OS 具体的。
您可以 - OTOH - 从您的程序中打印一些解释性文本。举个例子试试 less -h
。
二进制文件不应使用 less
实用程序进行流式传输,在不太开明的日子里,您可能会通过这样做严重提升您的终端设置。使用 strings
或 objdump
实用程序在二进制文件中搜索字符串会更安全。
没有好的 方法可以将注释添加到二进制文件中;二进制格式并不意味着人类可读,并且通常不允许自由格式的文本。正如 Lundin 建议的那样,您可以将一些字符串对象添加到您的源代码中,这些对象可以从已编译的二进制文件中提取出来。下面是使用 objdump
工具的示例:
#include <stdio.h>
int main( void )
{
const char *str = "This is a test of the Emergency Broadcast System.";
puts( str );
return 0;
}
编译后,我们可以提取常量字符串数据如下:
[fbgo448@n9dvap997]~/prototypes/words: objdump -d -j.rodata -C foo
foo: file format elf64-x86-64
Disassembly of section .rodata:
0000000000400610 <_IO_stdin_used>:
400610: 01 00 02 00 00 00 00 00 54 68 69 73 20 69 73 20 ........This is
400620: 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 45 6d a test of the Em
400630: 65 72 67 65 6e 63 79 20 42 72 6f 61 64 63 61 73 ergency Broadcas
400640: 74 20 53 79 73 74 65 6d 2e 00 t System..
在ELF格式中,字符串常量存储在二进制文件的.rodata
部分。
不过,这已经很漂亮了。