LDD3中的setlevel.c程序的问题

发布于 2022-09-18 18:08:57 字数 1953 浏览 14 评论 0

在ldd3中的源码包里面,有一个改变console_loglevel的程序,为什么编译通不过呢?

  1. 1
  2. 2 #include <stdio.h>
  3. 3 #include <stdlib.h>
  4. 4 #include <string.h>
  5. 5#include <errno.h>
  6. 6 #define __LIBRARY__ /* _syscall3 and friends are only available through this */
  7. 27 #include <linux/unistd.h>
  8. 28
  9. 29 /* define the system call, to override the library function */
  10. 30 _syscall3(int, syslog, int, type, char *, bufp, int, len);
  11. 31
  12. 32 int main(int argc, char **argv)
  13. 33 {
  14. 34     int level;
  15. 35
  16. 36     if (argc==2) {
  17. 37     level = atoi(argv[1]); /* the chosen console */
  18. 38     } else {
  19. 39         fprintf(stderr, "%s: need a single arg\n",argv[0]); exit(1);
  20. 40     }
  21. 41     if (syslog(8,NULL,level) < 0) {
  22. 42         fprintf(stderr,"%s: syslog(setlevel): %s\n",
  23. 43                 argv[0],strerror(errno));
  24. 44         exit(1);
  25. 45     }
  26. 46     exit(0);
  27. 47 }

复制代码
gcc setlevel.后,错误如下:
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘syslog’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘type’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘bufp’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘len’
setlevel.c:30: warning: data definition has no type or storage class

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

〆凄凉。 2022-09-25 18:08:57

你这第30行感觉也没有被调用啊

热鲨 2022-09-25 18:08:57

主要的问题是_syscall3(int, syslog, int, type, char *, bufp, int, len);没有返回值,编译器把他看作是一个函数原型的声明。

甜警司 2022-09-25 18:08:57

应该是你用的内核版本的问题,LZ 的内核版本是多少?

谁把谁当真 2022-09-25 18:08:57

2.6.24-23-386

七色彩虹 2022-09-25 18:08:57

我也不太清楚,ldd中的源代码就是这么写的。我不太清楚_syscall3(int, syslog, int, type, char *, bufp, int, len);
和syslog(8,NULL,level)的关系

掩于岁月 2022-09-25 18:08:57

原帖由 szjrabbit 于 2009-4-24 18:26 发表
我也不太清楚,ldd中的源代码就是这么写的。我不太清楚_syscall3(int, syslog, int, type, char *, bufp, int, len);
和syslog(8,NULL,level)的关系

LDD3提供的源码是在2.6.10上运行的。2.6版本的子版本之间变化可能比较大,我用2.6.18编译这个程序也报错。LZ 尝试修改一下这个程序,以适应适应你的内核,正好也算练练手。

今天小雨转甜 2022-09-25 18:08:57

找到解决方法:

  1. 1
  2. 2 #include <stdio.h>
  3. 3 #include <stdlib.h>
  4. 4 #include <string.h>
  5. 5#include <errno.h>
  6. 6#include <sys/syscall.h>
  7. 27 #include <linux/unistd.h>
  8. 28
  9. 29int syslog(int type,char *bufp,int len)
  10. 30 {
  11. 31     long __res;
  12. 32     __asm__ volatile ("int $0x80":"=a"(__res):"0"(103),"b"((long)(type)),"c"    ((long)(bufp)),"d"((long)(len)));
  13. 33
  14. 34     if ((unsigned long)(__res) >= (unsigned long)(-125)){
  15. 35         errno = -(__res);
  16. 36         __res = -1;
  17. 37     }
  18. 38     return (int)(__res);
  19. 39 }
  20. 40
  21. 41 int main(int argc, char **argv)
  22. 42 {
  23. 43     int level;
  24. 44
  25. 45     if (argc==2) {
  26. 46     level = atoi(argv[1]); /* the chosen console */
  27. 47     } else {
  28. 48        fprintf(stderr, "%s: need a single arg\n",argv[0]); exit(1);
  29. 49     }
  30. 50     if (syslog(8,NULL,level) < 0) {
  31. 52                 argv[0],strerror(errno));
  32. 53        exit(1);
  33. 54     }
  34. 55     exit(0);
  35. 56 }

复制代码

从来不烧饼 2022-09-25 18:08:57

感谢分享解决方法

深爱成瘾 2022-09-25 18:08:57

感谢分享啊。这样学习的收获更大。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文