您可能会将字符串文字声明为 a const volatile
,例如
const volatile char myliteral[] = "some literal string";
您还可以在构建时计算散列,例如在构建过程中有一些东西来提取适当的字符串并单独计算散列。
最后,如果字符串及其散列位于两个不同的翻译单元中(例如 infile1.c
和file2.c
),您需要链接时优化以使内联在构建时发生。使用当前的GCC(即 GCC 4.9 或 5),您需要在编译时和链接时显式传递-flto
以获得链接时优化,因此如果您没有明确地这样做(例如CC=gcc -flto -O2
在您的 中Makefile
),它不会发生.
顺便说一句,您可能会对整个可执行文件、整个共享库或某个给定的目标文件进行校验和。详细信息因操作系统而异。在 Linux 上参见dlopen(3)、dlsym(3)、dladdr(3)、dl_iterate_phdr(5)、 elf(5)、proc(5)
此外,您可以散列初始文字的一些随机后缀子字符串(例如myliteral+random()%strlen(myliteral)
运行时的散列),并保留并与此类部分散列的常量数组进行比较。编译器不太可能内联所有这些!
我实际上认为这在实践中不是一个真正的问题:没有人会关心您的可执行文件,也没有人会花时间反编译它。
顺便说一句,您可以生成一个__timestamp.c
包含时间戳和校验和信息的单独文件(我正在2018 年夏天的bismon项目中这样做),并将其与您的可执行文件链接。