Pointers 强制编译器不使用.rodata节

Pointers 强制编译器不使用.rodata节,pointers,gcc,Pointers,Gcc,有没有办法迫使gcc char* str = "Hello"; 不在.rodata中,而不在中更改此语句 char str[] = "Hello!"; ? 好的,更好的方法是将语句修改为charstr[]。感谢大家。为什么?尝试更改字符串文字将导致未定义的行为。这是邪恶的。考虑这个程序: static char strbuf[] = "Hello"; char *str = strbuf; "hello"[0] = 'y'; // Welcome to Undefined Behav

有没有办法迫使gcc

char* str = "Hello";
不在.rodata中,而不在中更改此语句

char str[] = "Hello!";
?



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

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

static char strbuf[] = "Hello";
char *str = strbuf;
"hello"[0] = 'y';   // Welcome to Undefined Behavior Land. Enjoy yor stay!
std::cout << "hello" << std::endl;   // Could very will print "yello" now!
“你好”[0]=“y”;//欢迎来到未定义的行为世界。祝你住得愉快!

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

"hello"[0] = 'y';   // Welcome to Undefined Behavior Land. Enjoy yor stay!
std::cout << "hello" << std::endl;   // Could very will print "yello" now!
“你好”[0]=“y”;//欢迎来到未定义的行为世界。祝你住得愉快!
std::cout如果您的平台有,那么使用它,如果没有,那么您自己实现它怎么样

char *str = strdup("hello world");
这将分配内存(在运行时)并将字符串文本复制到适当大小的内存块中,稍后您可以合法地写入和修改该内存块

不过,使用后别忘了
free()

您可能可以使用
\uuuu属性(section(“my\u section”))
强制GCC在您选择的特定部分中放置某些内容,但您仍然需要修改原始源代码才能做到这一点,因此您最好使用“正常”方式。

如果您的平台有它,如何使用它,或者自己实现它,如果没有

char *str = strdup("hello world");
这将分配内存(在运行时)并将字符串文本复制到适当大小的内存块中,稍后您可以合法地写入和修改该内存块

不过,使用后别忘了
free()


您可能可以使用
\uuuu属性(section(“my\u section”))
强制GCC在您选择的特定部分中放置一些内容,但您仍然需要修改原始源代码才能做到这一点,因此您最好以“正常”的方式进行操作方法。

为不支持.rodata的目标构建?您的第一行应该真正读作
const char*str=“Hello”
但更重要的是,为什么要排除一种可移植的、标准化的方法呢?即使是第二个版本,文字怎么可能不是只读的呢?在第二个示例中,文字不是真正可写的,可写的是堆栈上的副本。我正在使用rpcgen将程序从本地移植到远程版本。用于封装数据的所有XDR函数都需要指向可编辑区域的指针。为不支持的目标生成。rodata?您的第一行应该真正读取
const char*str=“Hello”
但更重要的是,为什么要排除一种可移植的、标准化的方法呢?即使是第二个版本,文字怎么可能不是只读的呢?在第二个示例中,文字不是真正可写的,可写的是堆栈上的副本。我正在使用rpcgen将程序从本地移植到远程版本。所有用于封装数据的XDR函数都需要指向可编辑区域的指针。这样我需要修改原始程序,而这正是我不想要的。这样我需要修改原始程序,这正是我不想要的。我正在致力于将一个拥有250万行代码的长寿代码库转换为一个新平台和一个更符合标准的编译器。我终于把它编译并链接起来了。我遇到的第一个崩溃是因为有人决定利用前一个编译器将所有内容都放在.data段中这一事实。这种类型的代码需要从这个代码库中删除,但这只是clang的静态分析器和其他优秀工具发现的40000多个问题中的一个。暂时禁用此功能将有助于这样的项目。我正在将一个具有250万行代码的长期代码库转换为在新平台和更符合标准的编译器上编译。我终于把它编译并链接起来了。我遇到的第一个崩溃是因为有人决定利用前一个编译器将所有内容都放在.data段中这一事实。这种类型的代码需要从这个代码库中删除,但这只是clang的静态分析器和其他优秀工具发现的40000多个问题中的一个。暂时禁用此功能将有助于这样的项目。