我试图在Linux上为Y86-64代码编译一个模拟器。我已经重写了makefile,但结果如下所示。它说“matherr的未定义引用”(链接时看起来它与gcc连接)。

(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5 ")
    make[1]: 进入目录“/home/gongchen/桌面/ICS/archlab-handout/sim/pipe”
    # Building the pipe-std.hcl version of PIPE
    ../misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
    gcc -Wall -O2 -I/usr/include/tcl8.5  -I../misc -DHAS_GUI -o psim psim.c pipe-std.c \
        ../misc/isa.c -L/usr/lib/ -ltk8.5 -ltcl8.5 -lm
    /tmp/cchKTZy7.o:(.data.rel+0x0):对‘matherr’未定义的引用
    collect2: error: ld returned 1 exit status
    Makefile:42: recipe for target 'psim' failed
    make[1]: *** [psim] Error 1
    make[1]: 离开目录“/home/gongchen/桌面/ICS/archlab-handout/sim/pipe”
    Makefile:28: recipe for target 'all' failed
    make: *** [all] Error 2

最佳答案

gcc -Wall -O2 -I/usr/include/tcl8.5  -I../misc -DHAS_GUI -o psim psim.c pipe-std.c \
    ../misc/isa.c -L/usr/lib/ -ltk8.5 -ltcl8.5 -lm
/tmp/cchKTZy7.o:(.data.rel+0x0):对‘matherr’未定义的引用

您正在将未定义的引用错误链接到matherr
看起来matherr是svid数学库的一部分。根据matherr(3) man page符号在glibc 2.27或更高版本中不再存在。
说明
注意:本页中描述的机制不再受
格利布。在glibc 2.27之前,它已经被标记为过时。自从
glibc 2.27,该机制已被完全删除。新的
应用程序应使用数学错误(7)和
芬夫(3)。本页记录了matherr()机制,作为
维护和移植旧的应用程序。
math_error(7) man page表示应该执行以下操作来检查错误:
errno设置为零
呼叫feclearexcept(FE_ALL_EXCEPT)
数学计算完成后,应检查以下非零值以指示错误:
errno
fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW);
既然你是一个试图使用程序的人(而不是一个维护者),我建议你采取两种行动。我们的策略是使用一个发行版,让一切都正常工作,并将其提交给y86维护人员进行修复。
首先,使用提供glibc 2.26或早期版本的另一个旧发行版。像Debian8(glibc 2.19)或Fedora25(glibc2.24)这样的软件应该没问题。
其次,针对y86项目提交一个bug报告。Y86的维护人员需要解决问题,而不是试图学习课堂材料的学生。

关于linux - 无法从源代码构建y86-64模拟器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52903488/

10-10 17:41