- 论坛徽章:
- 0
|
原帖由 whyglinux 于 2007-12-29 20:52 发表 ![]()
>> 这个代码之所以崩溃不是因为不符合C99的语义,是因为linker和loader让它崩溃。
不是这样的。
在程序运行之前,作为静态对象的 "something" 字符串字面量和程序代码已经被 load 进来了。Access violati ...
我哪句话说错了? 你讲清楚点,不要顾左右而言他。
我的意思再明确重说一遍:
static void foo(void)
{
char *str = "aaaaaaa";
printf("%s\n", str);
*str = 'b';
printf("%s\n", str );
}
任何一个支持C99的编译器无论是编译还是链接这段代码,都不应该报error!!!!!
在程序运行之前,作为静态对象的 "something" 字符串字面量和程序代码已经被 load 进来了。
程序运行之前,只是存在于硬盘上的一个elf文件而已。你说load,是什么把字符串常量给load了? load到哪里了 ? 编译链接过程只有relocation, 知道relocation和load的区别么?
"somthing" 这个玩意儿只是被编译器放在elf的rodata段而已,在程序执行前我不知道你说的load操作是谁做的。我倒想听你说清楚。
而且,在执行类似这个函数的代码时,程序完全可以不崩溃!!!!!!! 是否崩溃完全取决于loader
你随便找个2.6 kernel的linux机器,insmod下面这个module, 你看看程序可会崩溃或者出错!!!! 知道内核为什么不报错么? 你能解释么?
#include <linux/module.h>
static void foo(void)
{
char *str = "aaaaaaa";
printk("%s\n", str);
*str = 'b';
printk("%s\n", str );
}
static int
test_init (void)
{
printk("Enter test module\n");
foo();
return 0;
}
static void
test_exit (void)
{
printk ("Goodbye, test\n");
}
module_init (test_init);
module_exit (test_exit);
MODULE_LICENSE ("Dual BSD/GPL");
这样修改字符串常量的地方,在内核里我见过不止一处了。知道如何编译内核,使这个模块insmod会出错么? 你可以好好研究下,一个小问题,细挖下去,内涵很多的。
[ 本帖最后由 fallshuang 于 2007-12-30 02:46 编辑 ] |
|