1

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

我的问题是,您是否知道另一个#pragma可以在 gcc 下执行此操作的人,或者只是在我编译时恢复写入可执行文件中的信息的另一种处理方式。

谢谢, 埃泽基尔

4

2 回答 2

0

这是一个快速的解决方案。ac/c++ 程序中的字符串文字,通常放在 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 个系统调用的开销,但希望你能忍受它。

让我知道这个是否奏效!

于 2015-09-22T13:31:01.063 回答
0

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

#pragma comment(copyright, "whatever")

如果您想要什么样式的字符串,那么我建议:

// 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 等效于 #pragma 评论

使用内联汇编器将字符串添加到.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]");
于 2015-11-18T18:51:11.343 回答