您的位置:首页 > 其它

今天碰到一个问题,在网上查了一下,发现有人碰到。转一下

2010-08-09 23:36 671 查看
老于第五章P209的exception_handler函数在我的2.6.18的内核编译的时候会出现一个错误:undefined reference to `memset'
这是因为(推断一下应该是这个原因):其中的二维数组err_description[][64]的赋值造成的。在linux编译这段二维数组赋值的时候会调用到C库函数memset。而老于这章的makefile中用ld连接的时候并没有使用-lc选项,所以会有上面提到的错误。当修改makefile增加-lc选项的时候再使用make all,会发现出现一个新的警告:dot moved backwards before `.text'。至于这个是怎么回事以及怎么解决我就不清楚了,也懒得管了,因为我知道所有的这些都是二维数组的赋值方式造成的。所以我就不再采用二维数组的初始化方式赋值(避免库调用memset),而用先定义后赋值的方法(每个人都可以用自己喜欢的方式)。果然程序跑通了,结果和后面老于的例子一致。
PS:如果仍使用-lc选项而忽略由此带来的警告的话程序在虚拟机下运行时会出现错误并让你选择重启。

附上我自己的修改方法:

char *p,*q;//08-11-20----kkk修改
char err_description[20][64];

q=&err_description[0][0];
p="#DE Divide Error";
while((*p!=0)) *q++=*p++;
q=&err_description[1][0];
p="#DB RESERVED";
while((*p!=0)) *q++=*p++;
q=&err_description[2][0];
p="— NMI Interrupt";
while((*p!=0)) *q++=*p++;
q=&err_description[3][0];
p="#BP Breakpoint";
while((*p!=0)) *q++=*p++;
q=&err_description[4][0];
p="#OF Overflow";
while((*p!=0)) *q++=*p++;
q=&err_description[5][0];
p="#BR BOUND Range Exceeded";
while((*p!=0)) *q++=*p++;
q=&err_description[6][0];
p="#UD Invalid Opcode (Undefined Opcode)";
while((*p!=0)) *q++=*p++;
q=&err_description[7][0];
p="#NM Device Not Available (No Math Coprocessor)";
while((*p!=0)) *q++=*p++;
q=&err_description[8][0];
p="#DF Double Fault";
while((*p!=0)) *q++=*p++;
q=&err_description[9][0];
p=" Coprocessor Segment Overrun (reserved)";
while((*p!=0)) *q++=*p++;
q=&err_description[10][0];
p="#TS Invalid TSS";
while((*p!=0)) *q++=*p++;
q=&err_description[11][0];
p="#NP Segment Not Present";
while((*p!=0)) *q++=*p++;
q=&err_description[12][0];
q="#SS Stack-Segment Fault";
while((*p!=0)) *q++=*p++;
q=&err_description[13][0];
p="#GP General Protection";
while((*p!=0)) *q++=*p++;
q=&err_description[14][0];
p="#PF Page Fault";
while((*p!=0)) *q++=*p++;
q=&err_description[15][0];
p="— (Intel reserved. Do not use.)";
while((*p!=0)) *q++=*p++;
q=&err_description[16][0];
p="#MF x87 FPU Floating-Point Error (Math Fault)";
while((*p!=0)) *q++=*p++;
q=&err_description[17][0];
p="#AC Alignment Check";
while((*p!=0)) *q++=*p++;
q=&err_description[18][0];
p="#MC Machine Check";
while((*p!=0)) *q++=*p++;
q=&err_description[19][0];
p="#XF SIMD Floating-Point Exception";
while((*p!=0)) *q++=*p++;

/*
char err_description[][64] = { "#DE Divide Error",
"#DB RESERVED",
"— NMI Interrupt",
"#BP Breakpoint",
"#OF Overflow",
"#BR BOUND Range Exceeded",
"#UD Invalid Opcode (Undefined Opcode)",
"#NM Device Not Available (No Math Coprocessor)",
"#DF Double Fault",
" Coprocessor Segment Overrun (reserved)",
"#TS Invalid TSS",
"#NP Segment Not Present",
"#SS Stack-Segment Fault",
"#GP General Protection",
"#PF Page Fault",
"— (Intel reserved. Do not use.)",
"#MF x87 FPU Floating-Point Error (Math Fault)",
"#AC Alignment Check",
"#MC Machine Check",
"#XF SIMD Floating-Point Exception"
};
*/

暂时还没想到不引发像C库函数memset的其他更好的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐