强制编译器不要使用.rodata部分

时间:2011-11-07 10:35:35

标签: pointers gcc

有没有办法强制gcc放

char* str = "Hello";

不在.rodata中而不在

中更改此声明
char str[] = "Hello!";


好的,更好的方法是将语句修改为char str[]。谢谢大家。

3 个答案:

答案 0 :(得分:3)

为什么呢?尝试更改字符串文字会导致未定义的行为。这是邪恶的。考虑一下这个程序:

"hello"[0] = 'y';   // Welcome to Undefined Behavior Land. Enjoy yor stay!
std::cout << "hello" << std::endl;   // Could very will print "yello" now!

答案 1 :(得分:1)

static char strbuf[] = "Hello";
char *str = strbuf;

答案 2 :(得分:0)

如果您的平台拥有strdup,或者如果不是自己实施,请如何使用attribute

char *str = strdup("hello world");

这将分配内存(在运行时)并将字符串文字复制到适当大小的内存块中,您可以非常合理地写入并稍后修改。

使用后不要忘记free()

您可以强制GCC使用__attribute__ ((section ("my_section"))) {{3}}将某些内容添加到您选择的特定部分中,但您仍需要修改原始来源才能执行此操作以“正常”的方式做得更好。