编译XV6时如何解决链接器错误?

时间:2018-11-26 00:32:23

标签: c xv6

我的XV6中有三个文件:testmain.c,foo.h和foo.c:

foo.h:

extern void myfunction(void)

foo.c:

#include "foo.h"
void myfunction(void){
   printf(1, "HelloWorld"); }

testmain.c:

 #include "foo.h" 
 int main(void){
    myfunction();
    return 0 ; }

我在test_main中遇到myfunction()的未定义参考错误。我知道我需要为XV6更改Makefile中的某些内容,但是我不知道是什么。这就是我在XV6 Makefile中所做的更改:

UPROGS=\
    _cat\
    _echo\
    _forktest\
    _grep\
    _init\
    _kill\
    _ln\
    _ls\
    _mkdir\
    _rm\
    _sh\
    _stressfs\
    _usertests\
    _wc\
    _zombie\ 
    _foo\
    _testmain\

1 个答案:

答案 0 :(得分:0)

您需要在Makefile中进行一些更改:

  • 指示您要创建_testmain程序,
  • 告诉我们_testmain依赖是什么(如果适用)。

在程序列表中添加_testmain

UPROGS=\
    _testmain\
    _cat\
    _crash\ 
    _echo\
    _factor\
    ....

_testmain依赖项:

由于您的_testmain程序依赖于两个文件,因此您必须创建一个特殊的规则来告知构建者(我根据_%: %.o $(ULIB)规则来制定此规则):

_testmain: testmain.o foo.o $(ULIB)

    $(LD) $(LDFLAGS) -N -e main -Ttext 0x1000 -o $@ $^
    $(OBJDUMP) -S $@ > $*.asm
    $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym