今天碰到一个问题,在网上查了一下,发现有人碰到。转一下
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的其他更好的方法。
这是因为(推断一下应该是这个原因):其中的二维数组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的其他更好的方法。
相关文章推荐
- 今天碰到一个poi解析excel文件的时候报错, 后来发现是这个excel文件单元格里面有公式。删除公式问题解决!
- 今天碰到一个listener的问题,记录一下
- 记录一下今天碰到的一个问题
- 今天和朋友发现一个flash读取xml的权限问题
- 今天自定义的block,用的时候发现了一个问题
- 今天发现了一个sql的小问题
- 今天做Delphi控件包安装的时候发现一个问题Never-build package 解决方法
- 在家看一个cms的源代码,发现导航栏由于栏目太多不能显示的问题,在网上找的解决办法
- 今天碰到的一个关于redis的问题
- 今天分公司的人遇到监听方面的问题,从网上搜索方法解决了备注一下
- 今天去面试碰到到一个问题
- 今天上课的时候碰到一个JS问题
- 今天发现一个bug,不知道是什么问题,printf的问题吗,还是什么。先记下!
- 今天碰到了mysql中ibdata1过大的问题,于是深入研究了一下。
- 今天开始研究jetty .发现一个jetty 的 source 中 有一个 threadPool 研究一下
- 今天碰到一个强数据类型集的问题,不知道大家怎么解决呢????
- 今天碰到了一个tablayout的显示问题
- 今天写了一个KMP匹配算法,写好后发现用于拼音匹配时不合适,暂存一下吧
- 碰到一个老同学,突然发现自己的差距,记录一下
- 正确计算linux系统内存使用率 (我今天刚好碰到这个问题, 故转载一下)