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

老于第五章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的其他更好的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值