On 2024/03/08 12:18, Ming Wang wrote:
The following link error exists when building with LOONGARCH64
machine:
/usr/bin/ld: proc-service.o: in function `.LVL71':
proc-service.c:(.text+0x324): undefined reference to `fill_gregset ...
/usr/bin/ld: proc-service.o: in function `.LVL77':
proc-service.c:(.text+0x364): undefined reference to `supply_gregset ...
/usr/bin/ld: proc-service.o: in function `.LVL87':
proc-service.c:(.text+0x3c4): undefined reference to `fill_fpregset ...
/usr/bin/ld: proc-service.o: in function `.LVL93':
proc-service.c:(.text+0x404): undefined reference to `supply_fpregset
collect2: error: ld returned 1 exit status
The cause of the error is that the definition of a function such as
fill_gregset is not implemented. This patch is used to fix this error.
v1 -> v2:
Fix compilation errors.
Thanks for the v2, the warnings are gone. but I found another problem..
When we add a patch to gdb-10.2.patch, a LOONGARCH64 build will fail with
the following redefinition errors. There is need to remove the gdb-10.2
directory before rebuilding. It looks like it's because the patch command
cannot detect previously applied patches for newly created loongarch files,
and those files get duplicated code..
$ git am /tmp/0001-LoongArch64-Fixed-link-errors-when-build-on-LOO.patch
Applying: LoongArch64: Fixed link errors when build on LOONGARCH64 machine
$ make -j 16 warn target=LOONGARCH64
...
patching file gdb-10.2/bfd/configure.ac
Reversed (or previously applied) patch detected! Skipping patch.
1 out of 1 hunk ignored
patching file gdb-10.2/bfd/cpu-loongarch.c <<-- cannot detect previously applied
patch
patching file gdb-10.2/bfd/elf-bfd.h
patching file gdb-10.2/bfd/elf.c
...
libtool: compile: gcc -DHAVE_CONFIG_H -I. -DBINDIR=\"/usr/local/bin\"
-DLIBDIR=\"/usr/local/lib\" -I. -I. -I./../include -DHAVE_loongarch_elf64_vec
-DHAVE_loongarch_elf32_vec -DHAVE_elf64_le_vec -DHAVE_elf64_be_vec -DHAVE_elf32_le_vec
-DHAVE_elf32_be_vec -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow
-Wstack-usage=262144 -I./../zlib -g -O2 -MT elf-properties.lo -
MD -MP -MF .deps/elf-properties.Tpo -c elf-properties.c -o elf-properties.o
cpu-loongarch.c:86:33: error: redefinition of 'bfd_loongarch32_arch'
static const bfd_arch_info_type bfd_loongarch32_arch =
^~~~~~~~~~~~~~~~~~~~
...
make: *** [Makefile:254: all] Error 2
$ grep BFD gdb-10.2/bfd/cpu-loongarch.c
/* BFD support for LoongArch.
This file is part of BFD, the Binary File Descriptor library.
/* BFD support for LoongArch.
This file is part of BFD, the Binary File Descriptor library.
I found that it's due to not using '/dev/null' for the newly added files
in gdb-10.2.patch. I'd like to fix this issue before applying this patch.
I've attached two patches:
- 1/2 fixes the issue above.
- 2/2 is Ming's patch and I added "rm -f
gdb-10.2/gdb/loongarch-linux-tdep.c"
for the file modified multiple times (but not included in gdb-10.2.tar.gz.)
Ming, Lianbo, could you check these?
Thanks,
Kazu
Reported-by: Xiujie Jiang <jiangxiujie(a)kylinos.cn>
Signed-off-by: Ming Wang <wangming01(a)loongson.cn>
---
gdb-10.2.patch | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/gdb-10.2.patch b/gdb-10.2.patch
index a7018a2..5d34407 100644
--- a/gdb-10.2.patch
+++ b/gdb-10.2.patch
@@ -16057,3 +16057,36 @@ exit 0
m10200-dis.c
m10200-opc.c
m10300-dis.c
+--- gdb-10.2/gdb/loongarch-linux-tdep.c.orig
++++ gdb-10.2/gdb/loongarch-linux-tdep.c
+@@ -707,3 +707,30 @@ _initialize_loongarch_linux_tdep ()
+ gdbarch_register_osabi (bfd_arch_loongarch, bfd_mach_loongarch64,
+ GDB_OSABI_LINUX, loongarch_linux_init_abi);
+ }
++
++/* Wrapper functions. These are only used by libthread_db. */
++#include <sys/procfs.h>
++extern void supply_gregset (struct regcache *regcache,const prgregset_t *gregset);
++extern void fill_gregset (const struct regcache *regcache, prgregset_t *gregset, int
regno);
++extern void supply_fpregset (struct regcache *regcache, const prfpregset_t
*fpregset);
++extern void fill_fpregset (const struct regcache *regcache, prfpregset_t *fpregset, int
regno);
++
++void supply_gregset (struct regcache *regcache, const prgregset_t *gregset)
++{
++ loongarch_elf_gregset.supply_regset (NULL, regcache, -1, gregset, sizeof
(prgregset_t));
++}
++
++void fill_gregset (const struct regcache *regcache, prgregset_t *gregset, int regno)
++{
++ loongarch_elf_gregset.collect_regset (NULL, regcache, regno, gregset, sizeof
(prgregset_t));
++}
++
++void supply_fpregset (struct regcache *regcache, const prfpregset_t *fpregset)
++{
++ loongarch_elf_fpregset.supply_regset (NULL, regcache, -1, fpregset, sizeof
(prfpregset_t));
++}
++
++void fill_fpregset (const struct regcache *regcache, prfpregset_t *fpregset, int
regno)
++{
++ loongarch_elf_fpregset.collect_regset (NULL, regcache, regno, fpregset, sizeof
(prfpregset_t));
++}