如何在可执行文件中写入所需的信息

How to write informations needed in an executable file

我想知道您是否知道在可执行文件中写入注释或字符串的命令或方法。 事实上,我已经这样做了,使用 XLC 编译器我使用 #pragma comment(user, "string") 完成了但是现在我必须更改为 GCC 但是有一个问题,在 GCC 下无法识别此 #pragma

我的问题是,你知道另一个 #pragma 可以在 gcc 下做到这一点,或者只是另一种处理方法来恢复我编译时写入可执行文件中的信息。

谢谢,埃泽基尔

这里是c/c++程序中的快速solution.String文字,通常放在ELF文件的只读段中。

假设您的评论遵循以下模式:

My_Comment: .... 

您可以在您的程序中添加一些字符串定义:

#include <stdio.h>

void main() {

    char* a = "My Comment: ...";
}

编译:

$ gcc test.c

然后在可执行文件中搜索您的评论模式:

$ strings a.out | grep Comment
My Comment: ...

请问在可执行文件中嵌入注释有什么用例?

跟进:

如果您使用 -O3 标志进行编译,这个未使用的字符串将被优化掉,因此它根本不会存储在 ro 数据中。基于同样的想法,你可以通过以下方式愚弄 gcc:

#include <stdio.h>

void main() {

    FILE* comment = fopen("/dev/null", "w");
    fprintf(comment, "My Comment:");
}

然后搜索您的评论。当然,你会得到 2 或 3 个系统调用的开销,但希望你能忍受它。

让我知道这是否有效!

在 AIX 上使用 xlC_r 系列编译器将一些特定信息放入可执行文件的另一种方法是

#pragma comment(copyright, "whatever")

如果你想要what风格的字符串,那我推荐:

// the Q(S) macro uses ANSI token pasting to get the _value_
// of the macro argument as a string.
#define Q(S) Q_(S)
#define Q_(S) #S
// breaking up the "@(" and "#)" prevent `what` from finding this source file.
#define WHAT(MODULE,VERSION) "@(" "#) " Q(VERSION) " " Q(MODULE) " " __DATE__ " " __TIME__
#pragma comment(copyright, WHAT(ThisProgram,1.2.3.4))

或者您要嵌入的任何特殊字符串。

更新:对于 gcc

请参阅 user2079303 的回答:gcc equivalent of #pragma comment

使用内联汇编程序将字符串添加到 .comment 部分

__asm__(".section .comment\n\t"
        ".string \"Hello World\"\n\t"
        ".section .text");

更新:针对 AIX gcc

这似乎在 AIX gcc 内联汇编器上更好地工作,将字符串添加到 .comment 部分

__asm__(".csect .comment[RO]\n\t"
        ".string \"Hello World\"\n\t"
        ".csect .text[PR]");