0

我正在尝试执行 PintOS 命令pintos -f(如果您不熟悉 PintOS,请不要担心)。在内部,init.c程序被调用,其parse_options()函数处理传递的命令行参数。以下是 init.c 的相关片段

static char **
parse_options (char **argv) 
{
   for (; *argv != NULL && **argv == '-'; argv++)
   {
      char *save_ptr;
      char *name = strtok_r (*argv, "=", &save_ptr); //fn to tokenise the string
      char *value = strtok_r (NULL, "", &save_ptr);
      if (!strcmp (name, "-h"))
        usage ();
      else if (!strcmp (name, "-q"))
        power_off_when_done = true;
      else if (!strcmp (name, "-r"))
        reboot_when_done = true;
      /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/

      #ifdef FILESYS
      else if (!strcmp (name, "-f"))
        format_filesys = true;
      #endif

      /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
      else if (!strcmp (name, "-rs"))
        random_init (atoi (value));
      else if (!strcmp (name, "-mlfqs"))
        thread_mlfqs = true;
      #ifdef USERPROG
      else if (!strcmp (name, "-ul"))
        user_page_limit = atoi (value);
      #endif
      else
        PANIC ("unknown option `%s' (use -h for help)", name);
   }
   return argv;
}

根据该$$$$部分中的代码,-f仅在定义 FILESYS 时才会处理传递的选项。

执行时make,执行以下命令

gcc -m32 -c ../../threads/init.c -o threads/init.o -g -msoft-float -O -fno-stack-    protector -nostdinc -I../.. -I../../lib -I../../lib/kernel -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -DUSERPROG -DFILESYS -MMD -MF threads/init.d

这里提供了 -DUSERPROG 和 -DFILESYS 选项来定义 FILESYS 和 USERPROG,以便执行代码的相关部分。但是,不知何故, FILESYS 没有得到定义,从以下pintos -f命令输出中可以看出

Kernel command line: -f
Kernel PANIC at ../../threads/init.c:261 in parse_options(): unknown option `-f' (use -h for help)

其他几项测试确认 FILESYS 未定义是问题所在。我检查了 gcc 语法,甚至编写了以下 Dummy 程序来检查 gcc 的 -DNAME 选项。

DummyProg.c

#include "stdio.h"
int main()
{
#ifdef CHECK 
    printf("WORKING\n");
#endif
return 0;
}

使用gcc -DCHECK DummyProg.cand ./a.out, WORKING 显示在屏幕上,符合语法的有效性等。我使用的 gcc 版本是gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

有人可以指出如何解决这个问题。

4

3 回答 3

1

编译器可以帮助您理解这一点;诀窍是使用以下#define语句捕获经过处理的代码:

gcc -E -dD ...blah...

您必须从 compile 命令中删除-cand-o <outfile>选项,否则保持不变,除了添加两个新选项。

-E告诉它只做预处理步骤,并将其输出到屏幕。

-dD告诉它离开#defineand#undef指令。

我的猜测是你的代码在#undef FILESYS某处有一个指令,它覆盖了你的-DFILESYS选择。

于 2013-10-16T13:50:19.757 回答
0

您确定要构建整个可执行文件/库/...吗?

查看调用时触发的命令make,只有一个文件被编译成中间目标文件。没有链接到最终的二进制文件。

所以它猜测您仍在使用过时的构建。尝试转到顶级源目录并执行:

 make clean && make
于 2013-10-16T14:08:26.777 回答
0

要调试此类问题,请gcc使用-E. 这只会通过预处理器运行代码cpp。查看输出文件以查看 C 编译器在后处理步骤之后的输入。

于 2013-10-16T13:08:47.727 回答