在 Archlinux 上为 os161 编译 gdb

Compile gdb for os161 on Archlinux

提问人:cloud 提问时间:9/15/2023 更新时间:9/15/2023 访问量:28

问:

我从 ops-class 开始学习 os161 课程,但在设置练习所需的部分工具链时遇到了麻烦。我尝试按照设置指南进行操作,并设法:

  • 安装 binutils
  • 安装 GCC
  • 安装 sys161
  • 安装 bmake

然后编译内核并启动模拟器。

我无法按照他们的设置指南编译 gdb。我尝试使用 clang 而不是 gcc 或 mold 而不是 ld,但总是得到相同的链接错误。这是带有模具的 gcc,以便于阅读:

gcc -DHAVE_CONFIG_H     -DPROFILE=1 -DWITH_PROFILE=-1   -DWITH_ALIGNMENT=NONSTRICT_ALIGNMENT -DWITH_TARGET_WORD_BITSIZE=32 -DWITH_TARGET_WORD_MSB=31 -DWITH_DEFAULT_TARGET_BYTE_ORDER=BIG_ENDIAN  -DWITH_FLOATING_POINT=HARD_FLOATING_POINT -DWITH_TARGET_FLOATING_POINT_BITSIZE=32 -DWITH_HW=0 -DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN    -DWITH_RESERVED_BITS=1  -DWITH_SMP=0  -Wall -Wdeclaration-after-statement -Wpointer-arith -Wpointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototypes -Wdeclaration-after-statement -Wempty-body -Wmissing-parameter-type -Wold-style-declaration -Wold-style-definition -Wformat-nonliteral    -DMIPS_MACH_DEFAULT=bfd_mach_mips8000   -I. -I. -I../common -I./../common -I../../include -I./../..//include -I../../bfd -I./../..//bfd -I../../opcodes -I./../..//opcodes  -fuse-ld=mold -static-libstdc++ -static-libgcc  -o run \
  nrun.o libsim.a ../../bfd/libbfd.a ../../opcodes/libopcodes.a  ../../libiberty/libiberty.a -lm -lz -lnsl   
mold: error: duplicate symbol: libsim.a(semantics.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-resume.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(engine.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-reason.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-module.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-options.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-profile.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-command.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(dsp.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-main.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-hload.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-fpu.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-engine.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-config.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-utils.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-info.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-events.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-trace.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-load.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(irun.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-core.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-stop.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(cp1.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(interp.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-watch.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-signal.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-memopt.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(sim-io.o): nrun.o: sim_addr_range_hit_p
mold: error: duplicate symbol: libsim.a(idecode.o): nrun.o: sim_addr_range_hit_p
collect2: error: ld returned 1 exit status

这里还有我用来编译它的工具:

[cloud@psi gdb-7.8+os161-2.1]$ gcc --version
gcc (GCC) 13.2.1 20230801
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[cloud@psi gdb-7.8+os161-2.1]$ mold --version
mold 2.1.0 (d78b7486963a0a64f668ba9859c2395dca3fe3c5; compatible with GNU ld)

您对如何解决这个“重复符号”问题有什么建议吗?在源代码中,我只找到符号的那些实例:

[cloud@psi gdb-7.8+os161-2.1]$ rg -C3 sim_addr_range_hit_p 
sim/common/sim-arange.c
285-#if DEFINE_INLINE_P
286-
287-SIM_ARANGE_INLINE int
288:sim_addr_range_hit_p (ADDR_RANGE *ar, address_word addr)
289-{
290-  ADDR_RANGE_TREE *t = ar->range_tree;
291-

sim/common/sim-arange.h
63-/* Return non-zero if ADDR is in range AR, traversing the entire tree.
64-   If no range is specified, that is defined to mean "everything".  */
65-extern INLINE int
66:sim_addr_range_hit_p (ADDR_RANGE * /*ar*/, address_word /*addr*/);
67-#define ADDR_RANGE_HIT_P(ar, addr) \
68:  ((ar)->range_tree == NULL || sim_addr_range_hit_p ((ar), (addr)))
69-
70-#ifdef HAVE_INLINE
71-#ifdef SIM_ARANGE_C

但我没有足够的 C 经验来理解这个错误。

链接器错误 archlinux 工具链 os161

评论


答: 暂无答案