public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v4 00/13] GLIBC LoongArch PATCHES
@ 2022-05-09  2:29 caiyinyu
  2022-05-09  2:29 ` [PATCH v4 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
                   ` (9 more replies)
  0 siblings, 10 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:29 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

Hello, these are LoongArch patches v4, and we really need your futher suggestions:

HISTORY:
LoongArch patches v1: https://sourceware.org/pipermail/libc-alpha/2021-August/130262.html
LoongArch patches v2: https://sourceware.org/pipermail/libc-alpha/2021-December/134811.html
LoongArch patches v3: https://sourceware.org/pipermail/libc-alpha/2022-April/137888.html

LoongArch-Doc:  https://github.com/loongson/LoongArch-Documentation

We add new section: procedure calling convention.
https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_procedure_calling_convention

Source code:
linux:		https://github.com/loongson/linux/tree/loongarch-next
glibc:		https://github.com/loongson/glibc/tree/loongarch_2_36_upstream_v4

GCC and Binutils Loongarch parts have been into GNU Open Source community.
Loongarch kernal may be no problem on 5.19:
https://lore.kernel.org/linux-arch/20220319142759.1026237-1-chenhuacai@loongson.cn/T/#m9d06c1882053c313ced32eaddda61e2514c712e8
---------------------------------------------------------------------------
* Re: [PATCH V8 00/22] arch: Add basic LoongArch support
  2022-03-21 21:55     ` Arnd Bergmann
@ 2022-03-21 22:03       ` Linus Torvalds
  0 siblings, 0 replies; 46+ messages in thread
From: Linus Torvalds @ 2022-03-21 22:03 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Huacai Chen, Andy Lutomirski, Thomas Gleixner, Peter Zijlstra,
	Andrew Morton, David Airlie, Jonathan Corbet, linux-arch,
	open list:DOCUMENTATION, Linux Kernel Mailing List, Xuefeng Li,
	Yanteng Si, Huacai Chen, Jiaxun Yang, Huacai Chen

On Mon, Mar 21, 2022 at 2:55 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> I can prepare a pull request when it gets to that, but I think the boot protocol
> should be fixed first, and that makes it 5.19 material.

Thanks. No problem on 5.19, it's not like I don't have enough pending
for this merge window already..

                 Linus
---------------------------------------------------------------------------

test result: all passed.

XPASS: conform/UNIX98/ndbm.h/linknamespace
XPASS: conform/XOPEN2K/ndbm.h/linknamespace
XPASS: conform/XOPEN2K8/ndbm.h/linknamespace
XPASS: conform/XPG42/ndbm.h/linknamespace
UNSUPPORTED: crypt/cert
UNSUPPORTED: elf/tst-env-setuid
UNSUPPORTED: elf/tst-env-setuid-tunables
XPASS: elf/tst-protected1a
XPASS: elf/tst-protected1b
UNSUPPORTED: elf/tst-valgrind-smoke
UNSUPPORTED: misc/tst-adjtimex
UNSUPPORTED: misc/tst-clock_adjtime
UNSUPPORTED: misc/tst-ntp_adjtime
UNSUPPORTED: misc/tst-pkey
UNSUPPORTED: misc/tst-rseq
UNSUPPORTED: misc/tst-rseq-disable
UNSUPPORTED: nptl/test-cond-printers
UNSUPPORTED: nptl/test-condattr-printers
UNSUPPORTED: nptl/test-mutex-printers
UNSUPPORTED: nptl/test-mutexattr-printers
UNSUPPORTED: nptl/test-rwlock-printers
UNSUPPORTED: nptl/test-rwlockattr-printers
UNSUPPORTED: nptl/tst-rseq-nptl
UNSUPPORTED: stdlib/tst-secure-getenv
UNSUPPORTED: time/tst-clock_settime
UNSUPPORTED: time/tst-settimeofday
Summary of test results:
   4556 PASS
     20 UNSUPPORTED
     12 XFAIL
      6 XPASS

caiyinyu (13):
  LoongArch: Update NEWS and README for the LoongArch port.
  LoongArch: Add LoongArch entries to config.h.in
  LoongArch: Add relocations and ELF flags to elf.h and
    scripts/glibcelf.py
  LoongArch: ABI Implementation
  LoongArch: Thread-Local Storage Support
  LoongArch: Generic <math.h> and soft-fp Routines
  LoongArch: Atomic and Locking Routines
  LoongArch: Linux Syscall Interface
  LoongArch: Linux ABI
  LoongArch: Add ABI Lists
  LoongArch: Build Infastructure
  LoongArch: Hard Float Support
  LoongArch: Update build-many-glibcs.py for the LoongArch Port.

 NEWS                                          |    9 +
 README                                        |    1 +
 config.h.in                                   |    6 +
 elf/elf.h                                     |   68 +-
 manual/math.texi                              |    2 +-
 scripts/build-many-glibcs.py                  |    5 +
 scripts/glibcelf.py                           |    3 +-
 sysdeps/loongarch/Implies                     |    3 +
 sysdeps/loongarch/Makefile                    |   15 +
 sysdeps/loongarch/__longjmp.S                 |   52 +
 sysdeps/loongarch/abort-instr.h               |    2 +
 sysdeps/loongarch/bits/endianness.h           |   11 +
 sysdeps/loongarch/bits/fenv.h                 |   90 +
 sysdeps/loongarch/bits/link.h                 |   58 +
 sysdeps/loongarch/bits/setjmp.h               |   42 +
 sysdeps/loongarch/bsd-_setjmp.c               |    1 +
 sysdeps/loongarch/bsd-setjmp.c                |    1 +
 sysdeps/loongarch/configure                   |    5 +
 sysdeps/loongarch/configure.ac                |    6 +
 sysdeps/loongarch/dl-irel.h                   |   48 +
 sysdeps/loongarch/dl-machine.h                |  362 +++
 sysdeps/loongarch/dl-tls.h                    |   46 +
 sysdeps/loongarch/dl-trampoline.S             |   91 +
 sysdeps/loongarch/e_sqrtl.c                   |   38 +
 sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
 sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
 sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
 sysdeps/loongarch/fpu/fegetenv.c              |   31 +
 sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fegetmode.c             |   27 +
 sysdeps/loongarch/fpu/fegetround.c            |   33 +
 sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
 sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
 sysdeps/loongarch/fpu/fesetenv.c              |   42 +
 sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fesetmode.c             |   38 +
 sysdeps/loongarch/fpu/fesetround.c            |   44 +
 sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
 sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
 sysdeps/loongarch/fpu/fraiseexcpt.c           |   75 +
 sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
 sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
 .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
 sysdeps/loongarch/fpu_control.h               |  102 +
 sysdeps/loongarch/hp-timing.h                 |   42 +
 sysdeps/loongarch/jmpbuf-offsets.h            |   22 +
 sysdeps/loongarch/jmpbuf-unwind.h             |   45 +
 sysdeps/loongarch/ldsodefs.h                  |   41 +
 sysdeps/loongarch/libc-tls.c                  |   32 +
 sysdeps/loongarch/linkmap.h                   |   22 +
 sysdeps/loongarch/lp64/Implies-after          |    1 +
 sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
 sysdeps/loongarch/machine-gmon.h              |   37 +
 sysdeps/loongarch/math_private.h              |  248 ++
 sysdeps/loongarch/nptl/Makefile               |   21 +
 sysdeps/loongarch/nptl/pthreaddef.h           |   32 +
 sysdeps/loongarch/nptl/tcb-offsets.sym        |    6 +
 sysdeps/loongarch/nptl/tls.h                  |  138 ++
 sysdeps/loongarch/preconfigure                |   47 +
 sysdeps/loongarch/setjmp.S                    |   66 +
 sysdeps/loongarch/sfp-machine.h               |  102 +
 sysdeps/loongarch/sotruss-lib.c               |   50 +
 sysdeps/loongarch/stackinfo.h                 |   33 +
 sysdeps/loongarch/start.S                     |   67 +
 sysdeps/loongarch/sys/asm.h                   |   59 +
 sysdeps/loongarch/sys/regdef.h                |   93 +
 sysdeps/loongarch/tininess.h                  |    1 +
 sysdeps/loongarch/tst-audit.h                 |   23 +
 sysdeps/unix/sysv/linux/loongarch/Implies     |    1 +
 sysdeps/unix/sysv/linux/loongarch/Makefile    |    4 +
 .../unix/sysv/linux/loongarch/arch-syscall.h  |  303 +++
 .../sysv/linux/loongarch/atomic-machine.h     |  181 ++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |   61 +
 .../unix/sysv/linux/loongarch/bits/procfs.h   |   52 +
 .../linux/loongarch/bits/pthread_stack_min.h  |   20 +
 .../unix/sysv/linux/loongarch/bits/sigstack.h |   32 +
 sysdeps/unix/sysv/linux/loongarch/clone.S     |   96 +
 sysdeps/unix/sysv/linux/loongarch/clone3.S    |   83 +
 sysdeps/unix/sysv/linux/loongarch/configure   |  174 ++
 .../unix/sysv/linux/loongarch/configure.ac    |   22 +
 .../unix/sysv/linux/loongarch/getcontext.S    |   59 +
 sysdeps/unix/sysv/linux/loongarch/ldconfig.h  |   26 +
 .../unix/sysv/linux/loongarch/ldd-rewrite.sed |    3 +
 .../unix/sysv/linux/loongarch/localplt.data   |   12 +
 .../unix/sysv/linux/loongarch/lp64/Implies    |    3 +
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 .../unix/sysv/linux/loongarch/makecontext.c   |   79 +
 .../unix/sysv/linux/loongarch/setcontext.S    |  100 +
 .../unix/sysv/linux/loongarch/shlib-versions  |    7 +
 .../sysv/linux/loongarch/sigcontextinfo.h     |   32 +
 .../unix/sysv/linux/loongarch/swapcontext.S   |   95 +
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |   61 +
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |   42 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.S    |   53 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    |  321 +++
 .../sysv/linux/loongarch/ucontext-macros.h    |   32 +
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |   31 +
 sysdeps/unix/sysv/linux/loongarch/vfork.S     |   50 +
 109 files changed, 9815 insertions(+), 3 deletions(-)
 create mode 100644 sysdeps/loongarch/Implies
 create mode 100644 sysdeps/loongarch/Makefile
 create mode 100644 sysdeps/loongarch/__longjmp.S
 create mode 100644 sysdeps/loongarch/abort-instr.h
 create mode 100644 sysdeps/loongarch/bits/endianness.h
 create mode 100644 sysdeps/loongarch/bits/fenv.h
 create mode 100644 sysdeps/loongarch/bits/link.h
 create mode 100644 sysdeps/loongarch/bits/setjmp.h
 create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
 create mode 100644 sysdeps/loongarch/bsd-setjmp.c
 create mode 100644 sysdeps/loongarch/configure
 create mode 100644 sysdeps/loongarch/configure.ac
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/dl-machine.h
 create mode 100644 sysdeps/loongarch/dl-tls.h
 create mode 100644 sysdeps/loongarch/dl-trampoline.S
 create mode 100644 sysdeps/loongarch/e_sqrtl.c
 create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fegetround.c
 create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
 create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fesetround.c
 create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
 create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
 create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
 create mode 100644 sysdeps/loongarch/fpu_control.h
 create mode 100644 sysdeps/loongarch/hp-timing.h
 create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
 create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
 create mode 100644 sysdeps/loongarch/ldsodefs.h
 create mode 100644 sysdeps/loongarch/libc-tls.c
 create mode 100644 sysdeps/loongarch/linkmap.h
 create mode 100644 sysdeps/loongarch/lp64/Implies-after
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
 create mode 100644 sysdeps/loongarch/machine-gmon.h
 create mode 100644 sysdeps/loongarch/math_private.h
 create mode 100644 sysdeps/loongarch/nptl/Makefile
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/loongarch/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/loongarch/nptl/tls.h
 create mode 100644 sysdeps/loongarch/preconfigure
 create mode 100644 sysdeps/loongarch/setjmp.S
 create mode 100644 sysdeps/loongarch/sfp-machine.h
 create mode 100644 sysdeps/loongarch/sotruss-lib.c
 create mode 100644 sysdeps/loongarch/stackinfo.h
 create mode 100644 sysdeps/loongarch/start.S
 create mode 100644 sysdeps/loongarch/sys/asm.h
 create mode 100644 sysdeps/loongarch/sys/regdef.h
 create mode 100644 sysdeps/loongarch/tininess.h
 create mode 100644 sysdeps/loongarch/tst-audit.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S

-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 01/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
@ 2022-05-09  2:29 ` caiyinyu
  2022-05-09  2:29 ` [PATCH v4 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:29 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 NEWS             | 9 +++++++++
 README           | 1 +
 manual/math.texi | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index ef8ac4acd2..65070282bb 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,15 @@ Major new features:
   -z pack-relative-relocs option, which is supported for some targets
   in recent binutils versions.  Lazy binding doesn't apply to DT_RELR.
 
+* Support for LoongArch running on Linux has been added.  This port requires
+  as least binutils 2.38, GCC 12, and Linux 10.0.0.  Currently only hard-float
+  ABI is supported:
+
+    - loongarch64-linux-gnu
+
+  The LoongArch ABI is 64-bit little-endian and uses 64-bit time (y2038 safe) and
+  64-bit file offsets (LFS default).
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * Support for prelink will be removed in the next release; this includes
diff --git a/README b/README
index 3d5a78ccff..63f3a1bebf 100644
--- a/README
+++ b/README
@@ -31,6 +31,7 @@ The GNU C Library supports these configurations for using Linux kernels:
 	i[4567]86-*-linux-gnu
 	x86_64-*-linux-gnu	Can build either x86_64 or x32
 	ia64-*-linux-gnu
+	loongarch64-*-linux-gnu Hardware floating point, LE only.
 	m68k-*-linux-gnu
 	microblaze*-*-linux-gnu
 	mips-*-linux-gnu
diff --git a/manual/math.texi b/manual/math.texi
index 477a18b6d1..105d6122df 100644
--- a/manual/math.texi
+++ b/manual/math.texi
@@ -70,7 +70,7 @@ provided for @code{_Float32}, @code{_Float64} and @code{_Float32x} on
 all platforms.
 It is also provided for @code{_Float128} and @code{_Float64x} on
 powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64,
-aarch64, alpha, mips64, riscv, s390 and sparc.
+aarch64, alpha, loongarch, mips64, riscv, s390 and sparc.
 
 @menu
 * Mathematical Constants::      Precise numeric values for often-used
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 02/13] LoongArch: Add LoongArch entries to config.h.in
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
  2022-05-09  2:29 ` [PATCH v4 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
@ 2022-05-09  2:29 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 03/13] LoongArch: Add relocations and ELF flags to elf.h and scripts/glibcelf.py caiyinyu
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:29 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 config.h.in | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/config.h.in b/config.h.in
index dd650ddd09..b16cc4448a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -132,6 +132,12 @@
 /* RISC-V floating-point ABI for ld.so.  */
 #undef RISCV_ABI_FLEN
 
+/* LOONGARCH integer ABI for ld.so.  */
+#undef LOONGARCH_ABI_GRLEN
+
+/* LOONGARCH floating-point ABI for ld.so.  */
+#undef LOONGARCH_ABI_FRLEN
+
 /* Linux specific: minimum supported kernel version.  */
 #undef	__LINUX_KERNEL_VERSION
 
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 03/13] LoongArch: Add relocations and ELF flags to elf.h and scripts/glibcelf.py
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
  2022-05-09  2:29 ` [PATCH v4 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
  2022-05-09  2:29 ` [PATCH v4 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 elf/elf.h           | 68 ++++++++++++++++++++++++++++++++++++++++++++-
 scripts/glibcelf.py |  3 +-
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/elf/elf.h b/elf/elf.h
index 0195029188..0f1455c052 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -358,8 +358,9 @@ typedef struct
 
 #define EM_BPF		247	/* Linux BPF -- in-kernel virtual machine */
 #define EM_CSKY		252     /* C-SKY */
+#define EM_LOONGARCH	258	/* LoongArch */
 
-#define EM_NUM		253
+#define EM_NUM		259
 
 /* Old spellings/synonyms.  */
 
@@ -4065,6 +4066,71 @@ enum
 #define R_NDS32_TLS_TPOFF	102
 #define R_NDS32_TLS_DESC	119
 
+/* LoongArch ELF Flags */
+#define EF_LARCH_ABI    	0x07
+#define EF_LARCH_ABI_LP64D	0x03
+
+/* LoongArch specific dynamic relocations */
+#define R_LARCH_NONE		0
+#define R_LARCH_32		1
+#define R_LARCH_64		2
+#define R_LARCH_RELATIVE	3
+#define R_LARCH_COPY		4
+#define R_LARCH_JUMP_SLOT	5
+#define R_LARCH_TLS_DTPMOD32	6
+#define R_LARCH_TLS_DTPMOD64	7
+#define R_LARCH_TLS_DTPREL32	8
+#define R_LARCH_TLS_DTPREL64	9
+#define R_LARCH_TLS_TPREL32	10
+#define R_LARCH_TLS_TPREL64	11
+#define R_LARCH_IRELATIVE	12
+
+/* Reserved for future relocs that the dynamic linker must understand.  */
+
+/* used by the static linker for relocating .text.  */
+#define R_LARCH_MARK_LA  20
+#define R_LARCH_MARK_PCREL  21
+#define R_LARCH_SOP_PUSH_PCREL  22
+#define R_LARCH_SOP_PUSH_ABSOLUTE  23
+#define R_LARCH_SOP_PUSH_DUP  24
+#define R_LARCH_SOP_PUSH_GPREL  25
+#define R_LARCH_SOP_PUSH_TLS_TPREL  26
+#define R_LARCH_SOP_PUSH_TLS_GOT  27
+#define R_LARCH_SOP_PUSH_TLS_GD  28
+#define R_LARCH_SOP_PUSH_PLT_PCREL  29
+#define R_LARCH_SOP_ASSERT  30
+#define R_LARCH_SOP_NOT  31
+#define R_LARCH_SOP_SUB  32
+#define R_LARCH_SOP_SL  33
+#define R_LARCH_SOP_SR  34
+#define R_LARCH_SOP_ADD  35
+#define R_LARCH_SOP_AND  36
+#define R_LARCH_SOP_IF_ELSE  37
+#define R_LARCH_SOP_POP_32_S_10_5  38
+#define R_LARCH_SOP_POP_32_U_10_12  39
+#define R_LARCH_SOP_POP_32_S_10_12  40
+#define R_LARCH_SOP_POP_32_S_10_16  41
+#define R_LARCH_SOP_POP_32_S_10_16_S2  42
+#define R_LARCH_SOP_POP_32_S_5_20  43
+#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2  44
+#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2  45
+#define R_LARCH_SOP_POP_32_U  46
+
+/* used by the static linker for relocating non .text.  */
+#define R_LARCH_ADD8  47
+#define R_LARCH_ADD16  48
+#define R_LARCH_ADD24  49
+#define R_LARCH_ADD32  50
+#define R_LARCH_ADD64  51
+#define R_LARCH_SUB8  52
+#define R_LARCH_SUB16  53
+#define R_LARCH_SUB24  54
+#define R_LARCH_SUB32  55
+#define R_LARCH_SUB64  56
+#define R_LARCH_GNU_VTINHERIT  57
+#define R_LARCH_GNU_VTENTRY  58
+
+
 /* ARCompact/ARCv2 specific relocs.  */
 #define R_ARC_NONE		0x0
 #define R_ARC_8			0x1
diff --git a/scripts/glibcelf.py b/scripts/glibcelf.py
index f847b36c55..b7570ae2f3 100644
--- a/scripts/glibcelf.py
+++ b/scripts/glibcelf.py
@@ -252,7 +252,8 @@ class Machine(_OpenIntEnum):
     EM_RISCV = 243
     EM_BPF = 247
     EM_CSKY = 252
-    EM_NUM = 253
+    EM_LOONGARCH = 258
+    EM_NUM = 259
     EM_ALPHA = 0x9026
 
 class Et(_OpenIntEnum):
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (2 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 03/13] LoongArch: Add relocations and ELF flags to elf.h and scripts/glibcelf.py caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  7:56   ` Fangrui Song
                     ` (3 more replies)
  2022-05-09  2:30 ` [PATCH v4 05/13] LoongArch: Thread-Local Storage Support caiyinyu
                   ` (5 subsequent siblings)
  9 siblings, 4 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 sysdeps/loongarch/__longjmp.S                |  52 +++
 sysdeps/loongarch/bits/endianness.h          |  11 +
 sysdeps/loongarch/bits/link.h                |  58 +++
 sysdeps/loongarch/bits/setjmp.h              |  42 +++
 sysdeps/loongarch/bsd-_setjmp.c              |   1 +
 sysdeps/loongarch/bsd-setjmp.c               |   1 +
 sysdeps/loongarch/dl-machine.h               | 362 +++++++++++++++++++
 sysdeps/loongarch/dl-trampoline.S            |  91 +++++
 sysdeps/loongarch/jmpbuf-offsets.h           |  22 ++
 sysdeps/loongarch/jmpbuf-unwind.h            |  45 +++
 sysdeps/loongarch/ldsodefs.h                 |  41 +++
 sysdeps/loongarch/linkmap.h                  |  22 ++
 sysdeps/loongarch/machine-gmon.h             |  37 ++
 sysdeps/loongarch/setjmp.S                   |  66 ++++
 sysdeps/loongarch/sotruss-lib.c              |  50 +++
 sysdeps/loongarch/start.S                    |  67 ++++
 sysdeps/loongarch/sys/asm.h                  |  59 +++
 sysdeps/loongarch/tst-audit.h                |  23 ++
 sysdeps/unix/sysv/linux/loongarch/ldconfig.h |  26 ++
 19 files changed, 1076 insertions(+)
 create mode 100644 sysdeps/loongarch/__longjmp.S
 create mode 100644 sysdeps/loongarch/bits/endianness.h
 create mode 100644 sysdeps/loongarch/bits/link.h
 create mode 100644 sysdeps/loongarch/bits/setjmp.h
 create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
 create mode 100644 sysdeps/loongarch/bsd-setjmp.c
 create mode 100644 sysdeps/loongarch/dl-machine.h
 create mode 100644 sysdeps/loongarch/dl-trampoline.S
 create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
 create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
 create mode 100644 sysdeps/loongarch/ldsodefs.h
 create mode 100644 sysdeps/loongarch/linkmap.h
 create mode 100644 sysdeps/loongarch/machine-gmon.h
 create mode 100644 sysdeps/loongarch/setjmp.S
 create mode 100644 sysdeps/loongarch/sotruss-lib.c
 create mode 100644 sysdeps/loongarch/start.S
 create mode 100644 sysdeps/loongarch/sys/asm.h
 create mode 100644 sysdeps/loongarch/tst-audit.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h

diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
new file mode 100644
index 0000000000..b7690dd94f
--- /dev/null
+++ b/sysdeps/loongarch/__longjmp.S
@@ -0,0 +1,52 @@
+/* longjmp.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+ENTRY (__longjmp)
+	REG_L ra, a0, 0*SZREG
+	REG_L sp, a0, 1*SZREG
+	REG_L x,  a0, 2*SZREG
+	REG_L fp, a0, 3*SZREG
+	REG_L s0, a0, 4*SZREG
+	REG_L s1, a0, 5*SZREG
+	REG_L s2, a0, 6*SZREG
+	REG_L s3, a0, 7*SZREG
+	REG_L s4, a0, 8*SZREG
+	REG_L s5, a0, 9*SZREG
+	REG_L s6, a0, 10*SZREG
+	REG_L s7, a0, 11*SZREG
+	REG_L s8, a0, 12*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_L $f24, a0, 13*SZREG + 0*SZFREG
+	FREG_L $f25, a0, 13*SZREG + 1*SZFREG
+	FREG_L $f26, a0, 13*SZREG + 2*SZFREG
+	FREG_L $f27, a0, 13*SZREG + 3*SZFREG
+	FREG_L $f28, a0, 13*SZREG + 4*SZFREG
+	FREG_L $f29, a0, 13*SZREG + 5*SZFREG
+	FREG_L $f30, a0, 13*SZREG + 6*SZFREG
+	FREG_L $f31, a0, 13*SZREG + 7*SZFREG
+#endif
+
+	sltui	a0,a1,1
+	ADD	a0, a0, a1	 # a0 = (a1 == 0) ? 1 : a1
+	jirl	zero,ra,0
+
+END (__longjmp)
diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
new file mode 100644
index 0000000000..7290be7b18
--- /dev/null
+++ b/sysdeps/loongarch/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* LoongArch is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h
new file mode 100644
index 0000000000..4df09989cb
--- /dev/null
+++ b/sysdeps/loongarch/bits/link.h
@@ -0,0 +1,58 @@
+/* Machine-specific declarations for dynamic linker interface.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LINK_H
+#error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+typedef struct La_loongarch_regs
+{
+  unsigned long int lr_reg[8]; /* a0 - a7 */
+  double lr_fpreg[8];	       /* fa0 - fa7 */
+  unsigned long int lr_ra;
+  unsigned long int lr_sp;
+} La_loongarch_regs;
+
+/* Return values for calls from PLT on LoongArch.  */
+typedef struct La_loongarch_retval
+{
+  unsigned long int lrv_a0;
+  unsigned long int lrv_a1;
+  double lrv_fa0;
+  double lrv_fa1;
+} La_loongarch_retval;
+
+__BEGIN_DECLS
+
+extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) * __sym,
+					      unsigned int __ndx,
+					      uintptr_t *__refcook,
+					      uintptr_t *__defcook,
+					      La_loongarch_regs *__regs,
+					      unsigned int *__flags,
+					      const char *__symname,
+					      long int *__framesizep);
+extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) * __sym,
+					      unsigned int __ndx,
+					      uintptr_t *__refcook,
+					      uintptr_t *__defcook,
+					      const La_loongarch_regs *__inregs,
+					      La_loongarch_retval *__outregs,
+					      const char *__symname);
+
+__END_DECLS
diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h
new file mode 100644
index 0000000000..8b323ad2b6
--- /dev/null
+++ b/sysdeps/loongarch/bits/setjmp.h
@@ -0,0 +1,42 @@
+/* Define the machine-dependent type `jmp_buf'.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LOONGARCH_BITS_SETJMP_H
+#define _LOONGARCH_BITS_SETJMP_H
+
+typedef struct __jmp_buf_internal_tag
+{
+  /* Program counter.  */
+  long int __pc;
+  /* Stack pointer.  */
+  long int __sp;
+  /* Reserved */
+  long int __x;
+  /* Frame pointer.  */
+  long int __fp;
+  /* Callee-saved registers.  */
+  long int __regs[9];
+
+#ifndef __loongarch_soft_float
+  /* Callee-saved floating point registers.  */
+  double __fpregs[8];
+#endif
+
+} __jmp_buf[1];
+
+#endif /* _LOONGARCH_BITS_SETJMP_H */
diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
new file mode 100644
index 0000000000..32f49441c3
--- /dev/null
+++ b/sysdeps/loongarch/bsd-_setjmp.c
@@ -0,0 +1 @@
+/* _setjmp is implemented in setjmp.S.  */
diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c
new file mode 100644
index 0000000000..45fd802aac
--- /dev/null
+++ b/sysdeps/loongarch/bsd-setjmp.c
@@ -0,0 +1 @@
+/* setjmp is implemented in setjmp.S.  */
diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
new file mode 100644
index 0000000000..68b68e677d
--- /dev/null
+++ b/sysdeps/loongarch/dl-machine.h
@@ -0,0 +1,362 @@
+/* Machine-dependent ELF dynamic relocation inline functions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "LoongArch"
+
+#include <entry.h>
+#include <elf/elf.h>
+#include <sys/asm.h>
+#include <dl-tls.h>
+#include <dl-static-tls.h>
+#include <dl-machine-rel.h>
+
+#ifndef _RTLD_PROLOGUE
+# define _RTLD_PROLOGUE(entry)					\
+	".globl\t" __STRING (entry) "\n\t"			\
+	".type\t" __STRING (entry) ", @function\n\t"		\
+	CFI_STARTPROC "\n"					\
+	__STRING (entry) ":\n"
+#endif
+
+#ifndef _RTLD_EPILOGUE
+# define _RTLD_EPILOGUE(entry)					\
+	CFI_ENDPROC "\n\t"					\
+	".size\t" __STRING (entry) ", . - " __STRING (entry) "\n"
+#endif
+
+#define ELF_MACHINE_JMP_SLOT R_LARCH_JUMP_SLOT
+#define ELF_MACHINE_IRELATIVE R_LARCH_IRELATIVE
+
+#define elf_machine_type_class(type)				\
+  ((ELF_RTYPE_CLASS_PLT * ((type) == ELF_MACHINE_JMP_SLOT	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPREL32)	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPMOD32)	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_TPREL32)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPREL64)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPMOD64)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_TPREL64)))	\
+   | (ELF_RTYPE_CLASS_COPY * ((type) == R_LARCH_COPY)))
+
+#define ELF_MACHINE_NO_REL 1
+#define ELF_MACHINE_NO_RELA 0
+
+/* Return nonzero iff ELF header is compatible with the running host.  */
+static inline int __attribute_used__
+elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
+{
+  /* We can only run LoongArch binaries.  */
+  if (ehdr->e_machine != EM_LOONGARCH)
+    return 0;
+
+  return 1;
+}
+
+/* Runtime address of .got */
+#define _GLOBAL_OFFSET_TABLE_ \
+  ({ \
+    ElfW (Addr) * r; \
+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
+    r; \
+  })
+
+/* Return the link-time address of _DYNAMIC.  */
+static inline ElfW (Addr) elf_machine_dynamic (void)
+{
+  return _GLOBAL_OFFSET_TABLE_[0];
+}
+
+#define STRINGXP(X) __STRING (X)
+#define STRINGXV(X) STRINGV_ (X)
+#define STRINGV_(...) #__VA_ARGS__
+
+/* Return the run-time load address of the shared object.  */
+static inline ElfW (Addr) elf_machine_load_address (void)
+{
+  ElfW (Addr) got_linktime_addr;
+  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
+      /* Link-time address in GOT entry before runtime relocation */
+      : "=r"(got_linktime_addr));
+  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
+}
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+
+#define RTLD_START \
+  asm(".text\n\
+      " _RTLD_PROLOGUE (ENTRY_POINT) "\
+      .cfi_label .Ldummy   \n\
+      " CFI_UNDEFINED (1) "   \n\
+      or	$a0, $sp, $zero   \n\
+      bl	_dl_start   \n\
+      # Stash user entry point in s0.   \n\
+      or	$s0, $v0, $zero   \n\
+      # See if we were run as a command with the executable file   \n\
+      # name as an extra leading argument.   \n\
+      la	$a0, _dl_skip_args   \n\
+      ld.w	$a0, $a0, 0   \n\
+      # Load the original argument count.   \n\
+      ld.d	$a1, $sp, 0   \n\
+      # Subtract _dl_skip_args from it.   \n\
+      sub.d	$a1, $a1, $a0   \n\
+      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
+      slli.d	$a0, $a0, 3   \n\
+      add.d	$sp, $sp, $a0   \n\
+      # Save back the modified argument count.   \n\
+      st.d	$a1, $sp, 0   \n\
+      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
+		       char **env)    \n\
+      la	$a0, _rtld_local   \n\
+      ld.d	$a0, $a0, 0   \n\
+      addi.d	$a2, $sp, 8   \n\
+      slli.d	$a3, $a1, 3   \n\
+      add.d	$a3, $a3, $a2   \n\
+      addi.d	$a3, $a3, 8   \n\
+      # Adjust $sp for 16-aligned   \n\
+      srli.d  $t0, $sp, 4   \n\
+      slli.d  $t0, $t0, 4   \n\
+      ori	$t1, $sp, 0   \n\
+      addi.d  $sp, $t0, -32   \n\
+      st.d	$t1, $sp, 24   \n\
+      # Call the function to run the initializers.   \n\
+      bl	_dl_init   \n\
+      # Pass our finalizer function to _start.   \n\
+      ld.d    $sp, $sp, 24   \n\
+      la	$a0, _dl_fini   \n\
+      # Jump to the user entry point.   \n\
+      jirl	$zero, $s0, 0   \n\
+      " _RTLD_EPILOGUE (ENTRY_POINT) "\
+      .previous");
+
+/* Names of the architecture-specific auditing callback functions.  */
+#define ARCH_LA_PLTENTER loongarch_gnu_pltenter
+#define ARCH_LA_PLTEXIT loongarch_gnu_pltexit
+
+/* Bias .got.plt entry by the offset requested by the PLT header.  */
+#define elf_machine_plt_value(map, reloc, value) (value)
+
+static inline ElfW (Addr)
+  elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+			 const ElfW (Sym) * refsym, const ElfW (Sym) * sym,
+			 const ElfW (Rela) * reloc, ElfW (Addr) * reloc_addr,
+			 ElfW (Addr) value)
+{
+  return *reloc_addr = value;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE_MAP
+
+/* Perform a relocation described by R_INFO at the location pointed to
+   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
+   MAP is the object containing the reloc.  */
+
+static inline void __attribute__ ((always_inline))
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
+		  const ElfW (Rela) * reloc,
+		  const ElfW (Sym) * sym,
+		  const struct r_found_version *version,
+		  void *const reloc_addr, int skip_ifunc)
+{
+  ElfW (Addr) r_info = reloc->r_info;
+  const unsigned long int r_type = ELFW (R_TYPE) (r_info);
+  ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr;
+  const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym;
+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
+  ElfW (Addr) value = 0;
+  if (sym_map != NULL)
+    value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
+
+  if (sym != NULL
+      && __builtin_expect (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
+      && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
+      && __builtin_expect (!skip_ifunc, 1))
+    value = ((ElfW (Addr) (*) (int)) value) (GLRO (dl_hwcap));
+
+  switch (r_type)
+    {
+#ifndef RTLD_BOOTSTRAP
+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPMOD64:
+    R_LARCH_TLS_DTPMOD32:
+      if (sym_map)
+	*addr_field = sym_map->l_tls_modid;
+      break;
+
+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64:
+    R_LARCH_TLS_DTPREL32:
+      if (sym != NULL)
+	*addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend;
+      break;
+
+    case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64:
+    R_LARCH_TLS_TPREL32:
+      if (sym != NULL)
+	{
+	  CHECK_STATIC_TLS (map, sym_map);
+	  *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend;
+	}
+      break;
+
+    case R_LARCH_COPY:
+      {
+	if (__glibc_unlikely (sym == NULL))
+	  /* This can happen in trace mode if an object could not be
+	     found.  */
+	  break;
+
+	/* Handle TLS copy relocations.  */
+	if (__glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_TLS))
+	  {
+	    /* There's nothing to do if the symbol is in .tbss.  */
+	    if (__glibc_likely (sym->st_value
+				>= sym_map->l_tls_initimage_size))
+	      break;
+	    value += (ElfW (Addr)) sym_map->l_tls_initimage - sym_map->l_addr;
+	  }
+
+	size_t size = sym->st_size;
+	if (__glibc_unlikely (sym->st_size != refsym->st_size))
+	  {
+	    const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+	    if (sym->st_size > refsym->st_size)
+	      size = refsym->st_size;
+	    if (sym->st_size > refsym->st_size || GLRO (dl_verbose))
+	      _dl_error_printf ("\
+  %s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	  }
+
+	memcpy (reloc_addr, (void *) value, size);
+	break;
+      }
+#endif
+
+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+    case R_LARCH_RELATIVE:
+      {
+#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
+	/* This is defined in rtld.c, but nowhere in the static libc.a;
+	   make the reference weak so static programs can still link.
+	   This declaration cannot be done when compiling rtld.c
+	   (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
+	   common defn for _dl_rtld_map, which is incompatible with a
+	   weak decl in the same file.  */
+#ifndef SHARED
+	weak_extern (GL (dl_rtld_map));
+#endif
+	if (map != &GL (dl_rtld_map)) /* Already done in rtld itself.  */
+#endif
+	  *addr_field = map->l_addr + reloc->r_addend;
+	break;
+      }
+#endif
+
+    case R_LARCH_JUMP_SLOT:
+    case __WORDSIZE == 64 ? R_LARCH_64:
+    R_LARCH_32:
+      *addr_field = value;
+      break;
+
+    case R_LARCH_IRELATIVE:
+      value = map->l_addr + reloc->r_addend;
+      if (__glibc_likely (!skip_ifunc))
+	value = ((ElfW (Addr) (*) (void)) value) ();
+      *addr_field = value;
+      break;
+
+    case R_LARCH_NONE:
+      break;
+
+    default:
+      _dl_reloc_bad_type (map, r_type, 0);
+      break;
+    }
+}
+
+static inline void __attribute__ ((always_inline))
+elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) * reloc,
+			   void *const reloc_addr)
+{
+  *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend;
+}
+
+static inline void __attribute__ ((always_inline))
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
+		      ElfW (Addr) l_addr,
+		      const ElfW (Rela) * reloc, int skip_ifunc)
+{
+  ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+  const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
+
+  /* Check for unexpected PLT reloc type.  */
+  if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT))
+    {
+      if (__glibc_unlikely (map->l_mach.plt == 0))
+	{
+	  if (l_addr)
+	    *reloc_addr += l_addr;
+	}
+      else
+	*reloc_addr = map->l_mach.plt;
+    }
+  else if (__glibc_unlikely (r_type == R_LARCH_IRELATIVE))
+    {
+      ElfW (Addr) *value = (void *) (l_addr + reloc->r_addend);
+      if (__glibc_likely (!skip_ifunc))
+	value = (ElfW (Addr) *) ((ElfW (Addr) (*) (void)) value) ();
+      *reloc_addr = (ElfW (Addr)) value;
+    }
+  else
+    _dl_reloc_bad_type (map, r_type, 1);
+}
+
+/* Set up the loaded object described by L so its stub function
+   will jump to the on-demand fixup code __dl_runtime_resolve.  */
+
+static inline int __attribute__ ((always_inline))
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
+			   int lazy, int profile)
+{
+#ifndef RTLD_BOOTSTRAP
+  /* If using PLTs, fill in the first two entries of .got.plt.  */
+  if (l->l_info[DT_JMPREL])
+    {
+      extern void _dl_runtime_resolve (void)
+	__attribute__ ((visibility ("hidden")));
+      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
+      /* If a library is prelinked but we have to relocate anyway,
+	 we have to be able to undo the prelinking of .got.plt.
+	 The prelinker saved the address of .plt for us here.  */
+      if (gotplt[1])
+	l->l_mach.plt = gotplt[1] + l->l_addr;
+      gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve;
+      gotplt[1] = (ElfW (Addr)) l;
+    }
+#endif
+
+  return lazy;
+}
+
+#endif /* RESOLVE_MAP */
diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
new file mode 100644
index 0000000000..eb610392f6
--- /dev/null
+++ b/sysdeps/loongarch/dl-trampoline.S
@@ -0,0 +1,91 @@
+/* PLT trampolines.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+/* Assembler veneer called from the PLT header code for lazy loading.
+   The PLT header passes its own args in t0-t2.  */
+
+#ifdef __loongarch_soft_float
+# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
+#else
+# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
+#endif
+
+ENTRY (_dl_runtime_resolve)
+
+	/* Save arguments to stack. */
+	ADDI	sp, sp, -FRAME_SIZE
+
+	REG_S	ra, sp, 9*SZREG
+	REG_S	a0, sp, 1*SZREG
+	REG_S	a1, sp, 2*SZREG
+	REG_S	a2, sp, 3*SZREG
+	REG_S	a3, sp, 4*SZREG
+	REG_S	a4, sp, 5*SZREG
+	REG_S	a5, sp, 6*SZREG
+	REG_S	a6, sp, 7*SZREG
+	REG_S	a7, sp, 8*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_S	fa0, sp, 10*SZREG + 0*SZFREG
+	FREG_S	fa1, sp, 10*SZREG + 1*SZFREG
+	FREG_S	fa2, sp, 10*SZREG + 2*SZFREG
+	FREG_S	fa3, sp, 10*SZREG + 3*SZFREG
+	FREG_S	fa4, sp, 10*SZREG + 4*SZFREG
+	FREG_S	fa5, sp, 10*SZREG + 5*SZFREG
+	FREG_S	fa6, sp, 10*SZREG + 6*SZFREG
+	FREG_S	fa7, sp, 10*SZREG + 7*SZFREG
+#endif
+
+	/* Update .got.plt and obtain runtime address of callee */
+	SLLI	a1, t1, 1
+	or	a0, t0, zero
+	ADD	a1, a1, t1
+	la	a2, _dl_fixup
+	jirl	ra, a2, 0
+	or	t1, v0, zero
+
+	/* Restore arguments from stack. */
+	REG_L	ra, sp, 9*SZREG
+	REG_L	a0, sp, 1*SZREG
+	REG_L	a1, sp, 2*SZREG
+	REG_L	a2, sp, 3*SZREG
+	REG_L	a3, sp, 4*SZREG
+	REG_L	a4, sp, 5*SZREG
+	REG_L	a5, sp, 6*SZREG
+	REG_L	a6, sp, 7*SZREG
+	REG_L	a7, sp, 8*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_L	fa0, sp, 10*SZREG + 0*SZFREG
+	FREG_L	fa1, sp, 10*SZREG + 1*SZFREG
+	FREG_L	fa2, sp, 10*SZREG + 2*SZFREG
+	FREG_L	fa3, sp, 10*SZREG + 3*SZFREG
+	FREG_L	fa4, sp, 10*SZREG + 4*SZFREG
+	FREG_L	fa5, sp, 10*SZREG + 5*SZFREG
+	FREG_L	fa6, sp, 10*SZREG + 6*SZFREG
+	FREG_L	fa7, sp, 10*SZREG + 7*SZFREG
+#endif
+
+	ADDI	sp, sp, FRAME_SIZE
+
+	/* Invoke the callee. */
+	jirl		zero, t1, 0
+END (_dl_runtime_resolve)
diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
new file mode 100644
index 0000000000..a4b8ea690e
--- /dev/null
+++ b/sysdeps/loongarch/jmpbuf-offsets.h
@@ -0,0 +1,22 @@
+/* Private macros for accessing __jmp_buf contents.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <jmpbuf-unwind.h>
+
+/* Helper for generic ____longjmp_chk().  */
+#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))
diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
new file mode 100644
index 0000000000..6fa509151d
--- /dev/null
+++ b/sysdeps/loongarch/jmpbuf-unwind.h
@@ -0,0 +1,45 @@
+/* Examine __jmp_buf for unwinding frames.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <setjmp.h>
+#include <stdint.h>
+#include <unwind.h>
+#include <sysdep.h>
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
+  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp))
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs)
+{
+  uintptr_t sp = regs[0].__sp;
+#ifdef PTR_DEMANGLE
+  PTR_DEMANGLE (sp);
+#endif
+  return sp;
+}
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
+
+/* We use the normal longjmp for unwinding.  */
+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h
new file mode 100644
index 0000000000..36b1b25b9f
--- /dev/null
+++ b/sysdeps/loongarch/ldsodefs.h
@@ -0,0 +1,41 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LOONGARCH_LDSODEFS_H
+#define _LOONGARCH_LDSODEFS_H 1
+
+#include <elf.h>
+
+struct La_loongarch_regs;
+struct La_loongarch_retval;
+
+#define ARCH_PLTENTER_MEMBERS \
+  ElfW (Addr) (*loongarch_gnu_pltenter) (ElfW (Sym) *, unsigned int, \
+					 uintptr_t *, uintptr_t *, \
+					 const struct La_loongarch_regs *, \
+					 unsigned int *, const char *name, \
+					 long int *framesizep);
+
+#define ARCH_PLTEXIT_MEMBERS \
+  unsigned int (*loongarch_gnu_pltexit) (ElfW (Sym) *, unsigned int, \
+		uintptr_t *, uintptr_t *, const struct La_loongarch_regs *, \
+		struct La_loongarch_retval *, const char *);
+
+#include_next <ldsodefs.h>
+
+#endif
diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h
new file mode 100644
index 0000000000..bbba73ed70
--- /dev/null
+++ b/sysdeps/loongarch/linkmap.h
@@ -0,0 +1,22 @@
+/* Definition of link_map_machine.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+struct link_map_machine
+{
+  ElfW (Addr) plt; /* Address of .plt.  */
+};
diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
new file mode 100644
index 0000000000..4a3cdd964e
--- /dev/null
+++ b/sysdeps/loongarch/machine-gmon.h
@@ -0,0 +1,37 @@
+/* LoongArch definitions for profiling support.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Accept 'frompc' address as argument from the function that calls
+   _mcount for profiling.  Use  __builtin_return_address (0)
+   for the 'selfpc' address.  */
+
+#include <sysdep.h>
+
+static void mcount_internal (unsigned long int frompc,
+			     unsigned long int selfpc);
+
+#define _MCOUNT_DECL(frompc, selfpc) \
+  static inline void mcount_internal (unsigned long int frompc, \
+				      unsigned long int selfpc)
+
+#define MCOUNT \
+  void _mcount (void *frompc) \
+  { \
+    mcount_internal ((unsigned long int) frompc, \
+		     (unsigned long int) RETURN_ADDRESS (0)); \
+  }
diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
new file mode 100644
index 0000000000..b93ae2f5da
--- /dev/null
+++ b/sysdeps/loongarch/setjmp.S
@@ -0,0 +1,66 @@
+/* setjmp for LoongArch.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+ENTRY (_setjmp)
+	li.w		a1,0
+	b		__sigsetjmp
+END (_setjmp)
+
+ENTRY (setjmp)
+	li.w		a1,1
+END (setjmp)
+
+ENTRY (__sigsetjmp)
+	REG_S ra, a0, 0*SZREG
+	REG_S sp, a0, 1*SZREG
+	REG_S x,  a0, 2*SZREG
+	REG_S fp, a0, 3*SZREG
+	REG_S s0, a0, 4*SZREG
+	REG_S s1, a0, 5*SZREG
+	REG_S s2, a0, 6*SZREG
+	REG_S s3, a0, 7*SZREG
+	REG_S s4, a0, 8*SZREG
+	REG_S s5, a0, 9*SZREG
+	REG_S s6, a0, 10*SZREG
+	REG_S s7, a0, 11*SZREG
+	REG_S s8, a0, 12*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_S $f24, a0, 13*SZREG + 0*SZFREG
+	FREG_S $f25, a0, 13*SZREG + 1*SZFREG
+	FREG_S $f26, a0, 13*SZREG + 2*SZFREG
+	FREG_S $f27, a0, 13*SZREG + 3*SZFREG
+	FREG_S $f28, a0, 13*SZREG + 4*SZFREG
+	FREG_S $f29, a0, 13*SZREG + 5*SZFREG
+	FREG_S $f30, a0, 13*SZREG + 6*SZFREG
+	FREG_S $f31, a0, 13*SZREG + 7*SZFREG
+#endif
+
+#if !IS_IN (libc) && IS_IN(rtld)
+	li.w		v0, 0
+	jirl		zero,ra,0
+#else
+	b		__sigjmp_save
+#endif
+END (__sigsetjmp)
+
+hidden_def (__sigsetjmp)
+weak_alias (_setjmp, __GI__setjmp)
diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
new file mode 100644
index 0000000000..5b15f4815a
--- /dev/null
+++ b/sysdeps/loongarch/sotruss-lib.c
@@ -0,0 +1,50 @@
+/* Override generic sotruss-lib.c to define actual functions for LoongArch.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define HAVE_ARCH_PLTENTER
+#define HAVE_ARCH_PLTEXIT
+
+#include <elf/sotruss-lib.c>
+
+ElfW (Addr)
+la_loongarch_gnu_pltenter (ElfW (Sym) * sym __attribute__ ((unused)),
+			   unsigned int ndx __attribute__ ((unused)),
+			   uintptr_t *refcook, uintptr_t *defcook,
+			   La_loongarch_regs *regs, unsigned int *flags,
+			   const char *symname, long int *framesizep)
+{
+  print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1],
+		   regs->lr_reg[2], *flags);
+
+  /* No need to copy anything, we will not need the parameters in any case.  */
+  *framesizep = 0;
+
+  return sym->st_value;
+}
+
+unsigned int
+la_loongarch_gnu_pltexit (ElfW (Sym) * sym, unsigned int ndx,
+			  uintptr_t *refcook, uintptr_t *defcook,
+			  const struct La_loongarch_regs *inregs,
+			  struct La_loongarch_retval *outregs,
+			  const char *symname)
+{
+  print_exit (refcook, defcook, symname, outregs->lrv_a0);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
new file mode 100644
index 0000000000..a9b32aa966
--- /dev/null
+++ b/sysdeps/loongarch/start.S
@@ -0,0 +1,67 @@
+/* Startup code compliant to the ELF LoongArch ABI.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __ASSEMBLY__ 1
+#include <entry.h>
+#include <sys/asm.h>
+
+/* The entry point's job is to call __libc_start_main.  Per the ABI,
+   a0 contains the address of a function to be passed to atexit.
+   __libc_start_main wants this in a5.  */
+
+/*
+int
+__libc_start_main (int (*main) (int, char **, char **),
+		   int argc,
+		   char **argv,
+		   __typeof (main) init,
+		   void (*fini) (void),
+		   void (*rtld_fini) (void),
+		   void *stack_end);
+ */
+
+ENTRY (ENTRY_POINT)
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+	or		a5, a0, zero /* rtld_fini */
+
+/* We must get symbol main through GOT table, since main may not be local.
+   For instance: googletest defines main in dynamic library.  */
+	la.got		a0, t0, main
+	REG_L		a1, sp, 0
+	ADDI		a2, sp, SZREG
+
+	/* Adjust $sp for 16-aligned */
+	SRLI		sp, sp, 4
+	SLLI		sp, sp, 4
+
+	move		a3, zero /* used to be init */
+	move		a4, zero /* used to be fini */
+	or		a6, sp, zero /* stack_end */
+
+	la.got		ra, t0, __libc_start_main
+	jirl		ra, ra, 0
+
+	la.got		ra, t0, abort
+	jirl		ra, ra, 0
+END (ENTRY_POINT)
+
diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h
new file mode 100644
index 0000000000..b41ee59694
--- /dev/null
+++ b/sysdeps/loongarch/sys/asm.h
@@ -0,0 +1,59 @@
+/* Miscellaneous macros.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_ASM_H
+#define _SYS_ASM_H
+
+#include <sys/regdef.h>
+#include <sysdeps/generic/sysdep.h>
+
+/* Macros to handle different pointer/register sizes for 32/64-bit code.  */
+#define SZREG 8
+#define SZFREG 8
+#define REG_L ld.d
+#define REG_S st.d
+#define SRLI srli.d
+#define SLLI slli.d
+#define ADDI addi.d
+#define ADD  add.d
+#define BSTRINS  bstrins.d
+#define LI  li.d
+#define FREG_L fld.d
+#define FREG_S fst.d
+
+/* Declare leaf routine.  */
+#define LEAF(symbol) \
+  .text; \
+  .globl symbol; \
+  .align 3; \
+  cfi_startproc; \
+  .type symbol, @function; \
+  symbol:
+
+#define ENTRY(symbol) LEAF (symbol)
+
+/* Mark end of function.  */
+#undef END
+#define END(function) \
+  cfi_endproc; \
+  .size function, .- function;
+
+/* Stack alignment.  */
+#define ALMASK ~15
+
+#endif /* sys/asm.h */
diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
new file mode 100644
index 0000000000..e71948c86e
--- /dev/null
+++ b/sysdeps/loongarch/tst-audit.h
@@ -0,0 +1,23 @@
+/* Definitions for testing PLT entry/exit auditing.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define pltenter la_loongarch_gnu_pltenter
+#define pltexit la_loongarch_gnu_pltexit
+#define La_regs La_loongarch_regs
+#define La_retval La_loongarch_retval
+#define int_retval lrv_a0
diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
new file mode 100644
index 0000000000..4887c30ca2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
@@ -0,0 +1,26 @@
+/* ldconfig default paths and libraries.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/ldconfig.h>
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
+  { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
+
+#define SYSDEP_KNOWN_LIBRARY_NAMES	\
+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
+  { "libm.so.6", FLAG_ELF_LIBC6 },
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 05/13] LoongArch: Thread-Local Storage Support
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (3 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 sysdeps/loongarch/dl-tls.h             |  46 +++++++++
 sysdeps/loongarch/libc-tls.c           |  32 ++++++
 sysdeps/loongarch/nptl/tcb-offsets.sym |   6 ++
 sysdeps/loongarch/nptl/tls.h           | 138 +++++++++++++++++++++++++
 sysdeps/loongarch/stackinfo.h          |  33 ++++++
 5 files changed, 255 insertions(+)
 create mode 100644 sysdeps/loongarch/dl-tls.h
 create mode 100644 sysdeps/loongarch/libc-tls.c
 create mode 100644 sysdeps/loongarch/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/loongarch/nptl/tls.h
 create mode 100644 sysdeps/loongarch/stackinfo.h

diff --git a/sysdeps/loongarch/dl-tls.h b/sysdeps/loongarch/dl-tls.h
new file mode 100644
index 0000000000..f82edcae76
--- /dev/null
+++ b/sysdeps/loongarch/dl-tls.h
@@ -0,0 +1,46 @@
+/* Thread-local storage handling in the ELF dynamic linker.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Type used for the representation of TLS information in the GOT.  */
+typedef struct
+{
+  unsigned long int ti_module;
+  unsigned long int ti_offset;
+} tls_index;
+
+/* The thread pointer points to the first static TLS block.  */
+#define TLS_TP_OFFSET 0
+
+/* Dynamic thread vector pointers point to the start of each
+   TLS block.  */
+#define TLS_DTV_OFFSET 0
+
+/* Compute the value for a GOTTPREL reloc.  */
+#define TLS_TPREL_VALUE(sym_map, sym) \
+  ((sym_map)->l_tls_offset + (sym)->st_value - TLS_TP_OFFSET)
+
+/* Compute the value for a DTPREL reloc.  */
+#define TLS_DTPREL_VALUE(sym) ((sym)->st_value - TLS_DTV_OFFSET)
+
+extern void *__tls_get_addr (tls_index *ti);
+
+#define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET)
+#define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET)
+
+/* Value used for dtv entries for which the allocation is delayed.  */
+#define TLS_DTV_UNALLOCATED ((void *) -1l)
diff --git a/sysdeps/loongarch/libc-tls.c b/sysdeps/loongarch/libc-tls.c
new file mode 100644
index 0000000000..9285d11a7b
--- /dev/null
+++ b/sysdeps/loongarch/libc-tls.c
@@ -0,0 +1,32 @@
+/* Thread-local storage handling in the ELF dynamic linker.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <csu/libc-tls.c>
+#include <dl-tls.h>
+
+/* On LoongArch, linker optimizations are not required, so __tls_get_addr
+   can be called even in statically linked binaries.  In this case module
+   must be always 1 and PT_TLS segment exist in the binary, otherwise it
+   would not link.  */
+
+void *
+__tls_get_addr (tls_index *ti)
+{
+  dtv_t *dtv = THREAD_DTV ();
+  return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET;
+}
diff --git a/sysdeps/loongarch/nptl/tcb-offsets.sym b/sysdeps/loongarch/nptl/tcb-offsets.sym
new file mode 100644
index 0000000000..7d0c7596e8
--- /dev/null
+++ b/sysdeps/loongarch/nptl/tcb-offsets.sym
@@ -0,0 +1,6 @@
+#include <sysdep.h>
+#include <tls.h>
+
+#define thread_offsetof(mem)  (long)(offsetof (struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads)
diff --git a/sysdeps/loongarch/nptl/tls.h b/sysdeps/loongarch/nptl/tls.h
new file mode 100644
index 0000000000..f77265ae52
--- /dev/null
+++ b/sysdeps/loongarch/nptl/tls.h
@@ -0,0 +1,138 @@
+/* Definition for thread-local data handling.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LOONGARCH_TLS_H
+#define _LOONGARCH_TLS_H 1
+
+#include <dl-sysdep.h>
+
+#ifndef __ASSEMBLER__
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <dl-dtv.h>
+
+register void *__thread_self asm("$tp");
+#define READ_THREAD_POINTER() ({ __thread_self; })
+
+/* Get system call information.  */
+#include <sysdep.h>
+
+/* The TP points to the start of the thread blocks.  */
+#define TLS_DTV_AT_TP 1
+#define TLS_TCB_AT_TP 0
+
+/* Get the thread descriptor definition.  */
+#include <nptl/descr.h>
+
+typedef struct
+{
+  dtv_t *dtv;
+  void *private;
+} tcbhead_t;
+
+/* This is the size of the initial TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+#define TLS_INIT_TCB_SIZE 0
+
+/* Alignment requirements for the initial TCB.  */
+#define TLS_INIT_TCB_ALIGN __alignof__(struct pthread)
+
+/* This is the size of the TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+#define TLS_TCB_SIZE 0
+
+/* Alignment requirements for the TCB.  */
+#define TLS_TCB_ALIGN __alignof__(struct pthread)
+
+/* This is the size we need before TCB - actually, it includes the TCB.  */
+#define TLS_PRE_TCB_SIZE \
+  (sizeof (struct pthread) \
+   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
+
+/* The thread pointer tp points to the end of the TCB.
+   The pthread_descr structure is immediately in front of the TCB.  */
+#define TLS_TCB_OFFSET 0
+
+/* Install the dtv pointer.  The pointer passed is to the element with
+   index -1 which contain the length.  */
+#define INSTALL_DTV(tcbp, dtvp) (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1)
+
+/* Install new dtv for current thread.  */
+#define INSTALL_NEW_DTV(dtv) (THREAD_DTV () = (dtv))
+
+/* Return dtv of given thread descriptor.  */
+#define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv)
+
+/* Code to initially initialize the thread pointer.  */
+#define TLS_INIT_TP(tcbp) \
+  ({ \
+    __thread_self = (char *) tcbp + TLS_TCB_OFFSET; \
+    NULL; \
+  })
+
+/* Return the address of the dtv for the current thread.  */
+#define THREAD_DTV() \
+  (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv)
+
+/* Return the thread descriptor for the current thread.  */
+#define THREAD_SELF \
+  ((struct pthread *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET \
+		       - TLS_PRE_TCB_SIZE))
+
+/* Value passed to 'clone' for initialization of the thread register.  */
+#define TLS_DEFINE_INIT_TP(tp, pd) \
+  void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE
+
+/* Informs libthread_db that the thread pointer is register 2, which is used
+ * to know how to do THREAD_SELF.  */
+#define DB_THREAD_SELF \
+  REGISTER (64, 64, 2 * 8, -TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+/* Access to data in the thread descriptor is easy.  */
+# include <tcb-access.h>
+
+/* l_tls_offset == 0 is perfectly valid, so we have to use some different
+   value to mean unset l_tls_offset.  */
+#define NO_TLS_OFFSET -1
+
+/* Get and set the global scope generation counter in struct pthread.  */
+#define THREAD_GSCOPE_IN_TCB 1
+#define THREAD_GSCOPE_FLAG_UNUSED 0
+#define THREAD_GSCOPE_FLAG_USED 1
+#define THREAD_GSCOPE_FLAG_WAIT 2
+#define THREAD_GSCOPE_RESET_FLAG() \
+  do \
+    { \
+      int __res = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
+				       THREAD_GSCOPE_FLAG_UNUSED); \
+      if (__res == THREAD_GSCOPE_FLAG_WAIT) \
+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
+    } \
+  while (0)
+#define THREAD_GSCOPE_SET_FLAG() \
+  do \
+    { \
+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
+      atomic_write_barrier (); \
+    } \
+  while (0)
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* tls.h */
diff --git a/sysdeps/loongarch/stackinfo.h b/sysdeps/loongarch/stackinfo.h
new file mode 100644
index 0000000000..ff8b9b7bf2
--- /dev/null
+++ b/sysdeps/loongarch/stackinfo.h
@@ -0,0 +1,33 @@
+/* Stack environment definitions for LoongArch.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This file contains a bit of information about the stack allocation
+   of the processor.  */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H 1
+
+#include <elf.h>
+
+/* On LoongArch the stack grows down.  */
+#define _STACK_GROWS_DOWN 1
+
+/* Default to a non-executable stack.  */
+#define DEFAULT_STACK_PERMS (PF_R | PF_W)
+
+#endif /* stackinfo.h */
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 06/13] LoongArch: Generic <math.h> and soft-fp Routines
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (4 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 05/13] LoongArch: Thread-Local Storage Support caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 07/13] LoongArch: Atomic and Locking Routines caiyinyu
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 sysdeps/loongarch/bits/fenv.h   |  90 ++++++++++++++++++++++++++++
 sysdeps/loongarch/e_sqrtl.c     |  38 ++++++++++++
 sysdeps/loongarch/fpu_control.h | 102 ++++++++++++++++++++++++++++++++
 sysdeps/loongarch/sfp-machine.h | 102 ++++++++++++++++++++++++++++++++
 sysdeps/loongarch/tininess.h    |   1 +
 5 files changed, 333 insertions(+)
 create mode 100644 sysdeps/loongarch/bits/fenv.h
 create mode 100644 sysdeps/loongarch/e_sqrtl.c
 create mode 100644 sysdeps/loongarch/fpu_control.h
 create mode 100644 sysdeps/loongarch/sfp-machine.h
 create mode 100644 sysdeps/loongarch/tininess.h

diff --git a/sysdeps/loongarch/bits/fenv.h b/sysdeps/loongarch/bits/fenv.h
new file mode 100644
index 0000000000..7e223b402b
--- /dev/null
+++ b/sysdeps/loongarch/bits/fenv.h
@@ -0,0 +1,90 @@
+/* Floating point environment.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FENV_H
+#error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+/* Define bits representing the exception.  We use the bit positions
+   of the appropriate bits in the FPU control word.  */
+enum
+{
+  FE_INEXACT =
+#define FE_INEXACT 0x010000
+    FE_INEXACT,
+  FE_UNDERFLOW =
+#define FE_UNDERFLOW 0x020000
+    FE_UNDERFLOW,
+  FE_OVERFLOW =
+#define FE_OVERFLOW 0x040000
+    FE_OVERFLOW,
+  FE_DIVBYZERO =
+#define FE_DIVBYZERO 0x080000
+    FE_DIVBYZERO,
+  FE_INVALID =
+#define FE_INVALID 0x100000
+    FE_INVALID,
+};
+
+#define FE_ALL_EXCEPT \
+  (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* The LoongArch FPU supports all of the four defined rounding modes.  We
+   use again the bit positions in the FPU control word as the values
+   for the appropriate macros.  */
+enum
+{
+  FE_TONEAREST =
+#define FE_TONEAREST 0x000
+    FE_TONEAREST,
+  FE_TOWARDZERO =
+#define FE_TOWARDZERO 0x100
+    FE_TOWARDZERO,
+  FE_UPWARD =
+#define FE_UPWARD 0x200
+    FE_UPWARD,
+  FE_DOWNWARD =
+#define FE_DOWNWARD 0x300
+    FE_DOWNWARD
+};
+
+/* Type representing exception flags.  */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment.  This function corresponds
+   to the layout of the block written by the `fstenv'.  */
+typedef struct
+{
+  unsigned int __fp_control_register;
+} fenv_t;
+
+/* If the default argument is used we use this value.  */
+#define FE_DFL_ENV ((const fenv_t *) -1)
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exception is masked.  */
+#define FE_NOMASK_ENV ((const fenv_t *) -257)
+#endif
+
+#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
+/* Type representing floating-point control modes.  */
+typedef unsigned int femode_t;
+
+/* Default floating-point control modes.  */
+#define FE_DFL_MODE ((const femode_t *) -1L)
+#endif
diff --git a/sysdeps/loongarch/e_sqrtl.c b/sysdeps/loongarch/e_sqrtl.c
new file mode 100644
index 0000000000..5eb8cc8adb
--- /dev/null
+++ b/sysdeps/loongarch/e_sqrtl.c
@@ -0,0 +1,38 @@
+/* long double square root in software floating-point emulation.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdlib.h>
+#include <soft-fp/soft-fp.h>
+#include <soft-fp/quad.h>
+
+long double
+__ieee754_sqrtl (const long double a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q (A);
+  FP_DECL_Q (C);
+  long double c;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q (A, a);
+  FP_SQRT_Q (C, A);
+  FP_PACK_Q (c, C);
+  FP_HANDLE_EXCEPTIONS;
+  return c;
+}
+strong_alias (__ieee754_sqrtl, __sqrtl_finite)
diff --git a/sysdeps/loongarch/fpu_control.h b/sysdeps/loongarch/fpu_control.h
new file mode 100644
index 0000000000..e302ae52b1
--- /dev/null
+++ b/sysdeps/loongarch/fpu_control.h
@@ -0,0 +1,102 @@
+/* FPU control word bits.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* LoongArch FPU floating point control register bits.
+ *
+ * 31-29  -> reserved (read as 0, can not changed by software)
+ * 28     -> cause bit for invalid exception
+ * 27     -> cause bit for division by zero exception
+ * 26     -> cause bit for overflow exception
+ * 25     -> cause bit for underflow exception
+ * 24     -> cause bit for inexact exception
+ * 23-21  -> reserved (read as 0, can not changed by software)
+ * 20     -> flag invalid exception
+ * 19     -> flag division by zero exception
+ * 18     -> flag overflow exception
+ * 17     -> flag underflow exception
+ * 16     -> flag inexact exception
+ *  9-8   -> rounding control
+ *  7-5   -> reserved (read as 0, can not changed by software)
+ *  4     -> enable exception for invalid exception
+ *  3     -> enable exception for division by zero exception
+ *  2     -> enable exception for overflow exception
+ *  1     -> enable exception for underflow exception
+ *  0     -> enable exception for inexact exception
+ *
+ *
+ * Rounding Control:
+ * 00 - rounding ties to even (RNE)
+ * 01 - rounding toward zero (RZ)
+ * 10 - rounding (up) toward plus infinity (RP)
+ * 11 - rounding (down) toward minus infinity (RM)
+ */
+
+#include <features.h>
+
+#ifdef __loongarch_soft_float
+
+#define _FPU_RESERVED 0xffffffff
+#define _FPU_DEFAULT 0x00000000
+typedef unsigned int fpu_control_t;
+#define _FPU_GETCW(cw) (cw) = 0
+#define _FPU_SETCW(cw) (void) (cw)
+extern fpu_control_t __fpu_control;
+
+#else /* __loongarch_soft_float */
+
+/* Masks for interrupts.  */
+#define _FPU_MASK_V 0x10 /* Invalid operation */
+#define _FPU_MASK_Z 0x08 /* Division by zero  */
+#define _FPU_MASK_O 0x04 /* Overflow */
+#define _FPU_MASK_U 0x02 /* Underflow */
+#define _FPU_MASK_I 0x01 /* Inexact operation */
+
+/* Flush denormalized numbers to zero.  */
+#define _FPU_FLUSH_TZ 0x1000000
+
+/* Rounding control.  */
+#define _FPU_RC_NEAREST 0x000 /* RECOMMENDED */
+#define _FPU_RC_ZERO 0x100
+#define _FPU_RC_UP 0x200
+#define _FPU_RC_DOWN 0x300
+/* Mask for rounding control.  */
+#define _FPU_RC_MASK 0x300
+
+#define _FPU_RESERVED 0x0
+
+#define _FPU_DEFAULT 0x0
+#define _FPU_IEEE 0x1F
+
+/* Type of the control word.  */
+typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
+
+/* Macros for accessing the hardware control word.  */
+extern fpu_control_t __loongarch_fpu_getcw (void) __THROW;
+extern void __loongarch_fpu_setcw (fpu_control_t) __THROW;
+#define _FPU_GETCW(cw) __asm__ volatile("movfcsr2gr %0,$r0" : "=r"(cw))
+#define _FPU_SETCW(cw) __asm__ volatile("movgr2fcsr $r0,%0" : : "r"(cw))
+
+/* Default control word set at startup.  */
+extern fpu_control_t __fpu_control;
+
+#endif /* __loongarch_soft_float */
+
+#endif /* fpu_control.h */
diff --git a/sysdeps/loongarch/sfp-machine.h b/sysdeps/loongarch/sfp-machine.h
new file mode 100644
index 0000000000..27391f2945
--- /dev/null
+++ b/sysdeps/loongarch/sfp-machine.h
@@ -0,0 +1,102 @@
+/* LoongArch softfloat definitions
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#define _FP_W_TYPE_SIZE 64
+#define _FP_W_TYPE unsigned long long
+#define _FP_WS_TYPE signed long long
+#define _FP_I_TYPE long long
+
+#define _FP_MUL_MEAT_S(R, X, Y) _FP_MUL_MEAT_1_imm (_FP_WFRACBITS_S, R, X, Y)
+#define _FP_MUL_MEAT_D(R, X, Y) \
+  _FP_MUL_MEAT_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
+#define _FP_MUL_MEAT_Q(R, X, Y) \
+  _FP_MUL_MEAT_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
+
+#define _FP_MUL_MEAT_DW_S(R, X, Y) \
+  _FP_MUL_MEAT_DW_1_imm (_FP_WFRACBITS_S, R, X, Y)
+#define _FP_MUL_MEAT_DW_D(R, X, Y) \
+  _FP_MUL_MEAT_DW_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
+#define _FP_MUL_MEAT_DW_Q(R, X, Y) \
+  _FP_MUL_MEAT_DW_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R, X, Y) \
+  _FP_DIV_MEAT_1_imm (S, R, X, Y, _FP_DIV_HELP_imm)
+#define _FP_DIV_MEAT_D(R, X, Y) _FP_DIV_MEAT_1_udiv_norm (D, R, X, Y)
+#define _FP_DIV_MEAT_Q(R, X, Y) _FP_DIV_MEAT_2_udiv (Q, R, X, Y)
+
+#define _FP_NANFRAC_S _FP_QNANBIT_S
+#define _FP_NANFRAC_D _FP_QNANBIT_D
+#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0
+
+#define _FP_NANSIGN_S 0
+#define _FP_NANSIGN_D 0
+#define _FP_NANSIGN_Q 0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+/* NaN payloads should be preserved for NAN2008.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
+  do \
+    { \
+      R##_s = X##_s; \
+      _FP_FRAC_COPY_##wc (R, X); \
+      R##_c = FP_CLS_NAN; \
+    } \
+  while (0)
+
+#define _FP_DECL_EX fpu_control_t _fcw
+
+#define FP_ROUNDMODE (_fcw & 0x300)
+
+#define FP_RND_NEAREST FE_TONEAREST
+#define FP_RND_ZERO FE_TOWARDZERO
+#define FP_RND_PINF FE_UPWARD
+#define FP_RND_MINF FE_DOWNWARD
+
+#define FP_EX_INVALID FE_INVALID
+#define FP_EX_OVERFLOW FE_OVERFLOW
+#define FP_EX_UNDERFLOW FE_UNDERFLOW
+#define FP_EX_DIVZERO FE_DIVBYZERO
+#define FP_EX_INEXACT FE_INEXACT
+
+#define _FP_TININESS_AFTER_ROUNDING 1
+
+#ifdef __loongarch_hard_float
+#define FP_INIT_ROUNDMODE \
+  do \
+    { \
+      _FPU_GETCW (_fcw); \
+    } \
+  while (0)
+
+#define FP_HANDLE_EXCEPTIONS \
+  do \
+    { \
+      if (__builtin_expect (_fex, 0)) \
+	_FPU_SETCW (_fcw | _fex | (_fex << 8)); \
+    } \
+  while (0)
+#define FP_TRAPPING_EXCEPTIONS ((_fcw << 16) & 0x1f0000)
+#else
+#define FP_INIT_ROUNDMODE _fcw = FP_RND_NEAREST
+#endif
diff --git a/sysdeps/loongarch/tininess.h b/sysdeps/loongarch/tininess.h
new file mode 100644
index 0000000000..90956c35f7
--- /dev/null
+++ b/sysdeps/loongarch/tininess.h
@@ -0,0 +1 @@
+#define TININESS_AFTER_ROUNDING 1
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 07/13] LoongArch: Atomic and Locking Routines
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (5 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 08/13] LoongArch: Linux Syscall Interface caiyinyu
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 .../sysv/linux/loongarch/atomic-machine.h     | 181 ++++++++++++++++++
 1 file changed, 181 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h

diff --git a/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
new file mode 100644
index 0000000000..60db25587e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
@@ -0,0 +1,181 @@
+/* Atomic operations.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LINUX_LOONGARCH_BITS_ATOMIC_H
+#define _LINUX_LOONGARCH_BITS_ATOMIC_H 1
+
+#define atomic_full_barrier() __sync_synchronize ()
+
+#define __HAVE_64B_ATOMICS (__loongarch_grlen >=64)
+#define USE_ATOMIC_COMPILER_BUILTINS 1
+#define ATOMIC_EXCHANGE_USES_CAS 0
+
+/* Compare and exchange.
+   For all "bool" routines, we return FALSE if exchange succesful.  */
+
+#define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+/* Atomic compare and exchange.  */
+
+#define atomic_compare_and_exchange_bool_acq(mem, new, old) \
+  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int, mem, new, old, \
+			__ATOMIC_ACQUIRE)
+
+#define atomic_compare_and_exchange_val_acq(mem, new, old) \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \
+		       __ATOMIC_ACQUIRE)
+
+#define atomic_compare_and_exchange_val_rel(mem, new, old) \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \
+		       __ATOMIC_RELEASE)
+
+/* Atomic exchange (without compare).  */
+
+#define __arch_exchange_8_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_16_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_32_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_64_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define atomic_exchange_acq(mem, value) \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_rel(mem, value) \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE)
+
+/* Atomically add value and return the previous (unincremented) value.  */
+
+#define __arch_exchange_and_add_8_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_16_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_32_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_64_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define atomic_exchange_and_add_acq(mem, value) \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \
+		       __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_and_add_rel(mem, value) \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \
+		       __ATOMIC_RELEASE)
+
+/* Miscellaneous.  */
+
+#define asm_amo(which, mem, value) \
+  ({ \
+    __atomic_check_size (mem); \
+    typeof (*mem) __tmp; \
+    if (sizeof (__tmp) == 4) \
+      asm volatile(which ".w" \
+			 "\t%0, %z2, %1" \
+		   : "=&r"(__tmp), "+ZB"(*(mem)) \
+		   : "rJ"(value)); \
+    else if (sizeof (__tmp) == 8) \
+      asm volatile(which ".d" \
+			 "\t%0, %z2, %1" \
+		   : "=&r"(__tmp), "+ZB"(*(mem)) \
+		   : "rJ"(value)); \
+    else \
+      abort (); \
+    __tmp; \
+  })
+
+#define atomic_max(mem, value) asm_amo ("ammax_db", mem, value)
+#define atomic_min(mem, value) asm_amo ("ammin_db", mem, value)
+
+#define atomic_bit_test_set(mem, bit) \
+  ({ \
+    typeof (*mem) __mask = (typeof (*mem)) 1 << (bit); \
+    asm_amo ("amor_db", mem, __mask) & __mask; \
+  })
+
+#define catomic_exchange_and_add(mem, value) \
+  atomic_exchange_and_add (mem, value)
+#define catomic_max(mem, value) atomic_max (mem, value)
+
+#endif /* bits/atomic.h */
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 08/13] LoongArch: Linux Syscall Interface
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (6 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 07/13] LoongArch: Atomic and Locking Routines caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 09/13] LoongArch: Linux ABI caiyinyu
  2022-05-09  2:30 ` [PATCH v4 10/13] LoongArch: Add ABI Lists caiyinyu
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 sysdeps/loongarch/abort-instr.h               |   2 +
 sysdeps/loongarch/hp-timing.h                 |  42 +++
 .../unix/sysv/linux/loongarch/arch-syscall.h  | 303 +++++++++++++++++
 sysdeps/unix/sysv/linux/loongarch/clone.S     |  96 ++++++
 sysdeps/unix/sysv/linux/loongarch/clone3.S    |  83 +++++
 sysdeps/unix/sysv/linux/loongarch/sysdep.S    |  53 +++
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    | 321 ++++++++++++++++++
 sysdeps/unix/sysv/linux/loongarch/vfork.S     |  50 +++
 8 files changed, 950 insertions(+)
 create mode 100644 sysdeps/loongarch/abort-instr.h
 create mode 100644 sysdeps/loongarch/hp-timing.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S

diff --git a/sysdeps/loongarch/abort-instr.h b/sysdeps/loongarch/abort-instr.h
new file mode 100644
index 0000000000..46d3ad0871
--- /dev/null
+++ b/sysdeps/loongarch/abort-instr.h
@@ -0,0 +1,2 @@
+/* An instruction which should crash any program is a breakpoint.  */
+#define ABORT_INSTRUCTION asm ("break 0")
diff --git a/sysdeps/loongarch/hp-timing.h b/sysdeps/loongarch/hp-timing.h
new file mode 100644
index 0000000000..af1da81024
--- /dev/null
+++ b/sysdeps/loongarch/hp-timing.h
@@ -0,0 +1,42 @@
+/* High precision, low overhead timing functions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _HP_TIMING_H
+#define _HP_TIMING_H 1
+
+/* We always assume having the timestamp register.  */
+#define HP_TIMING_AVAIL (1)
+#define HP_SMALL_TIMING_AVAIL (1)
+
+/* We indeed have inlined functions.  */
+#define HP_TIMING_INLINE (1)
+
+/* We use 64bit values for the times.  */
+typedef unsigned long long int hp_timing_t;
+
+/* Read the stable counter.  */
+#define HP_TIMING_NOW(Var) \
+  ({ \
+    unsigned long long int _count; \
+    asm volatile ("rdtime.d\t%0,$r0" : "=r" (_count)); \
+    (Var) = _count; \
+  })
+
+#include <hp-timing-common.h>
+
+#endif /* hp-timing.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
new file mode 100644
index 0000000000..f9d64818a8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
@@ -0,0 +1,303 @@
+/* AUTOGENERATED by update-syscall-lists.py.  */
+#define __NR_accept 202
+#define __NR_accept4 242
+#define __NR_acct 89
+#define __NR_add_key 217
+#define __NR_adjtimex 171
+#define __NR_bind 200
+#define __NR_bpf 280
+#define __NR_brk 214
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_chdir 49
+#define __NR_chroot 51
+#define __NR_clock_adjtime 266
+#define __NR_clock_getres 114
+#define __NR_clock_gettime 113
+#define __NR_clock_nanosleep 115
+#define __NR_clock_settime 112
+#define __NR_clone 220
+#define __NR_clone3 435
+#define __NR_close 57
+#define __NR_close_range 436
+#define __NR_connect 203
+#define __NR_copy_file_range 285
+#define __NR_delete_module 106
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_epoll_pwait2 441
+#define __NR_eventfd2 19
+#define __NR_execve 221
+#define __NR_execveat 281
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_faccessat 48
+#define __NR_faccessat2 439
+#define __NR_fadvise64 223
+#define __NR_fallocate 47
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_fchdir 50
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchown 55
+#define __NR_fchownat 54
+#define __NR_fcntl 25
+#define __NR_fdatasync 83
+#define __NR_fgetxattr 10
+#define __NR_finit_module 273
+#define __NR_flistxattr 13
+#define __NR_flock 32
+#define __NR_fremovexattr 16
+#define __NR_fsconfig 431
+#define __NR_fsetxattr 7
+#define __NR_fsmount 432
+#define __NR_fsopen 430
+#define __NR_fspick 433
+#define __NR_fstat 80
+#define __NR_fstatfs 44
+#define __NR_fsync 82
+#define __NR_ftruncate 46
+#define __NR_futex 98
+#define __NR_futex_waitv 449
+#define __NR_get_mempolicy 236
+#define __NR_get_robust_list 100
+#define __NR_getcpu 168
+#define __NR_getcwd 17
+#define __NR_getdents64 61
+#define __NR_getegid 177
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getgroups 158
+#define __NR_getitimer 102
+#define __NR_getpeername 205
+#define __NR_getpgid 155
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getpriority 141
+#define __NR_getrandom 278
+#define __NR_getresgid 150
+#define __NR_getresuid 148
+#define __NR_getrusage 165
+#define __NR_getsid 156
+#define __NR_getsockname 204
+#define __NR_getsockopt 209
+#define __NR_gettid 178
+#define __NR_gettimeofday 169
+#define __NR_getuid 174
+#define __NR_getxattr 8
+#define __NR_init_module 105
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_init1 26
+#define __NR_inotify_rm_watch 28
+#define __NR_io_cancel 3
+#define __NR_io_destroy 1
+#define __NR_io_getevents 4
+#define __NR_io_pgetevents 292
+#define __NR_io_setup 0
+#define __NR_io_submit 2
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_io_uring_setup 425
+#define __NR_ioctl 29
+#define __NR_ioprio_get 31
+#define __NR_ioprio_set 30
+#define __NR_kcmp 272
+#define __NR_kexec_file_load 294
+#define __NR_kexec_load 104
+#define __NR_keyctl 219
+#define __NR_kill 129
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_restrict_self 446
+#define __NR_lgetxattr 9
+#define __NR_linkat 37
+#define __NR_listen 201
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_lookup_dcookie 18
+#define __NR_lremovexattr 15
+#define __NR_lseek 62
+#define __NR_lsetxattr 6
+#define __NR_madvise 233
+#define __NR_mbind 235
+#define __NR_membarrier 283
+#define __NR_memfd_create 279
+#define __NR_migrate_pages 238
+#define __NR_mincore 232
+#define __NR_mkdirat 34
+#define __NR_mknodat 33
+#define __NR_mlock 228
+#define __NR_mlock2 284
+#define __NR_mlockall 230
+#define __NR_mmap 222
+#define __NR_mount 40
+#define __NR_mount_setattr 442
+#define __NR_move_mount 429
+#define __NR_move_pages 239
+#define __NR_mprotect 226
+#define __NR_mq_getsetattr 185
+#define __NR_mq_notify 184
+#define __NR_mq_open 180
+#define __NR_mq_timedreceive 183
+#define __NR_mq_timedsend 182
+#define __NR_mq_unlink 181
+#define __NR_mremap 216
+#define __NR_msgctl 187
+#define __NR_msgget 186
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_msync 227
+#define __NR_munlock 229
+#define __NR_munlockall 231
+#define __NR_munmap 215
+#define __NR_name_to_handle_at 264
+#define __NR_nanosleep 101
+#define __NR_newfstatat 79
+#define __NR_nfsservctl 42
+#define __NR_open_by_handle_at 265
+#define __NR_open_tree 428
+#define __NR_openat 56
+#define __NR_openat2 437
+#define __NR_perf_event_open 241
+#define __NR_personality 92
+#define __NR_pidfd_getfd 438
+#define __NR_pidfd_open 434
+#define __NR_pidfd_send_signal 424
+#define __NR_pipe2 59
+#define __NR_pivot_root 41
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_pkey_mprotect 288
+#define __NR_ppoll 73
+#define __NR_prctl 167
+#define __NR_pread64 67
+#define __NR_preadv 69
+#define __NR_preadv2 286
+#define __NR_prlimit64 261
+#define __NR_process_madvise 440
+#define __NR_process_mrelease 448
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_pselect6 72
+#define __NR_ptrace 117
+#define __NR_pwrite64 68
+#define __NR_pwritev 70
+#define __NR_pwritev2 287
+#define __NR_quotactl 60
+#define __NR_quotactl_fd 443
+#define __NR_read 63
+#define __NR_readahead 213
+#define __NR_readlinkat 78
+#define __NR_readv 65
+#define __NR_reboot 142
+#define __NR_recvfrom 207
+#define __NR_recvmmsg 243
+#define __NR_recvmsg 212
+#define __NR_remap_file_pages 234
+#define __NR_removexattr 14
+#define __NR_renameat2 276
+#define __NR_request_key 218
+#define __NR_restart_syscall 128
+#define __NR_rseq 293
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_getaffinity 123
+#define __NR_sched_getattr 275
+#define __NR_sched_getparam 121
+#define __NR_sched_getscheduler 120
+#define __NR_sched_rr_get_interval 127
+#define __NR_sched_setaffinity 122
+#define __NR_sched_setattr 274
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_yield 124
+#define __NR_seccomp 277
+#define __NR_semctl 191
+#define __NR_semget 190
+#define __NR_semop 193
+#define __NR_semtimedop 192
+#define __NR_sendfile 71
+#define __NR_sendmmsg 269
+#define __NR_sendmsg 211
+#define __NR_sendto 206
+#define __NR_set_mempolicy 237
+#define __NR_set_mempolicy_home_node 450
+#define __NR_set_robust_list 99
+#define __NR_set_tid_address 96
+#define __NR_setdomainname 162
+#define __NR_setfsgid 152
+#define __NR_setfsuid 151
+#define __NR_setgid 144
+#define __NR_setgroups 159
+#define __NR_sethostname 161
+#define __NR_setitimer 103
+#define __NR_setns 268
+#define __NR_setpgid 154
+#define __NR_setpriority 140
+#define __NR_setregid 143
+#define __NR_setresgid 149
+#define __NR_setresuid 147
+#define __NR_setreuid 145
+#define __NR_setsid 157
+#define __NR_setsockopt 208
+#define __NR_settimeofday 170
+#define __NR_setuid 146
+#define __NR_setxattr 5
+#define __NR_shmat 196
+#define __NR_shmctl 195
+#define __NR_shmdt 197
+#define __NR_shmget 194
+#define __NR_shutdown 210
+#define __NR_sigaltstack 132
+#define __NR_signalfd4 74
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_splice 76
+#define __NR_statfs 43
+#define __NR_statx 291
+#define __NR_swapoff 225
+#define __NR_swapon 224
+#define __NR_symlinkat 36
+#define __NR_sync 81
+#define __NR_sync_file_range 84
+#define __NR_syncfs 267
+#define __NR_sysinfo 179
+#define __NR_syslog 116
+#define __NR_tee 77
+#define __NR_tgkill 131
+#define __NR_timer_create 107
+#define __NR_timer_delete 111
+#define __NR_timer_getoverrun 109
+#define __NR_timer_gettime 108
+#define __NR_timer_settime 110
+#define __NR_timerfd_create 85
+#define __NR_timerfd_gettime 87
+#define __NR_timerfd_settime 86
+#define __NR_times 153
+#define __NR_tkill 130
+#define __NR_truncate 45
+#define __NR_umask 166
+#define __NR_umount2 39
+#define __NR_uname 160
+#define __NR_unlinkat 35
+#define __NR_unshare 97
+#define __NR_userfaultfd 282
+#define __NR_utimensat 88
+#define __NR_vhangup 58
+#define __NR_vmsplice 75
+#define __NR_wait4 260
+#define __NR_waitid 95
+#define __NR_write 64
+#define __NR_writev 66
diff --git a/sysdeps/unix/sysv/linux/loongarch/clone.S b/sysdeps/unix/sysv/linux/loongarch/clone.S
new file mode 100644
index 0000000000..00d9ae3406
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/clone.S
@@ -0,0 +1,96 @@
+/* The clone syscall wrapper.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sys/asm.h>
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+#include <tls.h>
+#include "tcb-offsets.h"
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+   void *parent_tidptr, void *tls, void *child_tidptr) */
+
+ENTRY (__clone)
+
+	/* Align stack to 16 or 8 bytes per the ABI.  */
+	BSTRINS		a1, zero, 3, 0
+
+	/* Sanity check arguments.  */
+	beqz		a0, L (invalid) /* No NULL function pointers.  */
+	beqz		a1, L (invalid) /* No NULL stack pointers.  */
+
+	ADDI 		a1, a1, -16 /* Reserve argument save space.  */
+	REG_S		a0, a1, 0   /* Save function pointer.  */
+	REG_S		a3, a1, SZREG   /* Save argument pointer.  */
+
+	/* The syscall expects the args to be in different slots.  */
+	or		a0, a2, zero
+	or		a2, a4, zero
+	or		a3, a6, zero
+	or		a4, a5, zero
+
+	/* Do the system call.  */
+	LI		a7,__NR_clone
+	syscall		0
+
+	blt		a0, zero ,L (error)
+	beqz		a0,L (thread_start)
+
+	/* Successful return from the parent.  */
+	ret
+
+L (invalid):
+	LI		a0, -EINVAL
+
+	/* Something bad happened -- no child created.  */
+L (error):
+	b		__syscall_error
+
+END (__clone)
+
+/* Load up the arguments to the function.  Put this block of code in
+   its own function so that we can terminate the stack trace with our
+   debug info.  */
+ENTRY (__thread_start)
+L (thread_start):
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+
+	/* Restore the arg for user's function.  */
+	REG_L		a1, sp, 0   /* Function pointer.  */
+	REG_L		a0, sp, SZREG   /* Argument pointer.  */
+
+	/* Call the user's function.  */
+	jirl		ra, a1, 0
+
+	/* Call exit with the function's return value.  */
+	LI		a7, __NR_exit
+	syscall		0
+
+	END (__thread_start)
+
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/loongarch/clone3.S b/sysdeps/unix/sysv/linux/loongarch/clone3.S
new file mode 100644
index 0000000000..7cbb550dca
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/clone3.S
@@ -0,0 +1,83 @@
+/* The clone3 syscall wrapper.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* clone3() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sys/asm.h>
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+#include <tls.h>
+#include "tcb-offsets.h"
+
+/* int clone3(struct clone_args *cl_args, size_t size,
+   int (*func)(void *arg), void *arg); */
+
+ENTRY (__clone3)
+
+	/* Sanity check arguments.  */
+	beqz		a0, L (invalid)	/* No NULL cl_args pointer.  */
+	beqz		a2, L (invalid)	/* No NULL function pointer.  */
+
+	/* Do the system call.  */
+	LI		a7, __NR_clone3
+	syscall		0
+
+	blt		a0, zero ,L (error)
+	beqz		a0, L (thread_start3)
+
+	/* Successful return from the parent.  */
+	ret
+
+L (invalid):
+	LI		a0, -EINVAL
+
+	/* Something bad happened -- no child created.  */
+L (error):
+	b		__syscall_error
+
+END (__clone3)
+
+/* Load up the arguments to the function.  Put this block of code in
+   its own function so that we can terminate the stack trace with our
+   debug info.  */
+ENTRY (__thread_start3)
+L (thread_start3):
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+
+	/* Align stack to 16 or 8 bytes per the ABI.  */
+	BSTRINS		sp, zero, 3, 0
+
+	/* Set up arguments for the function call.  */
+	move		a0, a3		/* Argument.  */
+	jirl		ra, a2, 0	/* Call function.  */
+
+	/* Call exit with the function's return value.  */
+	LI		a7, __NR_exit
+	syscall		0
+
+	END (__thread_start3)
+
+libc_hidden_def (__clone3)
+weak_alias (__clone3, clone3)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.S b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
new file mode 100644
index 0000000000..b5f5d9f351
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
@@ -0,0 +1,53 @@
+/* syscall error handlers
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#if IS_IN (libc)
+# define errno __libc_errno
+#endif
+
+ENTRY (__syscall_error)
+/* Fall through to __syscall_set_errno */
+END (__syscall_error)
+
+/* Non-standard calling convention: argument in a0, return address in t0,
+   and clobber only t1.
+ */
+ENTRY (__syscall_set_errno)
+
+/* We got here because a0 < 0, but only codes in the range [-4095, -1]
+   represent errors.	Otherwise, just return the result normally.
+ */
+	li.d		t1, -4096
+	bgeu		t1, a0, L (out)
+	sub.w		a0, zero, a0
+#if RTLD_PRIVATE_ERRNO
+	la		t1, rtld_errno
+#elif defined(__PIC__)
+	la.tls.ie	t1, errno
+	add.d		t1, tp, t1
+#else
+	la.tls.le	t1, errno
+	add.d		t1, tp, t1
+#endif
+	st.w		a0, t1, 0
+	li.d		a0, -1
+L (out):
+	ret
+END (__syscall_set_errno)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
new file mode 100644
index 0000000000..a90d2b65ed
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
@@ -0,0 +1,321 @@
+/* Assembly macros for LoongArch.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LINUX_LOONGARCH_SYSDEP_H
+#define _LINUX_LOONGARCH_SYSDEP_H 1
+
+#include <sysdeps/unix/sysv/linux/generic/sysdep.h>
+#include <tls.h>
+
+#ifdef __ASSEMBLER__
+
+#include <sys/asm.h>
+#define ret jirl zero, ra, 0
+#define L(label) .L##label
+
+/* Performs a system call, handling errors by setting errno.  Linux indicates
+   errors by setting a0 to a value between -1 and -4095.  */
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+  ENTRY (name); \
+  li.d a7, SYS_ify (syscall_name); \
+  syscall 0; \
+  li.d a7, -4096; \
+  bltu a7, a0, .Lsyscall_error##name;
+
+#undef PSEUDO_END
+#define PSEUDO_END(sym) \
+  SYSCALL_ERROR_HANDLER (sym); \
+  ret; \
+  END (sym);
+
+#if !IS_IN(libc)
+#if RTLD_PRIVATE_ERRNO
+
+#define SYSCALL_ERROR_HANDLER(name) \
+  .Lsyscall_error##name : la t0, rtld_errno; \
+  sub.w a0, zero, a0; \
+  st.w a0, t0, 0; \
+  li.d a0, -1;
+
+#else
+
+#define SYSCALL_ERROR_HANDLER(name) \
+  .Lsyscall_error##name : la.tls.ie t0, errno; \
+  add.d t0, tp, t0; \
+  sub.w a0, zero, a0; \
+  st.w a0, t0, 0; \
+  li.d a0, -1;
+
+#endif
+#else
+
+#define SYSCALL_ERROR_HANDLER(name) .Lsyscall_error##name : b __syscall_error;
+
+#endif
+
+/* Performs a system call, not setting errno.  */
+#undef PSEUDO_NEORRNO
+#define PSEUDO_NOERRNO(name, syscall_name, args) \
+  ENTRY (name); \
+  li.d a7, SYS_ify (syscall_name); \
+  syscall 0;
+
+#undef PSEUDO_END_NOERRNO
+#define PSEUDO_END_NOERRNO(name) END (name);
+
+#undef ret_NOERRNO
+#define ret_NOERRNO ret
+
+/* Perfroms a system call, returning the error code.  */
+#undef PSEUDO_ERRVAL
+#define PSEUDO_ERRVAL(name, syscall_name, args) \
+  PSEUDO_NOERRNO (name, syscall_name, args); \
+  slli.d a0, a0, 32; \
+  srai.d a0, a0, 32; /* sign_ext */ \
+  sub.d a0, zero, a0;
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name) END (name);
+
+#undef ret_ERRVAL
+#define ret_ERRVAL ret
+
+#endif /* __ASSEMBLER__ */
+
+/* In order to get __set_errno() definition in INLINE_SYSCALL.  */
+#ifndef __ASSEMBLER__
+#include <errno.h>
+#endif
+
+#include <sysdeps/unix/sysdep.h>
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifndef __ASSEMBLER__
+
+#define VDSO_NAME "LINUX_2.6"
+#define VDSO_HASH 61765110
+
+/* List of system calls which are supported as vsyscalls.  */
+#define HAVE_CLOCK_GETRES64_VSYSCALL "__vdso_clock_getres"
+#define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime"
+#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
+#define HAVE_GETCPU_VSYSCALL "__vdso_getcpu"
+
+#define HAVE_CLONE3_WRAPPER 1
+
+#define INTERNAL_SYSCALL(name, nr, args...) \
+  internal_syscall##nr (SYS_ify (name), args)
+
+#define INTERNAL_SYSCALL_NCS(number, nr, args...) \
+  internal_syscall##nr (number, args)
+
+#define internal_syscall0(number, dummy...) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0"); \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "=r"(__a0) \
+		       : "r"(__a7) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall1(number, arg0) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall2(number, arg0, arg1) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall3(number, arg0, arg1, arg2) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall4(number, arg0, arg1, arg2, arg3) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall5(number, arg0, arg1, arg2, arg3, arg4) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), \
+			 "r"(__a3), "r"(__a4) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall6(number, arg0, arg1, arg2, arg3, arg4, arg5) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      long int _arg5 = (long int) (arg5); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      register long int __a5 asm("$a5") = _arg5; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \
+			 "r"(__a4), "r"(__a5) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall7(number, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      long int _arg5 = (long int) (arg5); \
+      long int _arg6 = (long int) (arg6); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      register long int __a5 asm("$a5") = _arg5; \
+      register long int __a6 asm("$a6") = _arg6; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \
+			 "r"(__a4), "r"(__a5), "r"(__a6) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define __SYSCALL_CLOBBERS \
+  "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
+
+extern long int __syscall_error (long int neg_errno);
+
+#endif /* ! __ASSEMBLER__ */
+
+/* Pointer mangling is not supported.  */
+#define PTR_MANGLE(var) (void) (var)
+#define PTR_DEMANGLE(var) (void) (var)
+
+#endif /* linux/loongarch/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/vfork.S b/sysdeps/unix/sysv/linux/loongarch/vfork.S
new file mode 100644
index 0000000000..fcc84e3549
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/vfork.S
@@ -0,0 +1,50 @@
+/* vfork for Linux.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+   The calling process is suspended until the new process exits or is
+   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
+   and the process ID of the new process to the old process.  */
+
+ENTRY (__vfork)
+
+	li.d	a0, 0x4111 /* CLONE_VM | CLONE_VFORK | SIGCHLD */
+	add.d   a1, zero, sp
+
+	/* Do the system call.  */
+	li.d	a7, __NR_clone
+	syscall	0
+
+	blt	a0, zero ,L (error)
+
+	ret
+
+L (error):
+	b	__syscall_error
+
+END (__vfork)
+
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
+strong_alias (__vfork, __libc_vfork)
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 09/13] LoongArch: Linux ABI
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (7 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 08/13] LoongArch: Linux Syscall Interface caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  2022-05-09  2:30 ` [PATCH v4 10/13] LoongArch: Add ABI Lists caiyinyu
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 sysdeps/loongarch/dl-irel.h                   |  48 +++++++++
 sysdeps/loongarch/nptl/pthreaddef.h           |  32 ++++++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |  61 +++++++++++
 .../unix/sysv/linux/loongarch/bits/procfs.h   |  52 +++++++++
 .../linux/loongarch/bits/pthread_stack_min.h  |  20 ++++
 .../unix/sysv/linux/loongarch/bits/sigstack.h |  32 ++++++
 .../unix/sysv/linux/loongarch/getcontext.S    |  59 +++++++++++
 .../unix/sysv/linux/loongarch/localplt.data   |  12 +++
 .../unix/sysv/linux/loongarch/makecontext.c   |  79 ++++++++++++++
 .../unix/sysv/linux/loongarch/setcontext.S    | 100 ++++++++++++++++++
 .../sysv/linux/loongarch/sigcontextinfo.h     |  32 ++++++
 .../unix/sysv/linux/loongarch/swapcontext.S   |  95 +++++++++++++++++
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |  61 +++++++++++
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |  42 ++++++++
 .../sysv/linux/loongarch/ucontext-macros.h    |  32 ++++++
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |  31 ++++++
 16 files changed, 788 insertions(+)
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym

diff --git a/sysdeps/loongarch/dl-irel.h b/sysdeps/loongarch/dl-irel.h
new file mode 100644
index 0000000000..c94cba702a
--- /dev/null
+++ b/sysdeps/loongarch/dl-irel.h
@@ -0,0 +1,48 @@
+/* Machine-dependent ELF indirect relocation inline functions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _DL_IREL_H
+#define _DL_IREL_H
+
+#include <stdio.h>
+#include <unistd.h>
+
+#define ELF_MACHINE_IRELA 1
+
+static inline ElfW (Addr) __attribute ((always_inline))
+elf_ifunc_invoke (ElfW (Addr) addr)
+{
+  return ((ElfW (Addr) (*) (void)) (addr)) ();
+}
+
+static inline void __attribute ((always_inline))
+elf_irela (const ElfW (Rela) * reloc)
+{
+  ElfW (Addr) *const reloc_addr = (void *) reloc->r_offset;
+  const unsigned long int r_type = ELFW (R_TYPE) (reloc->r_info);
+
+  if (__glibc_likely (r_type == R_LARCH_IRELATIVE))
+    {
+      ElfW (Addr) value = elf_ifunc_invoke (reloc->r_addend);
+      *reloc_addr = value;
+    }
+  else
+    __libc_fatal ("Unexpected reloc type in static binary.\n");
+}
+
+#endif /* dl-irel.h */
diff --git a/sysdeps/loongarch/nptl/pthreaddef.h b/sysdeps/loongarch/nptl/pthreaddef.h
new file mode 100644
index 0000000000..955566cddc
--- /dev/null
+++ b/sysdeps/loongarch/nptl/pthreaddef.h
@@ -0,0 +1,32 @@
+/* pthread machine parameter definitions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
+
+/* Minimum guard size.  */
+#define ARCH_MIN_GUARD_SIZE 0
+
+/* Required stack pointer alignment at beginning.  */
+#define STACK_ALIGN 16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK 2048
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME __builtin_frame_address (0)
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
new file mode 100644
index 0000000000..bf1e254234
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
@@ -0,0 +1,61 @@
+/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FCNTL_H
+#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+#include <bits/wordsize.h>
+
+/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as
+   non-64-bit versions.  It will need to be revised for 128-bit.  */
+#if __WORDSIZE == 64
+#define __O_LARGEFILE 0
+
+#define F_GETLK64 5  /* Get record locking info.  */
+#define F_SETLK64 6  /* Set record locking info (non-blocking).  */
+#define F_SETLKW64 7 /* Set record locking info (blocking).  */
+#endif
+
+struct flock
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+#ifndef __USE_FILE_OFFSET64
+  __off_t l_start; /* Offset where the lock begins.  */
+  __off_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#else
+  __off64_t l_start; /* Offset where the lock begins.  */
+  __off64_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#endif
+  __pid_t l_pid; /* Process holding the lock.  */
+};
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+  __off64_t l_start;  /* Offset where the lock begins.  */
+  __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */
+  __pid_t l_pid;      /* Process holding the lock.  */
+};
+#endif
+
+/* Include generic Linux declarations.  */
+#include <bits/fcntl-linux.h>
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
new file mode 100644
index 0000000000..2db777b38c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
@@ -0,0 +1,52 @@
+/* Types for registers for sys/procfs.h.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_PROCFS_H
+# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
+#endif
+
+/* Type for a general-purpose register.  */
+typedef __uint64_t elf_greg_t;
+
+/* And the whole bunch of them.  We could have used `struct
+   pt_regs' directly in the typedef, but tradition says that
+   the register set is an array, which does have some peculiar
+   semantics, so leave it that way.  */
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */
+typedef union
+{
+  double d;
+  float f;
+} elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+typedef union
+{
+  double d[2];
+  float f[4];
+} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32];
+
+typedef union
+{
+  double d[4];
+  float f[8];
+} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32];
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..072c2ade42
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@
+/* Definition of PTHREAD_STACK_MIN.  LoongArch Linux version.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Minimum size for a thread.  At least two pages with 64k pages.  */
+#define PTHREAD_STACK_MIN	131072
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
new file mode 100644
index 0000000000..238c1a98e6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
@@ -0,0 +1,32 @@
+/* sigstack, sigaltstack definitions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_SIGSTACK_H
+#define _BITS_SIGSTACK_H 1
+
+#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
+# error "Never include this file directly.  Use <signal.h> instead"
+#endif
+
+/* Minimum stack size for a signal handler.  */
+#define MINSIGSTKSZ	4096
+
+/* System default stack size.  */
+#define SIGSTKSZ	16384
+
+#endif /* bits/sigstack.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/getcontext.S b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
new file mode 100644
index 0000000000..43b95e9715
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
@@ -0,0 +1,59 @@
+/* Save current context.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include "ucontext-macros.h"
+
+/* int getcontext (ucontext_t *ucp) */
+
+	.text
+LEAF (__getcontext)
+	SAVE_INT_REG (ra,   1, a0)
+	SAVE_INT_REG (sp,   3, a0)
+	SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0.  */
+	SAVE_INT_REG (x,   21, a0)
+	SAVE_INT_REG (fp,  22, a0)
+	SAVE_INT_REG (s0,  23, a0)
+	SAVE_INT_REG (s1,  24, a0)
+	SAVE_INT_REG (s2,  25, a0)
+	SAVE_INT_REG (s3,  26, a0)
+	SAVE_INT_REG (s4,  27, a0)
+	SAVE_INT_REG (s5,  28, a0)
+	SAVE_INT_REG (s6,  29, a0)
+	SAVE_INT_REG (s7,  30, a0)
+	SAVE_INT_REG (s8,  31, a0)
+	st.d		ra, a0, MCONTEXT_PC
+
+/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, UCONTEXT_SIGMASK
+	add.d		a2, a2, a0
+	ori		a1, zero,0
+	li.d		a0, SIG_BLOCK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+	blt		a0, zero, 99f
+
+	jirl		$r0, $r1, 0
+
+99:
+	b		__syscall_error
+
+PSEUDO_END (__getcontext)
+
+weak_alias (__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data
new file mode 100644
index 0000000000..817ab2659a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/localplt.data
@@ -0,0 +1,12 @@
+# See scripts/check-localplt.awk for how this file is processed.
+# PLT use is required for the malloc family and for matherr because
+# users can define their own functions and have library internals call them.
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: realloc
+# The TLS-enabled version of these functions is interposed from libc.so.
+ld.so: _dl_signal_error
+ld.so: _dl_catch_error
+ld.so: _dl_signal_exception
+ld.so: _dl_catch_exception
diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
new file mode 100644
index 0000000000..d29c8056cb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
@@ -0,0 +1,79 @@
+/* Create new context.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+#include <sys/ucontext.h>
+#include <stdarg.h>
+#include <assert.h>
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, long int a0,
+	       long int a1, long int a2, long int a3, long int a4, ...)
+{
+  extern void __start_context (void) attribute_hidden;
+  long int i, sp;
+
+  _Static_assert(LARCH_REG_NARGS == 8,
+		 "__makecontext assumes 8 argument registers");
+
+  /* Set up the stack.  */
+  sp = ((long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ALMASK;
+
+  /* Set up the register context.
+     ra = s0 = 0, terminating the stack for backtracing purposes.
+     s1 = the function we must call.
+     s2 = the subsequent context to run.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_RA] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S0] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S1] = (long int) func;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S2] = (long int) ucp->uc_link;
+  ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+  ucp->uc_mcontext.__pc = (long int) &__start_context;
+
+  /* Put args in a0-a7, then put any remaining args on the stack.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 0] = a0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 1] = a1;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 2] = a2;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 3] = a3;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 4] = a4;
+
+  if (__glibc_unlikely (argc > 5))
+    {
+      va_list vl;
+      va_start (vl, a4);
+
+      long reg_args = argc < LARCH_REG_NARGS ? argc : LARCH_REG_NARGS;
+      for (i = 5; i < reg_args; i++)
+	ucp->uc_mcontext.__gregs[LARCH_REG_A0 + i] = va_arg (vl, long);
+
+      long int stack_args = argc - reg_args;
+      if (stack_args > 0)
+	{
+	  sp = (sp - stack_args * sizeof (long int)) & ALMASK;
+	  ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+	  for (i = 0; i < stack_args; i++)
+	    ((long int *) sp)[i] = va_arg (vl, long int);
+	}
+
+      va_end (vl);
+    }
+}
+
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/setcontext.S b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
new file mode 100644
index 0000000000..a1216dad69
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
@@ -0,0 +1,100 @@
+/* Set current context.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+#include "sys/regdef.h"
+#include "ucontext-macros.h"
+
+/*  int __setcontext (const ucontext_t *ucp)
+
+  Restores the machine context in UCP and thereby resumes execution
+  in that context.
+
+  This implementation is intended to be used for *synchronous* context
+  switches only.  Therefore, it does not have to restore anything
+  other than the PRESERVED state.  */
+
+	.text
+LEAF (__setcontext)
+
+	addi.d		sp, sp, -16
+	st.d		a0, sp, 0	/* Save ucp to stack */
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, 0
+	li.d		a1, UCONTEXT_SIGMASK
+	add.d		a1, a1, a0
+	li.d		a0, SIG_SETMASK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+
+	blt		a0, $r0, 99f
+
+	ld.d		t0, sp, 0	/* Load ucp to t0 */
+	cfi_def_cfa (12, 0)
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+	RESTORE_INT_REG(ra,   1, t0)
+	RESTORE_INT_REG(sp,   3, t0)
+	RESTORE_INT_REG(a0,   4, t0)
+	RESTORE_INT_REG(a1,   5, t0)
+	RESTORE_INT_REG(a2,   6, t0)
+	RESTORE_INT_REG(a3,   7, t0)
+	RESTORE_INT_REG(a4,   8, t0)
+	RESTORE_INT_REG(a5,   9, t0)
+	RESTORE_INT_REG(a6,  10, t0)
+	RESTORE_INT_REG(a7,  11, t0)
+	RESTORE_INT_REG(x,   21, t0)
+	RESTORE_INT_REG(fp,  22, t0)
+	RESTORE_INT_REG(s0,  23, t0)
+	RESTORE_INT_REG(s1,  24, t0)
+	RESTORE_INT_REG(s2,  25, t0)
+	RESTORE_INT_REG(s3,  26, t0)
+	RESTORE_INT_REG(s4,  27, t0)
+	RESTORE_INT_REG(s5,  28, t0)
+	RESTORE_INT_REG(s6,  29, t0)
+	RESTORE_INT_REG(s7,  30, t0)
+	RESTORE_INT_REG(s8,  31, t0)
+
+	ld.d		t1, t0, MCONTEXT_PC
+	jirl		$r0,t1,0
+
+99:
+	addi.d		sp, sp, 16
+	b		__syscall_error
+
+PSEUDO_END (__setcontext)
+weak_alias (__setcontext, setcontext)
+
+LEAF (__start_context)
+
+	/* Terminate call stack by noting ra == 0.  Happily, s0 == 0 here.  */
+	cfi_register (1, 23)
+
+	/* Call the function passed to makecontext.  */
+	jirl		$r1,s1,0
+
+	/* Invoke subsequent context if present, else exit(0).  */
+	ori		a0, s2, 0
+	beqz		s2, 1f
+	bl		__setcontext
+1:
+	b		exit
+
+PSEUDO_END (__start_context)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
new file mode 100644
index 0000000000..5e202bc0b4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
@@ -0,0 +1,32 @@
+/* LoongArch definitions for signal handling calling conventions.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SIGCONTEXTINFO_H
+#define _SIGCONTEXTINFO_H
+
+#include <stdint.h>
+#include <sys/ucontext.h>
+
+static inline uintptr_t
+sigcontext_get_pc (const ucontext_t *ctx)
+{
+  return ctx->uc_mcontext.__pc;
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/loongarch/swapcontext.S b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
new file mode 100644
index 0000000000..bb22cd2f00
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
@@ -0,0 +1,95 @@
+/* Save and set current context.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include "ucontext-macros.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */
+
+LEAF (__swapcontext)
+	ori		a2, sp, 0		/* Save sp to a2 */
+	addi.d		sp, sp, -16
+	st.d		a1, sp, 0
+	ori		t0, a1, 0
+
+	SAVE_INT_REG (ra,   1, a0)
+	SAVE_INT_REG (a2,   3, a0)		/* Store sp */
+	SAVE_INT_REG (zero, 4, a0)		/* return 0 by overwriting a0 */
+	SAVE_INT_REG (x,   21, a0)
+	SAVE_INT_REG (fp,  22, a0)
+	SAVE_INT_REG (s0,  23, a0)
+	SAVE_INT_REG (s1,  24, a0)
+	SAVE_INT_REG (s2,  25, a0)
+	SAVE_INT_REG (s3,  26, a0)
+	SAVE_INT_REG (s4,  27, a0)
+	SAVE_INT_REG (s5,  28, a0)
+	SAVE_INT_REG (s6,  29, a0)
+	SAVE_INT_REG (s7,  30, a0)
+	SAVE_INT_REG (s8,  31, a0)
+
+	st.d		ra, a0, MCONTEXT_PC
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, UCONTEXT_SIGMASK
+	add.d		a2, a2, a0
+	li.d		a1, UCONTEXT_SIGMASK
+	add.d		a1, a1, t0
+	li.d		a0, SIG_SETMASK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+
+	blt		a0, zero, 99f
+
+	ld.d		t0, sp, 0		/* Load a1 to t0 */
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+	RESTORE_INT_REG (ra,   1, t0)
+	RESTORE_INT_REG (sp,   3, t0)
+	RESTORE_INT_REG (a0,   4, t0)
+	RESTORE_INT_REG (a1,   5, t0)
+	RESTORE_INT_REG (a2,   6, t0)
+	RESTORE_INT_REG (a3,   7, t0)
+	RESTORE_INT_REG (a4,   8, t0)
+	RESTORE_INT_REG (a5,   9, t0)
+	RESTORE_INT_REG (a6,  10, t0)
+	RESTORE_INT_REG (a7,  11, t0)
+	RESTORE_INT_REG (x,   21, t0)
+	RESTORE_INT_REG (fp,  22, t0)
+	RESTORE_INT_REG (s0,  23, t0)
+	RESTORE_INT_REG (s1,  24, t0)
+	RESTORE_INT_REG (s2,  25, t0)
+	RESTORE_INT_REG (s3,  26, t0)
+	RESTORE_INT_REG (s4,  27, t0)
+	RESTORE_INT_REG (s5,  28, t0)
+	RESTORE_INT_REG (s6,  29, t0)
+	RESTORE_INT_REG (s7,  30, t0)
+	RESTORE_INT_REG (s8,  31, t0)
+
+	ld.d		t1, t0, MCONTEXT_PC
+	jirl		$r0, t1, 0
+
+
+99:
+	addi.d		sp, sp, 16
+	b		__syscall_error
+
+PSEUDO_END (__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
new file mode 100644
index 0000000000..e334a45a44
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
@@ -0,0 +1,61 @@
+/* struct ucontext definition.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Don't rely on this, the interface is currently messed up and may need to
+   be broken to be fixed.  */
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+#ifdef __USE_MISC
+#define LARCH_NGREG 32
+
+#define LARCH_REG_RA 1
+#define LARCH_REG_SP 3
+#define LARCH_REG_S0 23
+#define LARCH_REG_S1 24
+#define LARCH_REG_A0 4
+#define LARCH_REG_S2 25
+#define LARCH_REG_NARGS 8
+
+#endif
+
+typedef struct mcontext_t
+{
+  unsigned long long __pc;
+  unsigned long long __gregs[32];
+  unsigned int __flags;
+  unsigned long long __extcontext[0] __attribute__((__aligned__(16)));
+} mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext_t
+{
+  unsigned long int __uc_flags;
+  struct ucontext_t *uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  mcontext_t uc_mcontext;
+} ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/user.h b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
new file mode 100644
index 0000000000..55181de816
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
@@ -0,0 +1,42 @@
+/* struct user_regs_struct definition for LoongArch.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_USER_H
+#define _SYS_USER_H 1
+
+#include <stdint.h>
+
+struct user_regs_struct
+{
+  /* Saved main processor registers. */
+  uint64_t regs[32];
+
+  /* Saved special registers. */
+  uint64_t orig_a0;
+  uint64_t csr_era;
+  uint64_t csr_badv;
+  uint64_t reserved[10];
+};
+
+struct user_fp_struct {
+  uint64_t    fpr[32];
+  uint64_t    fcc;
+  uint32_t    fcsr;
+};
+
+#endif /* _SYS_USER_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
new file mode 100644
index 0000000000..859eba464b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
@@ -0,0 +1,32 @@
+/* Macros for ucontext routines.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+#define _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+
+#include <sysdep.h>
+#include <sys/asm.h>
+#include "ucontext_i.h"
+
+#define SAVE_INT_REG(name, num, base) \
+  REG_S name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#define RESTORE_INT_REG(name, num, base) \
+  REG_L name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#endif /* _LINUX_LOONGARCH_UCONTEXT_MACROS_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
new file mode 100644
index 0000000000..f27afad56f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
@@ -0,0 +1,31 @@
+#include <inttypes.h>
+#include <signal.h>
+#include <stddef.h>
+#include <sys/ucontext.h>
+
+-- Constants used by the rt_sigprocmask call.
+
+SIG_BLOCK
+SIG_SETMASK
+
+_NSIG8				(_NSIG / 8)
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member)	offsetof (ucontext_t, member)
+#define stack(member)		ucontext (uc_stack.member)
+#define mcontext(member)	ucontext (uc_mcontext.member)
+
+UCONTEXT_FLAGS			ucontext (__uc_flags)
+UCONTEXT_LINK			ucontext (uc_link)
+UCONTEXT_STACK			ucontext (uc_stack)
+UCONTEXT_MCONTEXT		ucontext (uc_mcontext)
+UCONTEXT_SIGMASK		ucontext (uc_sigmask)
+
+STACK_SP			stack (ss_sp)
+STACK_SIZE			stack (ss_size)
+STACK_FLAGS			stack (ss_flags)
+
+MCONTEXT_PC			mcontext (__pc)
+MCONTEXT_GREGS			mcontext (__gregs)
+
+UCONTEXT_SIZE			sizeof (ucontext_t)
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 10/13] LoongArch: Add ABI Lists
  2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (8 preceding siblings ...)
  2022-05-09  2:30 ` [PATCH v4 09/13] LoongArch: Linux ABI caiyinyu
@ 2022-05-09  2:30 ` caiyinyu
  9 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 11 files changed, 3369 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist

diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
new file mode 100644
index 0000000000..ac925ccb36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:l
+blkcnt_t:l
+blksize_t:i
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:m
+fd_mask:l
+fsblkcnt64_t:m
+fsblkcnt_t:m
+fsfilcnt64_t:m
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:m
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:l
+int8_t:a
+intptr_t:l
+key_t:i
+loff_t:l
+mode_t:j
+nlink_t:j
+off64_t:l
+off_t:l
+pid_t:i
+pthread_attr_t:14pthread_attr_t
+pthread_barrier_t:17pthread_barrier_t
+pthread_barrierattr_t:21pthread_barrierattr_t
+pthread_cond_t:14pthread_cond_t
+pthread_condattr_t:18pthread_condattr_t
+pthread_key_t:j
+pthread_mutex_t:15pthread_mutex_t
+pthread_mutexattr_t:19pthread_mutexattr_t
+pthread_once_t:i
+pthread_rwlock_t:16pthread_rwlock_t
+pthread_rwlockattr_t:20pthread_rwlockattr_t
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:l
+register_t:l
+rlim64_t:m
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:m
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:m
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
new file mode 100644
index 0000000000..93fcd64eee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.36 __libc_stack_end D 0x8
+GLIBC_2.36 __rseq_flags D 0x4
+GLIBC_2.36 __rseq_offset D 0x8
+GLIBC_2.36 __rseq_size D 0x4
+GLIBC_2.36 __stack_chk_guard D 0x8
+GLIBC_2.36 __tls_get_addr F
+GLIBC_2.36 _dl_mcount F
+GLIBC_2.36 _r_debug D 0x28
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
new file mode 100644
index 0000000000..404afa3683
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
@@ -0,0 +1 @@
+GLIBC_2.36 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
new file mode 100644
index 0000000000..f94fd65022
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -0,0 +1,2139 @@
+GLIBC_2.36 _Exit F
+GLIBC_2.36 _Fork F
+GLIBC_2.36 _IO_2_1_stderr_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdin_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdout_ D 0xe0
+GLIBC_2.36 _IO_adjust_column F
+GLIBC_2.36 _IO_adjust_wcolumn F
+GLIBC_2.36 _IO_default_doallocate F
+GLIBC_2.36 _IO_default_finish F
+GLIBC_2.36 _IO_default_pbackfail F
+GLIBC_2.36 _IO_default_uflow F
+GLIBC_2.36 _IO_default_xsgetn F
+GLIBC_2.36 _IO_default_xsputn F
+GLIBC_2.36 _IO_do_write F
+GLIBC_2.36 _IO_doallocbuf F
+GLIBC_2.36 _IO_fclose F
+GLIBC_2.36 _IO_fdopen F
+GLIBC_2.36 _IO_feof F
+GLIBC_2.36 _IO_ferror F
+GLIBC_2.36 _IO_fflush F
+GLIBC_2.36 _IO_fgetpos F
+GLIBC_2.36 _IO_fgetpos64 F
+GLIBC_2.36 _IO_fgets F
+GLIBC_2.36 _IO_file_attach F
+GLIBC_2.36 _IO_file_close F
+GLIBC_2.36 _IO_file_close_it F
+GLIBC_2.36 _IO_file_doallocate F
+GLIBC_2.36 _IO_file_finish F
+GLIBC_2.36 _IO_file_fopen F
+GLIBC_2.36 _IO_file_init F
+GLIBC_2.36 _IO_file_jumps D 0xa8
+GLIBC_2.36 _IO_file_open F
+GLIBC_2.36 _IO_file_overflow F
+GLIBC_2.36 _IO_file_read F
+GLIBC_2.36 _IO_file_seek F
+GLIBC_2.36 _IO_file_seekoff F
+GLIBC_2.36 _IO_file_setbuf F
+GLIBC_2.36 _IO_file_stat F
+GLIBC_2.36 _IO_file_sync F
+GLIBC_2.36 _IO_file_underflow F
+GLIBC_2.36 _IO_file_write F
+GLIBC_2.36 _IO_file_xsputn F
+GLIBC_2.36 _IO_flockfile F
+GLIBC_2.36 _IO_flush_all F
+GLIBC_2.36 _IO_flush_all_linebuffered F
+GLIBC_2.36 _IO_fopen F
+GLIBC_2.36 _IO_fprintf F
+GLIBC_2.36 _IO_fputs F
+GLIBC_2.36 _IO_fread F
+GLIBC_2.36 _IO_free_backup_area F
+GLIBC_2.36 _IO_free_wbackup_area F
+GLIBC_2.36 _IO_fsetpos F
+GLIBC_2.36 _IO_fsetpos64 F
+GLIBC_2.36 _IO_ftell F
+GLIBC_2.36 _IO_ftrylockfile F
+GLIBC_2.36 _IO_funlockfile F
+GLIBC_2.36 _IO_fwrite F
+GLIBC_2.36 _IO_getc F
+GLIBC_2.36 _IO_getline F
+GLIBC_2.36 _IO_getline_info F
+GLIBC_2.36 _IO_gets F
+GLIBC_2.36 _IO_init F
+GLIBC_2.36 _IO_init_marker F
+GLIBC_2.36 _IO_init_wmarker F
+GLIBC_2.36 _IO_iter_begin F
+GLIBC_2.36 _IO_iter_end F
+GLIBC_2.36 _IO_iter_file F
+GLIBC_2.36 _IO_iter_next F
+GLIBC_2.36 _IO_least_wmarker F
+GLIBC_2.36 _IO_link_in F
+GLIBC_2.36 _IO_list_all D 0x8
+GLIBC_2.36 _IO_list_lock F
+GLIBC_2.36 _IO_list_resetlock F
+GLIBC_2.36 _IO_list_unlock F
+GLIBC_2.36 _IO_marker_delta F
+GLIBC_2.36 _IO_marker_difference F
+GLIBC_2.36 _IO_padn F
+GLIBC_2.36 _IO_peekc_locked F
+GLIBC_2.36 _IO_popen F
+GLIBC_2.36 _IO_printf F
+GLIBC_2.36 _IO_proc_close F
+GLIBC_2.36 _IO_proc_open F
+GLIBC_2.36 _IO_putc F
+GLIBC_2.36 _IO_puts F
+GLIBC_2.36 _IO_remove_marker F
+GLIBC_2.36 _IO_seekmark F
+GLIBC_2.36 _IO_seekoff F
+GLIBC_2.36 _IO_seekpos F
+GLIBC_2.36 _IO_seekwmark F
+GLIBC_2.36 _IO_setb F
+GLIBC_2.36 _IO_setbuffer F
+GLIBC_2.36 _IO_setvbuf F
+GLIBC_2.36 _IO_sgetn F
+GLIBC_2.36 _IO_sprintf F
+GLIBC_2.36 _IO_sputbackc F
+GLIBC_2.36 _IO_sputbackwc F
+GLIBC_2.36 _IO_sscanf F
+GLIBC_2.36 _IO_str_init_readonly F
+GLIBC_2.36 _IO_str_init_static F
+GLIBC_2.36 _IO_str_overflow F
+GLIBC_2.36 _IO_str_pbackfail F
+GLIBC_2.36 _IO_str_seekoff F
+GLIBC_2.36 _IO_str_underflow F
+GLIBC_2.36 _IO_sungetc F
+GLIBC_2.36 _IO_sungetwc F
+GLIBC_2.36 _IO_switch_to_get_mode F
+GLIBC_2.36 _IO_switch_to_main_wget_area F
+GLIBC_2.36 _IO_switch_to_wbackup_area F
+GLIBC_2.36 _IO_switch_to_wget_mode F
+GLIBC_2.36 _IO_un_link F
+GLIBC_2.36 _IO_ungetc F
+GLIBC_2.36 _IO_unsave_markers F
+GLIBC_2.36 _IO_unsave_wmarkers F
+GLIBC_2.36 _IO_vfprintf F
+GLIBC_2.36 _IO_vsprintf F
+GLIBC_2.36 _IO_wdefault_doallocate F
+GLIBC_2.36 _IO_wdefault_finish F
+GLIBC_2.36 _IO_wdefault_pbackfail F
+GLIBC_2.36 _IO_wdefault_uflow F
+GLIBC_2.36 _IO_wdefault_xsgetn F
+GLIBC_2.36 _IO_wdefault_xsputn F
+GLIBC_2.36 _IO_wdo_write F
+GLIBC_2.36 _IO_wdoallocbuf F
+GLIBC_2.36 _IO_wfile_jumps D 0xa8
+GLIBC_2.36 _IO_wfile_overflow F
+GLIBC_2.36 _IO_wfile_seekoff F
+GLIBC_2.36 _IO_wfile_sync F
+GLIBC_2.36 _IO_wfile_underflow F
+GLIBC_2.36 _IO_wfile_xsputn F
+GLIBC_2.36 _IO_wmarker_delta F
+GLIBC_2.36 _IO_wsetb F
+GLIBC_2.36 __adjtimex F
+GLIBC_2.36 __argz_count F
+GLIBC_2.36 __argz_next F
+GLIBC_2.36 __argz_stringify F
+GLIBC_2.36 __asprintf F
+GLIBC_2.36 __asprintf_chk F
+GLIBC_2.36 __assert F
+GLIBC_2.36 __assert_fail F
+GLIBC_2.36 __assert_perror_fail F
+GLIBC_2.36 __backtrace F
+GLIBC_2.36 __backtrace_symbols F
+GLIBC_2.36 __backtrace_symbols_fd F
+GLIBC_2.36 __bsd_getpgrp F
+GLIBC_2.36 __bzero F
+GLIBC_2.36 __check_rhosts_file D 0x4
+GLIBC_2.36 __chk_fail F
+GLIBC_2.36 __clone F
+GLIBC_2.36 __close F
+GLIBC_2.36 __cmsg_nxthdr F
+GLIBC_2.36 __confstr_chk F
+GLIBC_2.36 __connect F
+GLIBC_2.36 __ctype_b_loc F
+GLIBC_2.36 __ctype_get_mb_cur_max F
+GLIBC_2.36 __ctype_tolower_loc F
+GLIBC_2.36 __ctype_toupper_loc F
+GLIBC_2.36 __curbrk D 0x8
+GLIBC_2.36 __cxa_at_quick_exit F
+GLIBC_2.36 __cxa_atexit F
+GLIBC_2.36 __cxa_finalize F
+GLIBC_2.36 __cxa_thread_atexit_impl F
+GLIBC_2.36 __cyg_profile_func_enter F
+GLIBC_2.36 __cyg_profile_func_exit F
+GLIBC_2.36 __daylight D 0x4
+GLIBC_2.36 __dcgettext F
+GLIBC_2.36 __dgettext F
+GLIBC_2.36 __dprintf_chk F
+GLIBC_2.36 __dup2 F
+GLIBC_2.36 __duplocale F
+GLIBC_2.36 __endmntent F
+GLIBC_2.36 __environ D 0x8
+GLIBC_2.36 __errno_location F
+GLIBC_2.36 __explicit_bzero_chk F
+GLIBC_2.36 __fbufsize F
+GLIBC_2.36 __fcntl F
+GLIBC_2.36 __fdelt_chk F
+GLIBC_2.36 __fdelt_warn F
+GLIBC_2.36 __ffs F
+GLIBC_2.36 __fgets_chk F
+GLIBC_2.36 __fgets_unlocked_chk F
+GLIBC_2.36 __fgetws_chk F
+GLIBC_2.36 __fgetws_unlocked_chk F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __flbf F
+GLIBC_2.36 __fork F
+GLIBC_2.36 __fpending F
+GLIBC_2.36 __fprintf_chk F
+GLIBC_2.36 __fpu_control D 0x4
+GLIBC_2.36 __fpurge F
+GLIBC_2.36 __fread_chk F
+GLIBC_2.36 __fread_unlocked_chk F
+GLIBC_2.36 __freadable F
+GLIBC_2.36 __freading F
+GLIBC_2.36 __freelocale F
+GLIBC_2.36 __fsetlocking F
+GLIBC_2.36 __fwprintf_chk F
+GLIBC_2.36 __fwritable F
+GLIBC_2.36 __fwriting F
+GLIBC_2.36 __getauxval F
+GLIBC_2.36 __getcwd_chk F
+GLIBC_2.36 __getdelim F
+GLIBC_2.36 __getdomainname_chk F
+GLIBC_2.36 __getgroups_chk F
+GLIBC_2.36 __gethostname_chk F
+GLIBC_2.36 __getlogin_r_chk F
+GLIBC_2.36 __getmntent_r F
+GLIBC_2.36 __getpagesize F
+GLIBC_2.36 __getpgid F
+GLIBC_2.36 __getpid F
+GLIBC_2.36 __gets_chk F
+GLIBC_2.36 __gettimeofday F
+GLIBC_2.36 __getwd_chk F
+GLIBC_2.36 __gmtime_r F
+GLIBC_2.36 __h_errno_location F
+GLIBC_2.36 __isalnum_l F
+GLIBC_2.36 __isalpha_l F
+GLIBC_2.36 __isascii_l F
+GLIBC_2.36 __isblank_l F
+GLIBC_2.36 __iscntrl_l F
+GLIBC_2.36 __isctype F
+GLIBC_2.36 __isdigit_l F
+GLIBC_2.36 __isgraph_l F
+GLIBC_2.36 __isinf F
+GLIBC_2.36 __isinff F
+GLIBC_2.36 __isinfl F
+GLIBC_2.36 __islower_l F
+GLIBC_2.36 __isnan F
+GLIBC_2.36 __isnanf F
+GLIBC_2.36 __isnanl F
+GLIBC_2.36 __isoc99_fscanf F
+GLIBC_2.36 __isoc99_fwscanf F
+GLIBC_2.36 __isoc99_scanf F
+GLIBC_2.36 __isoc99_sscanf F
+GLIBC_2.36 __isoc99_swscanf F
+GLIBC_2.36 __isoc99_vfscanf F
+GLIBC_2.36 __isoc99_vfwscanf F
+GLIBC_2.36 __isoc99_vscanf F
+GLIBC_2.36 __isoc99_vsscanf F
+GLIBC_2.36 __isoc99_vswscanf F
+GLIBC_2.36 __isoc99_vwscanf F
+GLIBC_2.36 __isoc99_wscanf F
+GLIBC_2.36 __isprint_l F
+GLIBC_2.36 __ispunct_l F
+GLIBC_2.36 __isspace_l F
+GLIBC_2.36 __isupper_l F
+GLIBC_2.36 __iswalnum_l F
+GLIBC_2.36 __iswalpha_l F
+GLIBC_2.36 __iswblank_l F
+GLIBC_2.36 __iswcntrl_l F
+GLIBC_2.36 __iswctype F
+GLIBC_2.36 __iswctype_l F
+GLIBC_2.36 __iswdigit_l F
+GLIBC_2.36 __iswgraph_l F
+GLIBC_2.36 __iswlower_l F
+GLIBC_2.36 __iswprint_l F
+GLIBC_2.36 __iswpunct_l F
+GLIBC_2.36 __iswspace_l F
+GLIBC_2.36 __iswupper_l F
+GLIBC_2.36 __iswxdigit_l F
+GLIBC_2.36 __isxdigit_l F
+GLIBC_2.36 __ivaliduser F
+GLIBC_2.36 __libc_allocate_rtsig F
+GLIBC_2.36 __libc_calloc F
+GLIBC_2.36 __libc_current_sigrtmax F
+GLIBC_2.36 __libc_current_sigrtmin F
+GLIBC_2.36 __libc_free F
+GLIBC_2.36 __libc_freeres F
+GLIBC_2.36 __libc_init_first F
+GLIBC_2.36 __libc_mallinfo F
+GLIBC_2.36 __libc_malloc F
+GLIBC_2.36 __libc_mallopt F
+GLIBC_2.36 __libc_memalign F
+GLIBC_2.36 __libc_pvalloc F
+GLIBC_2.36 __libc_realloc F
+GLIBC_2.36 __libc_sa_len F
+GLIBC_2.36 __libc_single_threaded D 0x1
+GLIBC_2.36 __libc_start_main F
+GLIBC_2.36 __libc_valloc F
+GLIBC_2.36 __longjmp_chk F
+GLIBC_2.36 __lseek F
+GLIBC_2.36 __mbrlen F
+GLIBC_2.36 __mbrtowc F
+GLIBC_2.36 __mbsnrtowcs_chk F
+GLIBC_2.36 __mbsrtowcs_chk F
+GLIBC_2.36 __mbstowcs_chk F
+GLIBC_2.36 __memcmpeq F
+GLIBC_2.36 __memcpy_chk F
+GLIBC_2.36 __memmove_chk F
+GLIBC_2.36 __mempcpy F
+GLIBC_2.36 __mempcpy_chk F
+GLIBC_2.36 __memset_chk F
+GLIBC_2.36 __monstartup F
+GLIBC_2.36 __mq_open_2 F
+GLIBC_2.36 __nanosleep F
+GLIBC_2.36 __newlocale F
+GLIBC_2.36 __nl_langinfo_l F
+GLIBC_2.36 __nss_configure_lookup F
+GLIBC_2.36 __nss_hostname_digits_dots F
+GLIBC_2.36 __obstack_printf_chk F
+GLIBC_2.36 __obstack_vprintf_chk F
+GLIBC_2.36 __open F
+GLIBC_2.36 __open64 F
+GLIBC_2.36 __open64_2 F
+GLIBC_2.36 __open_2 F
+GLIBC_2.36 __openat64_2 F
+GLIBC_2.36 __openat_2 F
+GLIBC_2.36 __overflow F
+GLIBC_2.36 __pipe F
+GLIBC_2.36 __poll F
+GLIBC_2.36 __poll_chk F
+GLIBC_2.36 __posix_getopt F
+GLIBC_2.36 __ppoll_chk F
+GLIBC_2.36 __pread64 F
+GLIBC_2.36 __pread64_chk F
+GLIBC_2.36 __pread_chk F
+GLIBC_2.36 __printf_chk F
+GLIBC_2.36 __printf_fp F
+GLIBC_2.36 __profile_frequency F
+GLIBC_2.36 __progname D 0x8
+GLIBC_2.36 __progname_full D 0x8
+GLIBC_2.36 __pthread_cleanup_routine F
+GLIBC_2.36 __pthread_key_create F
+GLIBC_2.36 __pthread_register_cancel F
+GLIBC_2.36 __pthread_register_cancel_defer F
+GLIBC_2.36 __pthread_rwlock_unlock F
+GLIBC_2.36 __pthread_unregister_cancel F
+GLIBC_2.36 __pthread_unregister_cancel_restore F
+GLIBC_2.36 __pthread_unwind_next F
+GLIBC_2.36 __ptsname_r_chk F
+GLIBC_2.36 __pwrite64 F
+GLIBC_2.36 __rawmemchr F
+GLIBC_2.36 __rcmd_errstr D 0x8
+GLIBC_2.36 __read F
+GLIBC_2.36 __read_chk F
+GLIBC_2.36 __readlink_chk F
+GLIBC_2.36 __readlinkat_chk F
+GLIBC_2.36 __realpath_chk F
+GLIBC_2.36 __recv_chk F
+GLIBC_2.36 __recvfrom_chk F
+GLIBC_2.36 __register_atfork F
+GLIBC_2.36 __res_init F
+GLIBC_2.36 __res_nclose F
+GLIBC_2.36 __res_ninit F
+GLIBC_2.36 __res_randomid F
+GLIBC_2.36 __res_state F
+GLIBC_2.36 __sbrk F
+GLIBC_2.36 __sched_cpualloc F
+GLIBC_2.36 __sched_cpucount F
+GLIBC_2.36 __sched_cpufree F
+GLIBC_2.36 __sched_get_priority_max F
+GLIBC_2.36 __sched_get_priority_min F
+GLIBC_2.36 __sched_getparam F
+GLIBC_2.36 __sched_getscheduler F
+GLIBC_2.36 __sched_setscheduler F
+GLIBC_2.36 __sched_yield F
+GLIBC_2.36 __select F
+GLIBC_2.36 __send F
+GLIBC_2.36 __setmntent F
+GLIBC_2.36 __setpgid F
+GLIBC_2.36 __sigaction F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __sigpause F
+GLIBC_2.36 __sigsetjmp F
+GLIBC_2.36 __sigsuspend F
+GLIBC_2.36 __snprintf_chk F
+GLIBC_2.36 __sprintf_chk F
+GLIBC_2.36 __stack_chk_fail F
+GLIBC_2.36 __statfs F
+GLIBC_2.36 __stpcpy F
+GLIBC_2.36 __stpcpy_chk F
+GLIBC_2.36 __stpncpy F
+GLIBC_2.36 __stpncpy_chk F
+GLIBC_2.36 __strcasecmp F
+GLIBC_2.36 __strcasecmp_l F
+GLIBC_2.36 __strcasestr F
+GLIBC_2.36 __strcat_chk F
+GLIBC_2.36 __strcoll_l F
+GLIBC_2.36 __strcpy_chk F
+GLIBC_2.36 __strdup F
+GLIBC_2.36 __strerror_r F
+GLIBC_2.36 __strfmon_l F
+GLIBC_2.36 __strftime_l F
+GLIBC_2.36 __strncasecmp_l F
+GLIBC_2.36 __strncat_chk F
+GLIBC_2.36 __strncpy_chk F
+GLIBC_2.36 __strndup F
+GLIBC_2.36 __strsep_g F
+GLIBC_2.36 __strtod_internal F
+GLIBC_2.36 __strtod_l F
+GLIBC_2.36 __strtof_internal F
+GLIBC_2.36 __strtof_l F
+GLIBC_2.36 __strtok_r F
+GLIBC_2.36 __strtol_internal F
+GLIBC_2.36 __strtol_l F
+GLIBC_2.36 __strtold_internal F
+GLIBC_2.36 __strtold_l F
+GLIBC_2.36 __strtoll_internal F
+GLIBC_2.36 __strtoll_l F
+GLIBC_2.36 __strtoul_internal F
+GLIBC_2.36 __strtoul_l F
+GLIBC_2.36 __strtoull_internal F
+GLIBC_2.36 __strtoull_l F
+GLIBC_2.36 __strverscmp F
+GLIBC_2.36 __strxfrm_l F
+GLIBC_2.36 __swprintf_chk F
+GLIBC_2.36 __sysconf F
+GLIBC_2.36 __syslog_chk F
+GLIBC_2.36 __sysv_signal F
+GLIBC_2.36 __timezone D 0x8
+GLIBC_2.36 __toascii_l F
+GLIBC_2.36 __tolower_l F
+GLIBC_2.36 __toupper_l F
+GLIBC_2.36 __towctrans F
+GLIBC_2.36 __towctrans_l F
+GLIBC_2.36 __towlower_l F
+GLIBC_2.36 __towupper_l F
+GLIBC_2.36 __ttyname_r_chk F
+GLIBC_2.36 __tzname D 0x10
+GLIBC_2.36 __uflow F
+GLIBC_2.36 __underflow F
+GLIBC_2.36 __uselocale F
+GLIBC_2.36 __vasprintf_chk F
+GLIBC_2.36 __vdprintf_chk F
+GLIBC_2.36 __vfork F
+GLIBC_2.36 __vfprintf_chk F
+GLIBC_2.36 __vfscanf F
+GLIBC_2.36 __vfwprintf_chk F
+GLIBC_2.36 __vprintf_chk F
+GLIBC_2.36 __vsnprintf F
+GLIBC_2.36 __vsnprintf_chk F
+GLIBC_2.36 __vsprintf_chk F
+GLIBC_2.36 __vsscanf F
+GLIBC_2.36 __vswprintf_chk F
+GLIBC_2.36 __vsyslog_chk F
+GLIBC_2.36 __vwprintf_chk F
+GLIBC_2.36 __wait F
+GLIBC_2.36 __waitpid F
+GLIBC_2.36 __wcpcpy_chk F
+GLIBC_2.36 __wcpncpy_chk F
+GLIBC_2.36 __wcrtomb_chk F
+GLIBC_2.36 __wcscasecmp_l F
+GLIBC_2.36 __wcscat_chk F
+GLIBC_2.36 __wcscoll_l F
+GLIBC_2.36 __wcscpy_chk F
+GLIBC_2.36 __wcsftime_l F
+GLIBC_2.36 __wcsncasecmp_l F
+GLIBC_2.36 __wcsncat_chk F
+GLIBC_2.36 __wcsncpy_chk F
+GLIBC_2.36 __wcsnrtombs_chk F
+GLIBC_2.36 __wcsrtombs_chk F
+GLIBC_2.36 __wcstod_internal F
+GLIBC_2.36 __wcstod_l F
+GLIBC_2.36 __wcstof_internal F
+GLIBC_2.36 __wcstof_l F
+GLIBC_2.36 __wcstol_internal F
+GLIBC_2.36 __wcstol_l F
+GLIBC_2.36 __wcstold_internal F
+GLIBC_2.36 __wcstold_l F
+GLIBC_2.36 __wcstoll_internal F
+GLIBC_2.36 __wcstoll_l F
+GLIBC_2.36 __wcstombs_chk F
+GLIBC_2.36 __wcstoul_internal F
+GLIBC_2.36 __wcstoul_l F
+GLIBC_2.36 __wcstoull_internal F
+GLIBC_2.36 __wcstoull_l F
+GLIBC_2.36 __wcsxfrm_l F
+GLIBC_2.36 __wctomb_chk F
+GLIBC_2.36 __wctrans_l F
+GLIBC_2.36 __wctype_l F
+GLIBC_2.36 __wmemcpy_chk F
+GLIBC_2.36 __wmemmove_chk F
+GLIBC_2.36 __wmempcpy_chk F
+GLIBC_2.36 __wmemset_chk F
+GLIBC_2.36 __woverflow F
+GLIBC_2.36 __wprintf_chk F
+GLIBC_2.36 __write F
+GLIBC_2.36 __wuflow F
+GLIBC_2.36 __wunderflow F
+GLIBC_2.36 __xpg_basename F
+GLIBC_2.36 __xpg_sigpause F
+GLIBC_2.36 __xpg_strerror_r F
+GLIBC_2.36 _dl_find_object F
+GLIBC_2.36 _dl_mcount_wrapper F
+GLIBC_2.36 _dl_mcount_wrapper_check F
+GLIBC_2.36 _environ D 0x8
+GLIBC_2.36 _exit F
+GLIBC_2.36 _flushlbf F
+GLIBC_2.36 _libc_intl_domainname D 0x5
+GLIBC_2.36 _longjmp F
+GLIBC_2.36 _mcleanup F
+GLIBC_2.36 _mcount F
+GLIBC_2.36 _nl_default_dirname D 0x12
+GLIBC_2.36 _nl_domain_bindings D 0x8
+GLIBC_2.36 _nl_msg_cat_cntr D 0x4
+GLIBC_2.36 _obstack_allocated_p F
+GLIBC_2.36 _obstack_begin F
+GLIBC_2.36 _obstack_begin_1 F
+GLIBC_2.36 _obstack_free F
+GLIBC_2.36 _obstack_memory_used F
+GLIBC_2.36 _obstack_newchunk F
+GLIBC_2.36 _pthread_cleanup_pop F
+GLIBC_2.36 _pthread_cleanup_push F
+GLIBC_2.36 _res D 0x238
+GLIBC_2.36 _res_hconf D 0x48
+GLIBC_2.36 _setjmp F
+GLIBC_2.36 _tolower F
+GLIBC_2.36 _toupper F
+GLIBC_2.36 a64l F
+GLIBC_2.36 abort F
+GLIBC_2.36 abs F
+GLIBC_2.36 accept F
+GLIBC_2.36 accept4 F
+GLIBC_2.36 access F
+GLIBC_2.36 acct F
+GLIBC_2.36 addmntent F
+GLIBC_2.36 addseverity F
+GLIBC_2.36 adjtime F
+GLIBC_2.36 adjtimex F
+GLIBC_2.36 aio_cancel F
+GLIBC_2.36 aio_cancel64 F
+GLIBC_2.36 aio_error F
+GLIBC_2.36 aio_error64 F
+GLIBC_2.36 aio_fsync F
+GLIBC_2.36 aio_fsync64 F
+GLIBC_2.36 aio_init F
+GLIBC_2.36 aio_read F
+GLIBC_2.36 aio_read64 F
+GLIBC_2.36 aio_return F
+GLIBC_2.36 aio_return64 F
+GLIBC_2.36 aio_suspend F
+GLIBC_2.36 aio_suspend64 F
+GLIBC_2.36 aio_write F
+GLIBC_2.36 aio_write64 F
+GLIBC_2.36 alarm F
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 alphasort F
+GLIBC_2.36 alphasort64 F
+GLIBC_2.36 argp_err_exit_status D 0x4
+GLIBC_2.36 argp_error F
+GLIBC_2.36 argp_failure F
+GLIBC_2.36 argp_help F
+GLIBC_2.36 argp_parse F
+GLIBC_2.36 argp_program_bug_address D 0x8
+GLIBC_2.36 argp_program_version D 0x8
+GLIBC_2.36 argp_program_version_hook D 0x8
+GLIBC_2.36 argp_state_help F
+GLIBC_2.36 argp_usage F
+GLIBC_2.36 argz_add F
+GLIBC_2.36 argz_add_sep F
+GLIBC_2.36 argz_append F
+GLIBC_2.36 argz_count F
+GLIBC_2.36 argz_create F
+GLIBC_2.36 argz_create_sep F
+GLIBC_2.36 argz_delete F
+GLIBC_2.36 argz_extract F
+GLIBC_2.36 argz_insert F
+GLIBC_2.36 argz_next F
+GLIBC_2.36 argz_replace F
+GLIBC_2.36 argz_stringify F
+GLIBC_2.36 asctime F
+GLIBC_2.36 asctime_r F
+GLIBC_2.36 asprintf F
+GLIBC_2.36 atof F
+GLIBC_2.36 atoi F
+GLIBC_2.36 atol F
+GLIBC_2.36 atoll F
+GLIBC_2.36 backtrace F
+GLIBC_2.36 backtrace_symbols F
+GLIBC_2.36 backtrace_symbols_fd F
+GLIBC_2.36 basename F
+GLIBC_2.36 bcmp F
+GLIBC_2.36 bcopy F
+GLIBC_2.36 bind F
+GLIBC_2.36 bind_textdomain_codeset F
+GLIBC_2.36 bindresvport F
+GLIBC_2.36 bindtextdomain F
+GLIBC_2.36 brk F
+GLIBC_2.36 bsd_signal F
+GLIBC_2.36 bsearch F
+GLIBC_2.36 btowc F
+GLIBC_2.36 bzero F
+GLIBC_2.36 c16rtomb F
+GLIBC_2.36 c32rtomb F
+GLIBC_2.36 call_once F
+GLIBC_2.36 calloc F
+GLIBC_2.36 canonicalize_file_name F
+GLIBC_2.36 capget F
+GLIBC_2.36 capset F
+GLIBC_2.36 catclose F
+GLIBC_2.36 catgets F
+GLIBC_2.36 catopen F
+GLIBC_2.36 cfgetispeed F
+GLIBC_2.36 cfgetospeed F
+GLIBC_2.36 cfmakeraw F
+GLIBC_2.36 cfsetispeed F
+GLIBC_2.36 cfsetospeed F
+GLIBC_2.36 cfsetspeed F
+GLIBC_2.36 chdir F
+GLIBC_2.36 chflags F
+GLIBC_2.36 chmod F
+GLIBC_2.36 chown F
+GLIBC_2.36 chroot F
+GLIBC_2.36 clearenv F
+GLIBC_2.36 clearerr F
+GLIBC_2.36 clearerr_unlocked F
+GLIBC_2.36 clock F
+GLIBC_2.36 clock_adjtime F
+GLIBC_2.36 clock_getcpuclockid F
+GLIBC_2.36 clock_getres F
+GLIBC_2.36 clock_gettime F
+GLIBC_2.36 clock_nanosleep F
+GLIBC_2.36 clock_settime F
+GLIBC_2.36 clone F
+GLIBC_2.36 close F
+GLIBC_2.36 close_range F
+GLIBC_2.36 closedir F
+GLIBC_2.36 closefrom F
+GLIBC_2.36 closelog F
+GLIBC_2.36 cnd_broadcast F
+GLIBC_2.36 cnd_destroy F
+GLIBC_2.36 cnd_init F
+GLIBC_2.36 cnd_signal F
+GLIBC_2.36 cnd_timedwait F
+GLIBC_2.36 cnd_wait F
+GLIBC_2.36 confstr F
+GLIBC_2.36 connect F
+GLIBC_2.36 copy_file_range F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 creat F
+GLIBC_2.36 creat64 F
+GLIBC_2.36 ctermid F
+GLIBC_2.36 ctime F
+GLIBC_2.36 ctime_r F
+GLIBC_2.36 cuserid F
+GLIBC_2.36 daemon F
+GLIBC_2.36 daylight D 0x4
+GLIBC_2.36 dcgettext F
+GLIBC_2.36 dcngettext F
+GLIBC_2.36 delete_module F
+GLIBC_2.36 dgettext F
+GLIBC_2.36 difftime F
+GLIBC_2.36 dirfd F
+GLIBC_2.36 dirname F
+GLIBC_2.36 div F
+GLIBC_2.36 dl_iterate_phdr F
+GLIBC_2.36 dladdr F
+GLIBC_2.36 dladdr1 F
+GLIBC_2.36 dlclose F
+GLIBC_2.36 dlerror F
+GLIBC_2.36 dlinfo F
+GLIBC_2.36 dlmopen F
+GLIBC_2.36 dlopen F
+GLIBC_2.36 dlsym F
+GLIBC_2.36 dlvsym F
+GLIBC_2.36 dn_comp F
+GLIBC_2.36 dn_expand F
+GLIBC_2.36 dn_skipname F
+GLIBC_2.36 dngettext F
+GLIBC_2.36 dprintf F
+GLIBC_2.36 drand48 F
+GLIBC_2.36 drand48_r F
+GLIBC_2.36 dup F
+GLIBC_2.36 dup2 F
+GLIBC_2.36 dup3 F
+GLIBC_2.36 duplocale F
+GLIBC_2.36 dysize F
+GLIBC_2.36 eaccess F
+GLIBC_2.36 ecvt F
+GLIBC_2.36 ecvt_r F
+GLIBC_2.36 endaliasent F
+GLIBC_2.36 endfsent F
+GLIBC_2.36 endgrent F
+GLIBC_2.36 endhostent F
+GLIBC_2.36 endmntent F
+GLIBC_2.36 endnetent F
+GLIBC_2.36 endnetgrent F
+GLIBC_2.36 endprotoent F
+GLIBC_2.36 endpwent F
+GLIBC_2.36 endrpcent F
+GLIBC_2.36 endservent F
+GLIBC_2.36 endsgent F
+GLIBC_2.36 endspent F
+GLIBC_2.36 endttyent F
+GLIBC_2.36 endusershell F
+GLIBC_2.36 endutent F
+GLIBC_2.36 endutxent F
+GLIBC_2.36 environ D 0x8
+GLIBC_2.36 envz_add F
+GLIBC_2.36 envz_entry F
+GLIBC_2.36 envz_get F
+GLIBC_2.36 envz_merge F
+GLIBC_2.36 envz_remove F
+GLIBC_2.36 envz_strip F
+GLIBC_2.36 epoll_create F
+GLIBC_2.36 epoll_create1 F
+GLIBC_2.36 epoll_ctl F
+GLIBC_2.36 epoll_pwait F
+GLIBC_2.36 epoll_pwait2 F
+GLIBC_2.36 epoll_wait F
+GLIBC_2.36 erand48 F
+GLIBC_2.36 erand48_r F
+GLIBC_2.36 err F
+GLIBC_2.36 error F
+GLIBC_2.36 error_at_line F
+GLIBC_2.36 error_message_count D 0x4
+GLIBC_2.36 error_one_per_line D 0x4
+GLIBC_2.36 error_print_progname D 0x8
+GLIBC_2.36 errx F
+GLIBC_2.36 ether_aton F
+GLIBC_2.36 ether_aton_r F
+GLIBC_2.36 ether_hostton F
+GLIBC_2.36 ether_line F
+GLIBC_2.36 ether_ntoa F
+GLIBC_2.36 ether_ntoa_r F
+GLIBC_2.36 ether_ntohost F
+GLIBC_2.36 euidaccess F
+GLIBC_2.36 eventfd F
+GLIBC_2.36 eventfd_read F
+GLIBC_2.36 eventfd_write F
+GLIBC_2.36 execl F
+GLIBC_2.36 execle F
+GLIBC_2.36 execlp F
+GLIBC_2.36 execv F
+GLIBC_2.36 execve F
+GLIBC_2.36 execveat F
+GLIBC_2.36 execvp F
+GLIBC_2.36 execvpe F
+GLIBC_2.36 exit F
+GLIBC_2.36 explicit_bzero F
+GLIBC_2.36 faccessat F
+GLIBC_2.36 fallocate F
+GLIBC_2.36 fallocate64 F
+GLIBC_2.36 fanotify_init F
+GLIBC_2.36 fanotify_mark F
+GLIBC_2.36 fchdir F
+GLIBC_2.36 fchflags F
+GLIBC_2.36 fchmod F
+GLIBC_2.36 fchmodat F
+GLIBC_2.36 fchown F
+GLIBC_2.36 fchownat F
+GLIBC_2.36 fclose F
+GLIBC_2.36 fcloseall F
+GLIBC_2.36 fcntl F
+GLIBC_2.36 fcntl64 F
+GLIBC_2.36 fcvt F
+GLIBC_2.36 fcvt_r F
+GLIBC_2.36 fdatasync F
+GLIBC_2.36 fdopen F
+GLIBC_2.36 fdopendir F
+GLIBC_2.36 feof F
+GLIBC_2.36 feof_unlocked F
+GLIBC_2.36 ferror F
+GLIBC_2.36 ferror_unlocked F
+GLIBC_2.36 fexecve F
+GLIBC_2.36 fflush F
+GLIBC_2.36 fflush_unlocked F
+GLIBC_2.36 ffs F
+GLIBC_2.36 ffsl F
+GLIBC_2.36 ffsll F
+GLIBC_2.36 fgetc F
+GLIBC_2.36 fgetc_unlocked F
+GLIBC_2.36 fgetgrent F
+GLIBC_2.36 fgetgrent_r F
+GLIBC_2.36 fgetpos F
+GLIBC_2.36 fgetpos64 F
+GLIBC_2.36 fgetpwent F
+GLIBC_2.36 fgetpwent_r F
+GLIBC_2.36 fgets F
+GLIBC_2.36 fgets_unlocked F
+GLIBC_2.36 fgetsgent F
+GLIBC_2.36 fgetsgent_r F
+GLIBC_2.36 fgetspent F
+GLIBC_2.36 fgetspent_r F
+GLIBC_2.36 fgetwc F
+GLIBC_2.36 fgetwc_unlocked F
+GLIBC_2.36 fgetws F
+GLIBC_2.36 fgetws_unlocked F
+GLIBC_2.36 fgetxattr F
+GLIBC_2.36 fileno F
+GLIBC_2.36 fileno_unlocked F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 flistxattr F
+GLIBC_2.36 flock F
+GLIBC_2.36 flockfile F
+GLIBC_2.36 fmemopen F
+GLIBC_2.36 fmtmsg F
+GLIBC_2.36 fnmatch F
+GLIBC_2.36 fopen F
+GLIBC_2.36 fopen64 F
+GLIBC_2.36 fopencookie F
+GLIBC_2.36 fork F
+GLIBC_2.36 forkpty F
+GLIBC_2.36 fpathconf F
+GLIBC_2.36 fprintf F
+GLIBC_2.36 fputc F
+GLIBC_2.36 fputc_unlocked F
+GLIBC_2.36 fputs F
+GLIBC_2.36 fputs_unlocked F
+GLIBC_2.36 fputwc F
+GLIBC_2.36 fputwc_unlocked F
+GLIBC_2.36 fputws F
+GLIBC_2.36 fputws_unlocked F
+GLIBC_2.36 fread F
+GLIBC_2.36 fread_unlocked F
+GLIBC_2.36 free F
+GLIBC_2.36 freeaddrinfo F
+GLIBC_2.36 freeifaddrs F
+GLIBC_2.36 freelocale F
+GLIBC_2.36 fremovexattr F
+GLIBC_2.36 freopen F
+GLIBC_2.36 freopen64 F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fscanf F
+GLIBC_2.36 fseek F
+GLIBC_2.36 fseeko F
+GLIBC_2.36 fseeko64 F
+GLIBC_2.36 fsetpos F
+GLIBC_2.36 fsetpos64 F
+GLIBC_2.36 fsetxattr F
+GLIBC_2.36 fstat F
+GLIBC_2.36 fstat64 F
+GLIBC_2.36 fstatat F
+GLIBC_2.36 fstatat64 F
+GLIBC_2.36 fstatfs F
+GLIBC_2.36 fstatfs64 F
+GLIBC_2.36 fstatvfs F
+GLIBC_2.36 fstatvfs64 F
+GLIBC_2.36 fsync F
+GLIBC_2.36 ftell F
+GLIBC_2.36 ftello F
+GLIBC_2.36 ftello64 F
+GLIBC_2.36 ftime F
+GLIBC_2.36 ftok F
+GLIBC_2.36 ftruncate F
+GLIBC_2.36 ftruncate64 F
+GLIBC_2.36 ftrylockfile F
+GLIBC_2.36 fts64_children F
+GLIBC_2.36 fts64_close F
+GLIBC_2.36 fts64_open F
+GLIBC_2.36 fts64_read F
+GLIBC_2.36 fts64_set F
+GLIBC_2.36 fts_children F
+GLIBC_2.36 fts_close F
+GLIBC_2.36 fts_open F
+GLIBC_2.36 fts_read F
+GLIBC_2.36 fts_set F
+GLIBC_2.36 ftw F
+GLIBC_2.36 ftw64 F
+GLIBC_2.36 funlockfile F
+GLIBC_2.36 futimens F
+GLIBC_2.36 futimes F
+GLIBC_2.36 futimesat F
+GLIBC_2.36 fwide F
+GLIBC_2.36 fwprintf F
+GLIBC_2.36 fwrite F
+GLIBC_2.36 fwrite_unlocked F
+GLIBC_2.36 fwscanf F
+GLIBC_2.36 gai_cancel F
+GLIBC_2.36 gai_error F
+GLIBC_2.36 gai_strerror F
+GLIBC_2.36 gai_suspend F
+GLIBC_2.36 gcvt F
+GLIBC_2.36 get_avphys_pages F
+GLIBC_2.36 get_current_dir_name F
+GLIBC_2.36 get_nprocs F
+GLIBC_2.36 get_nprocs_conf F
+GLIBC_2.36 get_phys_pages F
+GLIBC_2.36 getaddrinfo F
+GLIBC_2.36 getaddrinfo_a F
+GLIBC_2.36 getaliasbyname F
+GLIBC_2.36 getaliasbyname_r F
+GLIBC_2.36 getaliasent F
+GLIBC_2.36 getaliasent_r F
+GLIBC_2.36 getauxval F
+GLIBC_2.36 getc F
+GLIBC_2.36 getc_unlocked F
+GLIBC_2.36 getchar F
+GLIBC_2.36 getchar_unlocked F
+GLIBC_2.36 getcontext F
+GLIBC_2.36 getcpu F
+GLIBC_2.36 getcwd F
+GLIBC_2.36 getdate F
+GLIBC_2.36 getdate_err D 0x4
+GLIBC_2.36 getdate_r F
+GLIBC_2.36 getdelim F
+GLIBC_2.36 getdents64 F
+GLIBC_2.36 getdirentries F
+GLIBC_2.36 getdirentries64 F
+GLIBC_2.36 getdomainname F
+GLIBC_2.36 getdtablesize F
+GLIBC_2.36 getegid F
+GLIBC_2.36 getentropy F
+GLIBC_2.36 getenv F
+GLIBC_2.36 geteuid F
+GLIBC_2.36 getfsent F
+GLIBC_2.36 getfsfile F
+GLIBC_2.36 getfsspec F
+GLIBC_2.36 getgid F
+GLIBC_2.36 getgrent F
+GLIBC_2.36 getgrent_r F
+GLIBC_2.36 getgrgid F
+GLIBC_2.36 getgrgid_r F
+GLIBC_2.36 getgrnam F
+GLIBC_2.36 getgrnam_r F
+GLIBC_2.36 getgrouplist F
+GLIBC_2.36 getgroups F
+GLIBC_2.36 gethostbyaddr F
+GLIBC_2.36 gethostbyaddr_r F
+GLIBC_2.36 gethostbyname F
+GLIBC_2.36 gethostbyname2 F
+GLIBC_2.36 gethostbyname2_r F
+GLIBC_2.36 gethostbyname_r F
+GLIBC_2.36 gethostent F
+GLIBC_2.36 gethostent_r F
+GLIBC_2.36 gethostid F
+GLIBC_2.36 gethostname F
+GLIBC_2.36 getifaddrs F
+GLIBC_2.36 getipv4sourcefilter F
+GLIBC_2.36 getitimer F
+GLIBC_2.36 getline F
+GLIBC_2.36 getloadavg F
+GLIBC_2.36 getlogin F
+GLIBC_2.36 getlogin_r F
+GLIBC_2.36 getmntent F
+GLIBC_2.36 getmntent_r F
+GLIBC_2.36 getnameinfo F
+GLIBC_2.36 getnetbyaddr F
+GLIBC_2.36 getnetbyaddr_r F
+GLIBC_2.36 getnetbyname F
+GLIBC_2.36 getnetbyname_r F
+GLIBC_2.36 getnetent F
+GLIBC_2.36 getnetent_r F
+GLIBC_2.36 getnetgrent F
+GLIBC_2.36 getnetgrent_r F
+GLIBC_2.36 getopt F
+GLIBC_2.36 getopt_long F
+GLIBC_2.36 getopt_long_only F
+GLIBC_2.36 getpagesize F
+GLIBC_2.36 getpass F
+GLIBC_2.36 getpeername F
+GLIBC_2.36 getpgid F
+GLIBC_2.36 getpgrp F
+GLIBC_2.36 getpid F
+GLIBC_2.36 getppid F
+GLIBC_2.36 getpriority F
+GLIBC_2.36 getprotobyname F
+GLIBC_2.36 getprotobyname_r F
+GLIBC_2.36 getprotobynumber F
+GLIBC_2.36 getprotobynumber_r F
+GLIBC_2.36 getprotoent F
+GLIBC_2.36 getprotoent_r F
+GLIBC_2.36 getpt F
+GLIBC_2.36 getpw F
+GLIBC_2.36 getpwent F
+GLIBC_2.36 getpwent_r F
+GLIBC_2.36 getpwnam F
+GLIBC_2.36 getpwnam_r F
+GLIBC_2.36 getpwuid F
+GLIBC_2.36 getpwuid_r F
+GLIBC_2.36 getrandom F
+GLIBC_2.36 getresgid F
+GLIBC_2.36 getresuid F
+GLIBC_2.36 getrlimit F
+GLIBC_2.36 getrlimit64 F
+GLIBC_2.36 getrpcbyname F
+GLIBC_2.36 getrpcbyname_r F
+GLIBC_2.36 getrpcbynumber F
+GLIBC_2.36 getrpcbynumber_r F
+GLIBC_2.36 getrpcent F
+GLIBC_2.36 getrpcent_r F
+GLIBC_2.36 getrusage F
+GLIBC_2.36 gets F
+GLIBC_2.36 getservbyname F
+GLIBC_2.36 getservbyname_r F
+GLIBC_2.36 getservbyport F
+GLIBC_2.36 getservbyport_r F
+GLIBC_2.36 getservent F
+GLIBC_2.36 getservent_r F
+GLIBC_2.36 getsgent F
+GLIBC_2.36 getsgent_r F
+GLIBC_2.36 getsgnam F
+GLIBC_2.36 getsgnam_r F
+GLIBC_2.36 getsid F
+GLIBC_2.36 getsockname F
+GLIBC_2.36 getsockopt F
+GLIBC_2.36 getsourcefilter F
+GLIBC_2.36 getspent F
+GLIBC_2.36 getspent_r F
+GLIBC_2.36 getspnam F
+GLIBC_2.36 getspnam_r F
+GLIBC_2.36 getsubopt F
+GLIBC_2.36 gettext F
+GLIBC_2.36 gettid F
+GLIBC_2.36 gettimeofday F
+GLIBC_2.36 getttyent F
+GLIBC_2.36 getttynam F
+GLIBC_2.36 getuid F
+GLIBC_2.36 getusershell F
+GLIBC_2.36 getutent F
+GLIBC_2.36 getutent_r F
+GLIBC_2.36 getutid F
+GLIBC_2.36 getutid_r F
+GLIBC_2.36 getutline F
+GLIBC_2.36 getutline_r F
+GLIBC_2.36 getutmp F
+GLIBC_2.36 getutmpx F
+GLIBC_2.36 getutxent F
+GLIBC_2.36 getutxid F
+GLIBC_2.36 getutxline F
+GLIBC_2.36 getw F
+GLIBC_2.36 getwc F
+GLIBC_2.36 getwc_unlocked F
+GLIBC_2.36 getwchar F
+GLIBC_2.36 getwchar_unlocked F
+GLIBC_2.36 getwd F
+GLIBC_2.36 getxattr F
+GLIBC_2.36 glob F
+GLIBC_2.36 glob64 F
+GLIBC_2.36 glob_pattern_p F
+GLIBC_2.36 globfree F
+GLIBC_2.36 globfree64 F
+GLIBC_2.36 gmtime F
+GLIBC_2.36 gmtime_r F
+GLIBC_2.36 gnu_dev_major F
+GLIBC_2.36 gnu_dev_makedev F
+GLIBC_2.36 gnu_dev_minor F
+GLIBC_2.36 gnu_get_libc_release F
+GLIBC_2.36 gnu_get_libc_version F
+GLIBC_2.36 grantpt F
+GLIBC_2.36 group_member F
+GLIBC_2.36 gsignal F
+GLIBC_2.36 gtty F
+GLIBC_2.36 h_errlist D 0x28
+GLIBC_2.36 h_nerr D 0x4
+GLIBC_2.36 hasmntopt F
+GLIBC_2.36 hcreate F
+GLIBC_2.36 hcreate_r F
+GLIBC_2.36 hdestroy F
+GLIBC_2.36 hdestroy_r F
+GLIBC_2.36 herror F
+GLIBC_2.36 hsearch F
+GLIBC_2.36 hsearch_r F
+GLIBC_2.36 hstrerror F
+GLIBC_2.36 htonl F
+GLIBC_2.36 htons F
+GLIBC_2.36 iconv F
+GLIBC_2.36 iconv_close F
+GLIBC_2.36 iconv_open F
+GLIBC_2.36 if_freenameindex F
+GLIBC_2.36 if_indextoname F
+GLIBC_2.36 if_nameindex F
+GLIBC_2.36 if_nametoindex F
+GLIBC_2.36 imaxabs F
+GLIBC_2.36 imaxdiv F
+GLIBC_2.36 in6addr_any D 0x10
+GLIBC_2.36 in6addr_loopback D 0x10
+GLIBC_2.36 index F
+GLIBC_2.36 inet6_opt_append F
+GLIBC_2.36 inet6_opt_find F
+GLIBC_2.36 inet6_opt_finish F
+GLIBC_2.36 inet6_opt_get_val F
+GLIBC_2.36 inet6_opt_init F
+GLIBC_2.36 inet6_opt_next F
+GLIBC_2.36 inet6_opt_set_val F
+GLIBC_2.36 inet6_option_alloc F
+GLIBC_2.36 inet6_option_append F
+GLIBC_2.36 inet6_option_find F
+GLIBC_2.36 inet6_option_init F
+GLIBC_2.36 inet6_option_next F
+GLIBC_2.36 inet6_option_space F
+GLIBC_2.36 inet6_rth_add F
+GLIBC_2.36 inet6_rth_getaddr F
+GLIBC_2.36 inet6_rth_init F
+GLIBC_2.36 inet6_rth_reverse F
+GLIBC_2.36 inet6_rth_segments F
+GLIBC_2.36 inet6_rth_space F
+GLIBC_2.36 inet_addr F
+GLIBC_2.36 inet_aton F
+GLIBC_2.36 inet_lnaof F
+GLIBC_2.36 inet_makeaddr F
+GLIBC_2.36 inet_netof F
+GLIBC_2.36 inet_network F
+GLIBC_2.36 inet_nsap_addr F
+GLIBC_2.36 inet_nsap_ntoa F
+GLIBC_2.36 inet_ntoa F
+GLIBC_2.36 inet_ntop F
+GLIBC_2.36 inet_pton F
+GLIBC_2.36 init_module F
+GLIBC_2.36 initgroups F
+GLIBC_2.36 initstate F
+GLIBC_2.36 initstate_r F
+GLIBC_2.36 innetgr F
+GLIBC_2.36 inotify_add_watch F
+GLIBC_2.36 inotify_init F
+GLIBC_2.36 inotify_init1 F
+GLIBC_2.36 inotify_rm_watch F
+GLIBC_2.36 insque F
+GLIBC_2.36 ioctl F
+GLIBC_2.36 iruserok F
+GLIBC_2.36 iruserok_af F
+GLIBC_2.36 isalnum F
+GLIBC_2.36 isalnum_l F
+GLIBC_2.36 isalpha F
+GLIBC_2.36 isalpha_l F
+GLIBC_2.36 isascii F
+GLIBC_2.36 isatty F
+GLIBC_2.36 isblank F
+GLIBC_2.36 isblank_l F
+GLIBC_2.36 iscntrl F
+GLIBC_2.36 iscntrl_l F
+GLIBC_2.36 isctype F
+GLIBC_2.36 isdigit F
+GLIBC_2.36 isdigit_l F
+GLIBC_2.36 isfdtype F
+GLIBC_2.36 isgraph F
+GLIBC_2.36 isgraph_l F
+GLIBC_2.36 isinf F
+GLIBC_2.36 isinff F
+GLIBC_2.36 isinfl F
+GLIBC_2.36 islower F
+GLIBC_2.36 islower_l F
+GLIBC_2.36 isnan F
+GLIBC_2.36 isnanf F
+GLIBC_2.36 isnanl F
+GLIBC_2.36 isprint F
+GLIBC_2.36 isprint_l F
+GLIBC_2.36 ispunct F
+GLIBC_2.36 ispunct_l F
+GLIBC_2.36 isspace F
+GLIBC_2.36 isspace_l F
+GLIBC_2.36 isupper F
+GLIBC_2.36 isupper_l F
+GLIBC_2.36 iswalnum F
+GLIBC_2.36 iswalnum_l F
+GLIBC_2.36 iswalpha F
+GLIBC_2.36 iswalpha_l F
+GLIBC_2.36 iswblank F
+GLIBC_2.36 iswblank_l F
+GLIBC_2.36 iswcntrl F
+GLIBC_2.36 iswcntrl_l F
+GLIBC_2.36 iswctype F
+GLIBC_2.36 iswctype_l F
+GLIBC_2.36 iswdigit F
+GLIBC_2.36 iswdigit_l F
+GLIBC_2.36 iswgraph F
+GLIBC_2.36 iswgraph_l F
+GLIBC_2.36 iswlower F
+GLIBC_2.36 iswlower_l F
+GLIBC_2.36 iswprint F
+GLIBC_2.36 iswprint_l F
+GLIBC_2.36 iswpunct F
+GLIBC_2.36 iswpunct_l F
+GLIBC_2.36 iswspace F
+GLIBC_2.36 iswspace_l F
+GLIBC_2.36 iswupper F
+GLIBC_2.36 iswupper_l F
+GLIBC_2.36 iswxdigit F
+GLIBC_2.36 iswxdigit_l F
+GLIBC_2.36 isxdigit F
+GLIBC_2.36 isxdigit_l F
+GLIBC_2.36 jrand48 F
+GLIBC_2.36 jrand48_r F
+GLIBC_2.36 kill F
+GLIBC_2.36 killpg F
+GLIBC_2.36 klogctl F
+GLIBC_2.36 l64a F
+GLIBC_2.36 labs F
+GLIBC_2.36 lchmod F
+GLIBC_2.36 lchown F
+GLIBC_2.36 lckpwdf F
+GLIBC_2.36 lcong48 F
+GLIBC_2.36 lcong48_r F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 ldiv F
+GLIBC_2.36 lfind F
+GLIBC_2.36 lgetxattr F
+GLIBC_2.36 link F
+GLIBC_2.36 linkat F
+GLIBC_2.36 lio_listio F
+GLIBC_2.36 lio_listio64 F
+GLIBC_2.36 listen F
+GLIBC_2.36 listxattr F
+GLIBC_2.36 llabs F
+GLIBC_2.36 lldiv F
+GLIBC_2.36 llistxattr F
+GLIBC_2.36 localeconv F
+GLIBC_2.36 localtime F
+GLIBC_2.36 localtime_r F
+GLIBC_2.36 lockf F
+GLIBC_2.36 lockf64 F
+GLIBC_2.36 login F
+GLIBC_2.36 login_tty F
+GLIBC_2.36 logout F
+GLIBC_2.36 logwtmp F
+GLIBC_2.36 longjmp F
+GLIBC_2.36 lrand48 F
+GLIBC_2.36 lrand48_r F
+GLIBC_2.36 lremovexattr F
+GLIBC_2.36 lsearch F
+GLIBC_2.36 lseek F
+GLIBC_2.36 lseek64 F
+GLIBC_2.36 lsetxattr F
+GLIBC_2.36 lstat F
+GLIBC_2.36 lstat64 F
+GLIBC_2.36 lutimes F
+GLIBC_2.36 madvise F
+GLIBC_2.36 makecontext F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mblen F
+GLIBC_2.36 mbrlen F
+GLIBC_2.36 mbrtoc16 F
+GLIBC_2.36 mbrtoc32 F
+GLIBC_2.36 mbrtowc F
+GLIBC_2.36 mbsinit F
+GLIBC_2.36 mbsnrtowcs F
+GLIBC_2.36 mbsrtowcs F
+GLIBC_2.36 mbstowcs F
+GLIBC_2.36 mbtowc F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 memccpy F
+GLIBC_2.36 memchr F
+GLIBC_2.36 memcmp F
+GLIBC_2.36 memcpy F
+GLIBC_2.36 memfd_create F
+GLIBC_2.36 memfrob F
+GLIBC_2.36 memmem F
+GLIBC_2.36 memmove F
+GLIBC_2.36 mempcpy F
+GLIBC_2.36 memrchr F
+GLIBC_2.36 memset F
+GLIBC_2.36 mincore F
+GLIBC_2.36 mkdir F
+GLIBC_2.36 mkdirat F
+GLIBC_2.36 mkdtemp F
+GLIBC_2.36 mkfifo F
+GLIBC_2.36 mkfifoat F
+GLIBC_2.36 mknod F
+GLIBC_2.36 mknodat F
+GLIBC_2.36 mkostemp F
+GLIBC_2.36 mkostemp64 F
+GLIBC_2.36 mkostemps F
+GLIBC_2.36 mkostemps64 F
+GLIBC_2.36 mkstemp F
+GLIBC_2.36 mkstemp64 F
+GLIBC_2.36 mkstemps F
+GLIBC_2.36 mkstemps64 F
+GLIBC_2.36 mktemp F
+GLIBC_2.36 mktime F
+GLIBC_2.36 mlock F
+GLIBC_2.36 mlock2 F
+GLIBC_2.36 mlockall F
+GLIBC_2.36 mmap F
+GLIBC_2.36 mmap64 F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modfl F
+GLIBC_2.36 moncontrol F
+GLIBC_2.36 monstartup F
+GLIBC_2.36 mount F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mprotect F
+GLIBC_2.36 mq_close F
+GLIBC_2.36 mq_getattr F
+GLIBC_2.36 mq_notify F
+GLIBC_2.36 mq_open F
+GLIBC_2.36 mq_receive F
+GLIBC_2.36 mq_send F
+GLIBC_2.36 mq_setattr F
+GLIBC_2.36 mq_timedreceive F
+GLIBC_2.36 mq_timedsend F
+GLIBC_2.36 mq_unlink F
+GLIBC_2.36 mrand48 F
+GLIBC_2.36 mrand48_r F
+GLIBC_2.36 mremap F
+GLIBC_2.36 msgctl F
+GLIBC_2.36 msgget F
+GLIBC_2.36 msgrcv F
+GLIBC_2.36 msgsnd F
+GLIBC_2.36 msync F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 mtx_destroy F
+GLIBC_2.36 mtx_init F
+GLIBC_2.36 mtx_lock F
+GLIBC_2.36 mtx_timedlock F
+GLIBC_2.36 mtx_trylock F
+GLIBC_2.36 mtx_unlock F
+GLIBC_2.36 munlock F
+GLIBC_2.36 munlockall F
+GLIBC_2.36 munmap F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 name_to_handle_at F
+GLIBC_2.36 nanosleep F
+GLIBC_2.36 newlocale F
+GLIBC_2.36 nftw F
+GLIBC_2.36 nftw64 F
+GLIBC_2.36 ngettext F
+GLIBC_2.36 nice F
+GLIBC_2.36 nl_langinfo F
+GLIBC_2.36 nl_langinfo_l F
+GLIBC_2.36 nrand48 F
+GLIBC_2.36 nrand48_r F
+GLIBC_2.36 ns_name_compress F
+GLIBC_2.36 ns_name_ntop F
+GLIBC_2.36 ns_name_pack F
+GLIBC_2.36 ns_name_pton F
+GLIBC_2.36 ns_name_skip F
+GLIBC_2.36 ns_name_uncompress F
+GLIBC_2.36 ns_name_unpack F
+GLIBC_2.36 ntohl F
+GLIBC_2.36 ntohs F
+GLIBC_2.36 ntp_adjtime F
+GLIBC_2.36 ntp_gettime F
+GLIBC_2.36 ntp_gettimex F
+GLIBC_2.36 obstack_alloc_failed_handler D 0x8
+GLIBC_2.36 obstack_exit_failure D 0x4
+GLIBC_2.36 obstack_free F
+GLIBC_2.36 obstack_printf F
+GLIBC_2.36 obstack_vprintf F
+GLIBC_2.36 on_exit F
+GLIBC_2.36 open F
+GLIBC_2.36 open64 F
+GLIBC_2.36 open_by_handle_at F
+GLIBC_2.36 open_memstream F
+GLIBC_2.36 open_wmemstream F
+GLIBC_2.36 openat F
+GLIBC_2.36 openat64 F
+GLIBC_2.36 opendir F
+GLIBC_2.36 openlog F
+GLIBC_2.36 openpty F
+GLIBC_2.36 optarg D 0x8
+GLIBC_2.36 opterr D 0x4
+GLIBC_2.36 optind D 0x4
+GLIBC_2.36 optopt D 0x4
+GLIBC_2.36 parse_printf_format F
+GLIBC_2.36 pathconf F
+GLIBC_2.36 pause F
+GLIBC_2.36 pclose F
+GLIBC_2.36 perror F
+GLIBC_2.36 personality F
+GLIBC_2.36 pipe F
+GLIBC_2.36 pipe2 F
+GLIBC_2.36 pivot_root F
+GLIBC_2.36 pkey_alloc F
+GLIBC_2.36 pkey_free F
+GLIBC_2.36 pkey_get F
+GLIBC_2.36 pkey_mprotect F
+GLIBC_2.36 pkey_set F
+GLIBC_2.36 poll F
+GLIBC_2.36 popen F
+GLIBC_2.36 posix_fadvise F
+GLIBC_2.36 posix_fadvise64 F
+GLIBC_2.36 posix_fallocate F
+GLIBC_2.36 posix_fallocate64 F
+GLIBC_2.36 posix_madvise F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 posix_openpt F
+GLIBC_2.36 posix_spawn F
+GLIBC_2.36 posix_spawn_file_actions_addchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addclose F
+GLIBC_2.36 posix_spawn_file_actions_addclosefrom_np F
+GLIBC_2.36 posix_spawn_file_actions_adddup2 F
+GLIBC_2.36 posix_spawn_file_actions_addfchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addopen F
+GLIBC_2.36 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 posix_spawn_file_actions_destroy F
+GLIBC_2.36 posix_spawn_file_actions_init F
+GLIBC_2.36 posix_spawnattr_destroy F
+GLIBC_2.36 posix_spawnattr_getflags F
+GLIBC_2.36 posix_spawnattr_getpgroup F
+GLIBC_2.36 posix_spawnattr_getschedparam F
+GLIBC_2.36 posix_spawnattr_getschedpolicy F
+GLIBC_2.36 posix_spawnattr_getsigdefault F
+GLIBC_2.36 posix_spawnattr_getsigmask F
+GLIBC_2.36 posix_spawnattr_init F
+GLIBC_2.36 posix_spawnattr_setflags F
+GLIBC_2.36 posix_spawnattr_setpgroup F
+GLIBC_2.36 posix_spawnattr_setschedparam F
+GLIBC_2.36 posix_spawnattr_setschedpolicy F
+GLIBC_2.36 posix_spawnattr_setsigdefault F
+GLIBC_2.36 posix_spawnattr_setsigmask F
+GLIBC_2.36 posix_spawnp F
+GLIBC_2.36 ppoll F
+GLIBC_2.36 prctl F
+GLIBC_2.36 pread F
+GLIBC_2.36 pread64 F
+GLIBC_2.36 preadv F
+GLIBC_2.36 preadv2 F
+GLIBC_2.36 preadv64 F
+GLIBC_2.36 preadv64v2 F
+GLIBC_2.36 printf F
+GLIBC_2.36 printf_size F
+GLIBC_2.36 printf_size_info F
+GLIBC_2.36 prlimit F
+GLIBC_2.36 prlimit64 F
+GLIBC_2.36 process_vm_readv F
+GLIBC_2.36 process_vm_writev F
+GLIBC_2.36 profil F
+GLIBC_2.36 program_invocation_name D 0x8
+GLIBC_2.36 program_invocation_short_name D 0x8
+GLIBC_2.36 pselect F
+GLIBC_2.36 psiginfo F
+GLIBC_2.36 psignal F
+GLIBC_2.36 pthread_attr_destroy F
+GLIBC_2.36 pthread_attr_getaffinity_np F
+GLIBC_2.36 pthread_attr_getdetachstate F
+GLIBC_2.36 pthread_attr_getguardsize F
+GLIBC_2.36 pthread_attr_getinheritsched F
+GLIBC_2.36 pthread_attr_getschedparam F
+GLIBC_2.36 pthread_attr_getschedpolicy F
+GLIBC_2.36 pthread_attr_getscope F
+GLIBC_2.36 pthread_attr_getsigmask_np F
+GLIBC_2.36 pthread_attr_getstack F
+GLIBC_2.36 pthread_attr_getstackaddr F
+GLIBC_2.36 pthread_attr_getstacksize F
+GLIBC_2.36 pthread_attr_init F
+GLIBC_2.36 pthread_attr_setaffinity_np F
+GLIBC_2.36 pthread_attr_setdetachstate F
+GLIBC_2.36 pthread_attr_setguardsize F
+GLIBC_2.36 pthread_attr_setinheritsched F
+GLIBC_2.36 pthread_attr_setschedparam F
+GLIBC_2.36 pthread_attr_setschedpolicy F
+GLIBC_2.36 pthread_attr_setscope F
+GLIBC_2.36 pthread_attr_setsigmask_np F
+GLIBC_2.36 pthread_attr_setstack F
+GLIBC_2.36 pthread_attr_setstackaddr F
+GLIBC_2.36 pthread_attr_setstacksize F
+GLIBC_2.36 pthread_barrier_destroy F
+GLIBC_2.36 pthread_barrier_init F
+GLIBC_2.36 pthread_barrier_wait F
+GLIBC_2.36 pthread_barrierattr_destroy F
+GLIBC_2.36 pthread_barrierattr_getpshared F
+GLIBC_2.36 pthread_barrierattr_init F
+GLIBC_2.36 pthread_barrierattr_setpshared F
+GLIBC_2.36 pthread_cancel F
+GLIBC_2.36 pthread_clockjoin_np F
+GLIBC_2.36 pthread_cond_broadcast F
+GLIBC_2.36 pthread_cond_clockwait F
+GLIBC_2.36 pthread_cond_destroy F
+GLIBC_2.36 pthread_cond_init F
+GLIBC_2.36 pthread_cond_signal F
+GLIBC_2.36 pthread_cond_timedwait F
+GLIBC_2.36 pthread_cond_wait F
+GLIBC_2.36 pthread_condattr_destroy F
+GLIBC_2.36 pthread_condattr_getclock F
+GLIBC_2.36 pthread_condattr_getpshared F
+GLIBC_2.36 pthread_condattr_init F
+GLIBC_2.36 pthread_condattr_setclock F
+GLIBC_2.36 pthread_condattr_setpshared F
+GLIBC_2.36 pthread_create F
+GLIBC_2.36 pthread_detach F
+GLIBC_2.36 pthread_equal F
+GLIBC_2.36 pthread_exit F
+GLIBC_2.36 pthread_getaffinity_np F
+GLIBC_2.36 pthread_getattr_default_np F
+GLIBC_2.36 pthread_getattr_np F
+GLIBC_2.36 pthread_getconcurrency F
+GLIBC_2.36 pthread_getcpuclockid F
+GLIBC_2.36 pthread_getname_np F
+GLIBC_2.36 pthread_getschedparam F
+GLIBC_2.36 pthread_getspecific F
+GLIBC_2.36 pthread_join F
+GLIBC_2.36 pthread_key_create F
+GLIBC_2.36 pthread_key_delete F
+GLIBC_2.36 pthread_kill F
+GLIBC_2.36 pthread_mutex_clocklock F
+GLIBC_2.36 pthread_mutex_consistent F
+GLIBC_2.36 pthread_mutex_destroy F
+GLIBC_2.36 pthread_mutex_getprioceiling F
+GLIBC_2.36 pthread_mutex_init F
+GLIBC_2.36 pthread_mutex_lock F
+GLIBC_2.36 pthread_mutex_setprioceiling F
+GLIBC_2.36 pthread_mutex_timedlock F
+GLIBC_2.36 pthread_mutex_trylock F
+GLIBC_2.36 pthread_mutex_unlock F
+GLIBC_2.36 pthread_mutexattr_destroy F
+GLIBC_2.36 pthread_mutexattr_getprioceiling F
+GLIBC_2.36 pthread_mutexattr_getprotocol F
+GLIBC_2.36 pthread_mutexattr_getpshared F
+GLIBC_2.36 pthread_mutexattr_getrobust F
+GLIBC_2.36 pthread_mutexattr_gettype F
+GLIBC_2.36 pthread_mutexattr_init F
+GLIBC_2.36 pthread_mutexattr_setprioceiling F
+GLIBC_2.36 pthread_mutexattr_setprotocol F
+GLIBC_2.36 pthread_mutexattr_setpshared F
+GLIBC_2.36 pthread_mutexattr_setrobust F
+GLIBC_2.36 pthread_mutexattr_settype F
+GLIBC_2.36 pthread_once F
+GLIBC_2.36 pthread_rwlock_clockrdlock F
+GLIBC_2.36 pthread_rwlock_clockwrlock F
+GLIBC_2.36 pthread_rwlock_destroy F
+GLIBC_2.36 pthread_rwlock_init F
+GLIBC_2.36 pthread_rwlock_rdlock F
+GLIBC_2.36 pthread_rwlock_timedrdlock F
+GLIBC_2.36 pthread_rwlock_timedwrlock F
+GLIBC_2.36 pthread_rwlock_tryrdlock F
+GLIBC_2.36 pthread_rwlock_trywrlock F
+GLIBC_2.36 pthread_rwlock_unlock F
+GLIBC_2.36 pthread_rwlock_wrlock F
+GLIBC_2.36 pthread_rwlockattr_destroy F
+GLIBC_2.36 pthread_rwlockattr_getkind_np F
+GLIBC_2.36 pthread_rwlockattr_getpshared F
+GLIBC_2.36 pthread_rwlockattr_init F
+GLIBC_2.36 pthread_rwlockattr_setkind_np F
+GLIBC_2.36 pthread_rwlockattr_setpshared F
+GLIBC_2.36 pthread_self F
+GLIBC_2.36 pthread_setaffinity_np F
+GLIBC_2.36 pthread_setattr_default_np F
+GLIBC_2.36 pthread_setcancelstate F
+GLIBC_2.36 pthread_setcanceltype F
+GLIBC_2.36 pthread_setconcurrency F
+GLIBC_2.36 pthread_setname_np F
+GLIBC_2.36 pthread_setschedparam F
+GLIBC_2.36 pthread_setschedprio F
+GLIBC_2.36 pthread_setspecific F
+GLIBC_2.36 pthread_sigmask F
+GLIBC_2.36 pthread_sigqueue F
+GLIBC_2.36 pthread_spin_destroy F
+GLIBC_2.36 pthread_spin_init F
+GLIBC_2.36 pthread_spin_lock F
+GLIBC_2.36 pthread_spin_trylock F
+GLIBC_2.36 pthread_spin_unlock F
+GLIBC_2.36 pthread_testcancel F
+GLIBC_2.36 pthread_timedjoin_np F
+GLIBC_2.36 pthread_tryjoin_np F
+GLIBC_2.36 ptrace F
+GLIBC_2.36 ptsname F
+GLIBC_2.36 ptsname_r F
+GLIBC_2.36 putc F
+GLIBC_2.36 putc_unlocked F
+GLIBC_2.36 putchar F
+GLIBC_2.36 putchar_unlocked F
+GLIBC_2.36 putenv F
+GLIBC_2.36 putgrent F
+GLIBC_2.36 putpwent F
+GLIBC_2.36 puts F
+GLIBC_2.36 putsgent F
+GLIBC_2.36 putspent F
+GLIBC_2.36 pututline F
+GLIBC_2.36 pututxline F
+GLIBC_2.36 putw F
+GLIBC_2.36 putwc F
+GLIBC_2.36 putwc_unlocked F
+GLIBC_2.36 putwchar F
+GLIBC_2.36 putwchar_unlocked F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 pwrite F
+GLIBC_2.36 pwrite64 F
+GLIBC_2.36 pwritev F
+GLIBC_2.36 pwritev2 F
+GLIBC_2.36 pwritev64 F
+GLIBC_2.36 pwritev64v2 F
+GLIBC_2.36 qecvt F
+GLIBC_2.36 qecvt_r F
+GLIBC_2.36 qfcvt F
+GLIBC_2.36 qfcvt_r F
+GLIBC_2.36 qgcvt F
+GLIBC_2.36 qsort F
+GLIBC_2.36 qsort_r F
+GLIBC_2.36 quick_exit F
+GLIBC_2.36 quotactl F
+GLIBC_2.36 raise F
+GLIBC_2.36 rand F
+GLIBC_2.36 rand_r F
+GLIBC_2.36 random F
+GLIBC_2.36 random_r F
+GLIBC_2.36 rawmemchr F
+GLIBC_2.36 rcmd F
+GLIBC_2.36 rcmd_af F
+GLIBC_2.36 re_comp F
+GLIBC_2.36 re_compile_fastmap F
+GLIBC_2.36 re_compile_pattern F
+GLIBC_2.36 re_exec F
+GLIBC_2.36 re_match F
+GLIBC_2.36 re_match_2 F
+GLIBC_2.36 re_search F
+GLIBC_2.36 re_search_2 F
+GLIBC_2.36 re_set_registers F
+GLIBC_2.36 re_set_syntax F
+GLIBC_2.36 re_syntax_options D 0x8
+GLIBC_2.36 read F
+GLIBC_2.36 readahead F
+GLIBC_2.36 readdir F
+GLIBC_2.36 readdir64 F
+GLIBC_2.36 readdir64_r F
+GLIBC_2.36 readdir_r F
+GLIBC_2.36 readlink F
+GLIBC_2.36 readlinkat F
+GLIBC_2.36 readv F
+GLIBC_2.36 realloc F
+GLIBC_2.36 reallocarray F
+GLIBC_2.36 realpath F
+GLIBC_2.36 reboot F
+GLIBC_2.36 recv F
+GLIBC_2.36 recvfrom F
+GLIBC_2.36 recvmmsg F
+GLIBC_2.36 recvmsg F
+GLIBC_2.36 regcomp F
+GLIBC_2.36 regerror F
+GLIBC_2.36 regexec F
+GLIBC_2.36 regfree F
+GLIBC_2.36 register_printf_function F
+GLIBC_2.36 register_printf_modifier F
+GLIBC_2.36 register_printf_specifier F
+GLIBC_2.36 register_printf_type F
+GLIBC_2.36 remap_file_pages F
+GLIBC_2.36 remove F
+GLIBC_2.36 removexattr F
+GLIBC_2.36 remque F
+GLIBC_2.36 rename F
+GLIBC_2.36 renameat F
+GLIBC_2.36 renameat2 F
+GLIBC_2.36 res_dnok F
+GLIBC_2.36 res_hnok F
+GLIBC_2.36 res_mailok F
+GLIBC_2.36 res_mkquery F
+GLIBC_2.36 res_nmkquery F
+GLIBC_2.36 res_nquery F
+GLIBC_2.36 res_nquerydomain F
+GLIBC_2.36 res_nsearch F
+GLIBC_2.36 res_nsend F
+GLIBC_2.36 res_ownok F
+GLIBC_2.36 res_query F
+GLIBC_2.36 res_querydomain F
+GLIBC_2.36 res_search F
+GLIBC_2.36 res_send F
+GLIBC_2.36 revoke F
+GLIBC_2.36 rewind F
+GLIBC_2.36 rewinddir F
+GLIBC_2.36 rexec F
+GLIBC_2.36 rexec_af F
+GLIBC_2.36 rexecoptions D 0x4
+GLIBC_2.36 rindex F
+GLIBC_2.36 rmdir F
+GLIBC_2.36 rpmatch F
+GLIBC_2.36 rresvport F
+GLIBC_2.36 rresvport_af F
+GLIBC_2.36 ruserok F
+GLIBC_2.36 ruserok_af F
+GLIBC_2.36 ruserpass F
+GLIBC_2.36 sbrk F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 scandir F
+GLIBC_2.36 scandir64 F
+GLIBC_2.36 scandirat F
+GLIBC_2.36 scandirat64 F
+GLIBC_2.36 scanf F
+GLIBC_2.36 sched_get_priority_max F
+GLIBC_2.36 sched_get_priority_min F
+GLIBC_2.36 sched_getaffinity F
+GLIBC_2.36 sched_getcpu F
+GLIBC_2.36 sched_getparam F
+GLIBC_2.36 sched_getscheduler F
+GLIBC_2.36 sched_rr_get_interval F
+GLIBC_2.36 sched_setaffinity F
+GLIBC_2.36 sched_setparam F
+GLIBC_2.36 sched_setscheduler F
+GLIBC_2.36 sched_yield F
+GLIBC_2.36 secure_getenv F
+GLIBC_2.36 seed48 F
+GLIBC_2.36 seed48_r F
+GLIBC_2.36 seekdir F
+GLIBC_2.36 select F
+GLIBC_2.36 sem_clockwait F
+GLIBC_2.36 sem_close F
+GLIBC_2.36 sem_destroy F
+GLIBC_2.36 sem_getvalue F
+GLIBC_2.36 sem_init F
+GLIBC_2.36 sem_open F
+GLIBC_2.36 sem_post F
+GLIBC_2.36 sem_timedwait F
+GLIBC_2.36 sem_trywait F
+GLIBC_2.36 sem_unlink F
+GLIBC_2.36 sem_wait F
+GLIBC_2.36 semctl F
+GLIBC_2.36 semget F
+GLIBC_2.36 semop F
+GLIBC_2.36 semtimedop F
+GLIBC_2.36 send F
+GLIBC_2.36 sendfile F
+GLIBC_2.36 sendfile64 F
+GLIBC_2.36 sendmmsg F
+GLIBC_2.36 sendmsg F
+GLIBC_2.36 sendto F
+GLIBC_2.36 setaliasent F
+GLIBC_2.36 setbuf F
+GLIBC_2.36 setbuffer F
+GLIBC_2.36 setcontext F
+GLIBC_2.36 setdomainname F
+GLIBC_2.36 setegid F
+GLIBC_2.36 setenv F
+GLIBC_2.36 seteuid F
+GLIBC_2.36 setfsent F
+GLIBC_2.36 setfsgid F
+GLIBC_2.36 setfsuid F
+GLIBC_2.36 setgid F
+GLIBC_2.36 setgrent F
+GLIBC_2.36 setgroups F
+GLIBC_2.36 sethostent F
+GLIBC_2.36 sethostid F
+GLIBC_2.36 sethostname F
+GLIBC_2.36 setipv4sourcefilter F
+GLIBC_2.36 setitimer F
+GLIBC_2.36 setjmp F
+GLIBC_2.36 setlinebuf F
+GLIBC_2.36 setlocale F
+GLIBC_2.36 setlogin F
+GLIBC_2.36 setlogmask F
+GLIBC_2.36 setmntent F
+GLIBC_2.36 setnetent F
+GLIBC_2.36 setnetgrent F
+GLIBC_2.36 setns F
+GLIBC_2.36 setpgid F
+GLIBC_2.36 setpgrp F
+GLIBC_2.36 setpriority F
+GLIBC_2.36 setprotoent F
+GLIBC_2.36 setpwent F
+GLIBC_2.36 setregid F
+GLIBC_2.36 setresgid F
+GLIBC_2.36 setresuid F
+GLIBC_2.36 setreuid F
+GLIBC_2.36 setrlimit F
+GLIBC_2.36 setrlimit64 F
+GLIBC_2.36 setrpcent F
+GLIBC_2.36 setservent F
+GLIBC_2.36 setsgent F
+GLIBC_2.36 setsid F
+GLIBC_2.36 setsockopt F
+GLIBC_2.36 setsourcefilter F
+GLIBC_2.36 setspent F
+GLIBC_2.36 setstate F
+GLIBC_2.36 setstate_r F
+GLIBC_2.36 settimeofday F
+GLIBC_2.36 setttyent F
+GLIBC_2.36 setuid F
+GLIBC_2.36 setusershell F
+GLIBC_2.36 setutent F
+GLIBC_2.36 setutxent F
+GLIBC_2.36 setvbuf F
+GLIBC_2.36 setxattr F
+GLIBC_2.36 sgetsgent F
+GLIBC_2.36 sgetsgent_r F
+GLIBC_2.36 sgetspent F
+GLIBC_2.36 sgetspent_r F
+GLIBC_2.36 shm_open F
+GLIBC_2.36 shm_unlink F
+GLIBC_2.36 shmat F
+GLIBC_2.36 shmctl F
+GLIBC_2.36 shmdt F
+GLIBC_2.36 shmget F
+GLIBC_2.36 shutdown F
+GLIBC_2.36 sigabbrev_np F
+GLIBC_2.36 sigaction F
+GLIBC_2.36 sigaddset F
+GLIBC_2.36 sigaltstack F
+GLIBC_2.36 sigandset F
+GLIBC_2.36 sigblock F
+GLIBC_2.36 sigdelset F
+GLIBC_2.36 sigdescr_np F
+GLIBC_2.36 sigemptyset F
+GLIBC_2.36 sigfillset F
+GLIBC_2.36 siggetmask F
+GLIBC_2.36 sighold F
+GLIBC_2.36 sigignore F
+GLIBC_2.36 siginterrupt F
+GLIBC_2.36 sigisemptyset F
+GLIBC_2.36 sigismember F
+GLIBC_2.36 siglongjmp F
+GLIBC_2.36 signal F
+GLIBC_2.36 signalfd F
+GLIBC_2.36 sigorset F
+GLIBC_2.36 sigpause F
+GLIBC_2.36 sigpending F
+GLIBC_2.36 sigprocmask F
+GLIBC_2.36 sigqueue F
+GLIBC_2.36 sigrelse F
+GLIBC_2.36 sigreturn F
+GLIBC_2.36 sigset F
+GLIBC_2.36 sigsetmask F
+GLIBC_2.36 sigstack F
+GLIBC_2.36 sigsuspend F
+GLIBC_2.36 sigtimedwait F
+GLIBC_2.36 sigwait F
+GLIBC_2.36 sigwaitinfo F
+GLIBC_2.36 sleep F
+GLIBC_2.36 snprintf F
+GLIBC_2.36 sockatmark F
+GLIBC_2.36 socket F
+GLIBC_2.36 socketpair F
+GLIBC_2.36 splice F
+GLIBC_2.36 sprintf F
+GLIBC_2.36 sprofil F
+GLIBC_2.36 srand F
+GLIBC_2.36 srand48 F
+GLIBC_2.36 srand48_r F
+GLIBC_2.36 srandom F
+GLIBC_2.36 srandom_r F
+GLIBC_2.36 sscanf F
+GLIBC_2.36 ssignal F
+GLIBC_2.36 stat F
+GLIBC_2.36 stat64 F
+GLIBC_2.36 statfs F
+GLIBC_2.36 statfs64 F
+GLIBC_2.36 statvfs F
+GLIBC_2.36 statvfs64 F
+GLIBC_2.36 statx F
+GLIBC_2.36 stderr D 0x8
+GLIBC_2.36 stdin D 0x8
+GLIBC_2.36 stdout D 0x8
+GLIBC_2.36 stpcpy F
+GLIBC_2.36 stpncpy F
+GLIBC_2.36 strcasecmp F
+GLIBC_2.36 strcasecmp_l F
+GLIBC_2.36 strcasestr F
+GLIBC_2.36 strcat F
+GLIBC_2.36 strchr F
+GLIBC_2.36 strchrnul F
+GLIBC_2.36 strcmp F
+GLIBC_2.36 strcoll F
+GLIBC_2.36 strcoll_l F
+GLIBC_2.36 strcpy F
+GLIBC_2.36 strcspn F
+GLIBC_2.36 strdup F
+GLIBC_2.36 strerror F
+GLIBC_2.36 strerror_l F
+GLIBC_2.36 strerror_r F
+GLIBC_2.36 strerrordesc_np F
+GLIBC_2.36 strerrorname_np F
+GLIBC_2.36 strfmon F
+GLIBC_2.36 strfmon_l F
+GLIBC_2.36 strfromd F
+GLIBC_2.36 strfromf F
+GLIBC_2.36 strfromf128 F
+GLIBC_2.36 strfromf32 F
+GLIBC_2.36 strfromf32x F
+GLIBC_2.36 strfromf64 F
+GLIBC_2.36 strfromf64x F
+GLIBC_2.36 strfroml F
+GLIBC_2.36 strfry F
+GLIBC_2.36 strftime F
+GLIBC_2.36 strftime_l F
+GLIBC_2.36 strlen F
+GLIBC_2.36 strncasecmp F
+GLIBC_2.36 strncasecmp_l F
+GLIBC_2.36 strncat F
+GLIBC_2.36 strncmp F
+GLIBC_2.36 strncpy F
+GLIBC_2.36 strndup F
+GLIBC_2.36 strnlen F
+GLIBC_2.36 strpbrk F
+GLIBC_2.36 strptime F
+GLIBC_2.36 strptime_l F
+GLIBC_2.36 strrchr F
+GLIBC_2.36 strsep F
+GLIBC_2.36 strsignal F
+GLIBC_2.36 strspn F
+GLIBC_2.36 strstr F
+GLIBC_2.36 strtod F
+GLIBC_2.36 strtod_l F
+GLIBC_2.36 strtof F
+GLIBC_2.36 strtof128 F
+GLIBC_2.36 strtof128_l F
+GLIBC_2.36 strtof32 F
+GLIBC_2.36 strtof32_l F
+GLIBC_2.36 strtof32x F
+GLIBC_2.36 strtof32x_l F
+GLIBC_2.36 strtof64 F
+GLIBC_2.36 strtof64_l F
+GLIBC_2.36 strtof64x F
+GLIBC_2.36 strtof64x_l F
+GLIBC_2.36 strtof_l F
+GLIBC_2.36 strtoimax F
+GLIBC_2.36 strtok F
+GLIBC_2.36 strtok_r F
+GLIBC_2.36 strtol F
+GLIBC_2.36 strtol_l F
+GLIBC_2.36 strtold F
+GLIBC_2.36 strtold_l F
+GLIBC_2.36 strtoll F
+GLIBC_2.36 strtoll_l F
+GLIBC_2.36 strtoq F
+GLIBC_2.36 strtoul F
+GLIBC_2.36 strtoul_l F
+GLIBC_2.36 strtoull F
+GLIBC_2.36 strtoull_l F
+GLIBC_2.36 strtoumax F
+GLIBC_2.36 strtouq F
+GLIBC_2.36 strverscmp F
+GLIBC_2.36 strxfrm F
+GLIBC_2.36 strxfrm_l F
+GLIBC_2.36 stty F
+GLIBC_2.36 swab F
+GLIBC_2.36 swapcontext F
+GLIBC_2.36 swapoff F
+GLIBC_2.36 swapon F
+GLIBC_2.36 swprintf F
+GLIBC_2.36 swscanf F
+GLIBC_2.36 symlink F
+GLIBC_2.36 symlinkat F
+GLIBC_2.36 sync F
+GLIBC_2.36 sync_file_range F
+GLIBC_2.36 syncfs F
+GLIBC_2.36 syscall F
+GLIBC_2.36 sysconf F
+GLIBC_2.36 sysinfo F
+GLIBC_2.36 syslog F
+GLIBC_2.36 system F
+GLIBC_2.36 sysv_signal F
+GLIBC_2.36 tcdrain F
+GLIBC_2.36 tcflow F
+GLIBC_2.36 tcflush F
+GLIBC_2.36 tcgetattr F
+GLIBC_2.36 tcgetpgrp F
+GLIBC_2.36 tcgetsid F
+GLIBC_2.36 tcsendbreak F
+GLIBC_2.36 tcsetattr F
+GLIBC_2.36 tcsetpgrp F
+GLIBC_2.36 tdelete F
+GLIBC_2.36 tdestroy F
+GLIBC_2.36 tee F
+GLIBC_2.36 telldir F
+GLIBC_2.36 tempnam F
+GLIBC_2.36 textdomain F
+GLIBC_2.36 tfind F
+GLIBC_2.36 tgkill F
+GLIBC_2.36 thrd_create F
+GLIBC_2.36 thrd_current F
+GLIBC_2.36 thrd_detach F
+GLIBC_2.36 thrd_equal F
+GLIBC_2.36 thrd_exit F
+GLIBC_2.36 thrd_join F
+GLIBC_2.36 thrd_sleep F
+GLIBC_2.36 thrd_yield F
+GLIBC_2.36 time F
+GLIBC_2.36 timegm F
+GLIBC_2.36 timelocal F
+GLIBC_2.36 timer_create F
+GLIBC_2.36 timer_delete F
+GLIBC_2.36 timer_getoverrun F
+GLIBC_2.36 timer_gettime F
+GLIBC_2.36 timer_settime F
+GLIBC_2.36 timerfd_create F
+GLIBC_2.36 timerfd_gettime F
+GLIBC_2.36 timerfd_settime F
+GLIBC_2.36 times F
+GLIBC_2.36 timespec_get F
+GLIBC_2.36 timespec_getres F
+GLIBC_2.36 timezone D 0x8
+GLIBC_2.36 tmpfile F
+GLIBC_2.36 tmpfile64 F
+GLIBC_2.36 tmpnam F
+GLIBC_2.36 tmpnam_r F
+GLIBC_2.36 toascii F
+GLIBC_2.36 tolower F
+GLIBC_2.36 tolower_l F
+GLIBC_2.36 toupper F
+GLIBC_2.36 toupper_l F
+GLIBC_2.36 towctrans F
+GLIBC_2.36 towctrans_l F
+GLIBC_2.36 towlower F
+GLIBC_2.36 towlower_l F
+GLIBC_2.36 towupper F
+GLIBC_2.36 towupper_l F
+GLIBC_2.36 truncate F
+GLIBC_2.36 truncate64 F
+GLIBC_2.36 tsearch F
+GLIBC_2.36 tss_create F
+GLIBC_2.36 tss_delete F
+GLIBC_2.36 tss_get F
+GLIBC_2.36 tss_set F
+GLIBC_2.36 ttyname F
+GLIBC_2.36 ttyname_r F
+GLIBC_2.36 ttyslot F
+GLIBC_2.36 twalk F
+GLIBC_2.36 twalk_r F
+GLIBC_2.36 tzname D 0x10
+GLIBC_2.36 tzset F
+GLIBC_2.36 ualarm F
+GLIBC_2.36 ulckpwdf F
+GLIBC_2.36 ulimit F
+GLIBC_2.36 umask F
+GLIBC_2.36 umount F
+GLIBC_2.36 umount2 F
+GLIBC_2.36 uname F
+GLIBC_2.36 ungetc F
+GLIBC_2.36 ungetwc F
+GLIBC_2.36 unlink F
+GLIBC_2.36 unlinkat F
+GLIBC_2.36 unlockpt F
+GLIBC_2.36 unsetenv F
+GLIBC_2.36 unshare F
+GLIBC_2.36 updwtmp F
+GLIBC_2.36 updwtmpx F
+GLIBC_2.36 uselocale F
+GLIBC_2.36 usleep F
+GLIBC_2.36 utime F
+GLIBC_2.36 utimensat F
+GLIBC_2.36 utimes F
+GLIBC_2.36 utmpname F
+GLIBC_2.36 utmpxname F
+GLIBC_2.36 valloc F
+GLIBC_2.36 vasprintf F
+GLIBC_2.36 vdprintf F
+GLIBC_2.36 verr F
+GLIBC_2.36 verrx F
+GLIBC_2.36 versionsort F
+GLIBC_2.36 versionsort64 F
+GLIBC_2.36 vfork F
+GLIBC_2.36 vfprintf F
+GLIBC_2.36 vfscanf F
+GLIBC_2.36 vfwprintf F
+GLIBC_2.36 vfwscanf F
+GLIBC_2.36 vhangup F
+GLIBC_2.36 vlimit F
+GLIBC_2.36 vmsplice F
+GLIBC_2.36 vprintf F
+GLIBC_2.36 vscanf F
+GLIBC_2.36 vsnprintf F
+GLIBC_2.36 vsprintf F
+GLIBC_2.36 vsscanf F
+GLIBC_2.36 vswprintf F
+GLIBC_2.36 vswscanf F
+GLIBC_2.36 vsyslog F
+GLIBC_2.36 vwarn F
+GLIBC_2.36 vwarnx F
+GLIBC_2.36 vwprintf F
+GLIBC_2.36 vwscanf F
+GLIBC_2.36 wait F
+GLIBC_2.36 wait3 F
+GLIBC_2.36 wait4 F
+GLIBC_2.36 waitid F
+GLIBC_2.36 waitpid F
+GLIBC_2.36 warn F
+GLIBC_2.36 warnx F
+GLIBC_2.36 wcpcpy F
+GLIBC_2.36 wcpncpy F
+GLIBC_2.36 wcrtomb F
+GLIBC_2.36 wcscasecmp F
+GLIBC_2.36 wcscasecmp_l F
+GLIBC_2.36 wcscat F
+GLIBC_2.36 wcschr F
+GLIBC_2.36 wcschrnul F
+GLIBC_2.36 wcscmp F
+GLIBC_2.36 wcscoll F
+GLIBC_2.36 wcscoll_l F
+GLIBC_2.36 wcscpy F
+GLIBC_2.36 wcscspn F
+GLIBC_2.36 wcsdup F
+GLIBC_2.36 wcsftime F
+GLIBC_2.36 wcsftime_l F
+GLIBC_2.36 wcslen F
+GLIBC_2.36 wcsncasecmp F
+GLIBC_2.36 wcsncasecmp_l F
+GLIBC_2.36 wcsncat F
+GLIBC_2.36 wcsncmp F
+GLIBC_2.36 wcsncpy F
+GLIBC_2.36 wcsnlen F
+GLIBC_2.36 wcsnrtombs F
+GLIBC_2.36 wcspbrk F
+GLIBC_2.36 wcsrchr F
+GLIBC_2.36 wcsrtombs F
+GLIBC_2.36 wcsspn F
+GLIBC_2.36 wcsstr F
+GLIBC_2.36 wcstod F
+GLIBC_2.36 wcstod_l F
+GLIBC_2.36 wcstof F
+GLIBC_2.36 wcstof128 F
+GLIBC_2.36 wcstof128_l F
+GLIBC_2.36 wcstof32 F
+GLIBC_2.36 wcstof32_l F
+GLIBC_2.36 wcstof32x F
+GLIBC_2.36 wcstof32x_l F
+GLIBC_2.36 wcstof64 F
+GLIBC_2.36 wcstof64_l F
+GLIBC_2.36 wcstof64x F
+GLIBC_2.36 wcstof64x_l F
+GLIBC_2.36 wcstof_l F
+GLIBC_2.36 wcstoimax F
+GLIBC_2.36 wcstok F
+GLIBC_2.36 wcstol F
+GLIBC_2.36 wcstol_l F
+GLIBC_2.36 wcstold F
+GLIBC_2.36 wcstold_l F
+GLIBC_2.36 wcstoll F
+GLIBC_2.36 wcstoll_l F
+GLIBC_2.36 wcstombs F
+GLIBC_2.36 wcstoq F
+GLIBC_2.36 wcstoul F
+GLIBC_2.36 wcstoul_l F
+GLIBC_2.36 wcstoull F
+GLIBC_2.36 wcstoull_l F
+GLIBC_2.36 wcstoumax F
+GLIBC_2.36 wcstouq F
+GLIBC_2.36 wcswcs F
+GLIBC_2.36 wcswidth F
+GLIBC_2.36 wcsxfrm F
+GLIBC_2.36 wcsxfrm_l F
+GLIBC_2.36 wctob F
+GLIBC_2.36 wctomb F
+GLIBC_2.36 wctrans F
+GLIBC_2.36 wctrans_l F
+GLIBC_2.36 wctype F
+GLIBC_2.36 wctype_l F
+GLIBC_2.36 wcwidth F
+GLIBC_2.36 wmemchr F
+GLIBC_2.36 wmemcmp F
+GLIBC_2.36 wmemcpy F
+GLIBC_2.36 wmemmove F
+GLIBC_2.36 wmempcpy F
+GLIBC_2.36 wmemset F
+GLIBC_2.36 wordexp F
+GLIBC_2.36 wordfree F
+GLIBC_2.36 wprintf F
+GLIBC_2.36 write F
+GLIBC_2.36 writev F
+GLIBC_2.36 wscanf F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
new file mode 100644
index 0000000000..6ddfd162b3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
@@ -0,0 +1,26 @@
+GLIBC_2.36 __free_hook D 0x8
+GLIBC_2.36 __malloc_hook D 0x8
+GLIBC_2.36 __memalign_hook D 0x8
+GLIBC_2.36 __realloc_hook D 0x8
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 calloc F
+GLIBC_2.36 free F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 realloc F
+GLIBC_2.36 valloc F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
new file mode 100644
index 0000000000..4d4332dab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.36 crypt F
+GLIBC_2.36 crypt_r F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
new file mode 100644
index 0000000000..6ddb86edef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
@@ -0,0 +1,1031 @@
+GLIBC_2.36 __clog10 F
+GLIBC_2.36 __clog10f F
+GLIBC_2.36 __clog10l F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __fpclassify F
+GLIBC_2.36 __fpclassifyf F
+GLIBC_2.36 __fpclassifyl F
+GLIBC_2.36 __iseqsig F
+GLIBC_2.36 __iseqsigf F
+GLIBC_2.36 __iseqsigl F
+GLIBC_2.36 __issignaling F
+GLIBC_2.36 __issignalingf F
+GLIBC_2.36 __issignalingl F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __signgam D 0x4
+GLIBC_2.36 __sqrtl_finite F
+GLIBC_2.36 acos F
+GLIBC_2.36 acosf F
+GLIBC_2.36 acosf128 F
+GLIBC_2.36 acosf32 F
+GLIBC_2.36 acosf32x F
+GLIBC_2.36 acosf64 F
+GLIBC_2.36 acosf64x F
+GLIBC_2.36 acosh F
+GLIBC_2.36 acoshf F
+GLIBC_2.36 acoshf128 F
+GLIBC_2.36 acoshf32 F
+GLIBC_2.36 acoshf32x F
+GLIBC_2.36 acoshf64 F
+GLIBC_2.36 acoshf64x F
+GLIBC_2.36 acoshl F
+GLIBC_2.36 acosl F
+GLIBC_2.36 asin F
+GLIBC_2.36 asinf F
+GLIBC_2.36 asinf128 F
+GLIBC_2.36 asinf32 F
+GLIBC_2.36 asinf32x F
+GLIBC_2.36 asinf64 F
+GLIBC_2.36 asinf64x F
+GLIBC_2.36 asinh F
+GLIBC_2.36 asinhf F
+GLIBC_2.36 asinhf128 F
+GLIBC_2.36 asinhf32 F
+GLIBC_2.36 asinhf32x F
+GLIBC_2.36 asinhf64 F
+GLIBC_2.36 asinhf64x F
+GLIBC_2.36 asinhl F
+GLIBC_2.36 asinl F
+GLIBC_2.36 atan F
+GLIBC_2.36 atan2 F
+GLIBC_2.36 atan2f F
+GLIBC_2.36 atan2f128 F
+GLIBC_2.36 atan2f32 F
+GLIBC_2.36 atan2f32x F
+GLIBC_2.36 atan2f64 F
+GLIBC_2.36 atan2f64x F
+GLIBC_2.36 atan2l F
+GLIBC_2.36 atanf F
+GLIBC_2.36 atanf128 F
+GLIBC_2.36 atanf32 F
+GLIBC_2.36 atanf32x F
+GLIBC_2.36 atanf64 F
+GLIBC_2.36 atanf64x F
+GLIBC_2.36 atanh F
+GLIBC_2.36 atanhf F
+GLIBC_2.36 atanhf128 F
+GLIBC_2.36 atanhf32 F
+GLIBC_2.36 atanhf32x F
+GLIBC_2.36 atanhf64 F
+GLIBC_2.36 atanhf64x F
+GLIBC_2.36 atanhl F
+GLIBC_2.36 atanl F
+GLIBC_2.36 cabs F
+GLIBC_2.36 cabsf F
+GLIBC_2.36 cabsf128 F
+GLIBC_2.36 cabsf32 F
+GLIBC_2.36 cabsf32x F
+GLIBC_2.36 cabsf64 F
+GLIBC_2.36 cabsf64x F
+GLIBC_2.36 cabsl F
+GLIBC_2.36 cacos F
+GLIBC_2.36 cacosf F
+GLIBC_2.36 cacosf128 F
+GLIBC_2.36 cacosf32 F
+GLIBC_2.36 cacosf32x F
+GLIBC_2.36 cacosf64 F
+GLIBC_2.36 cacosf64x F
+GLIBC_2.36 cacosh F
+GLIBC_2.36 cacoshf F
+GLIBC_2.36 cacoshf128 F
+GLIBC_2.36 cacoshf32 F
+GLIBC_2.36 cacoshf32x F
+GLIBC_2.36 cacoshf64 F
+GLIBC_2.36 cacoshf64x F
+GLIBC_2.36 cacoshl F
+GLIBC_2.36 cacosl F
+GLIBC_2.36 canonicalize F
+GLIBC_2.36 canonicalizef F
+GLIBC_2.36 canonicalizef128 F
+GLIBC_2.36 canonicalizef32 F
+GLIBC_2.36 canonicalizef32x F
+GLIBC_2.36 canonicalizef64 F
+GLIBC_2.36 canonicalizef64x F
+GLIBC_2.36 canonicalizel F
+GLIBC_2.36 carg F
+GLIBC_2.36 cargf F
+GLIBC_2.36 cargf128 F
+GLIBC_2.36 cargf32 F
+GLIBC_2.36 cargf32x F
+GLIBC_2.36 cargf64 F
+GLIBC_2.36 cargf64x F
+GLIBC_2.36 cargl F
+GLIBC_2.36 casin F
+GLIBC_2.36 casinf F
+GLIBC_2.36 casinf128 F
+GLIBC_2.36 casinf32 F
+GLIBC_2.36 casinf32x F
+GLIBC_2.36 casinf64 F
+GLIBC_2.36 casinf64x F
+GLIBC_2.36 casinh F
+GLIBC_2.36 casinhf F
+GLIBC_2.36 casinhf128 F
+GLIBC_2.36 casinhf32 F
+GLIBC_2.36 casinhf32x F
+GLIBC_2.36 casinhf64 F
+GLIBC_2.36 casinhf64x F
+GLIBC_2.36 casinhl F
+GLIBC_2.36 casinl F
+GLIBC_2.36 catan F
+GLIBC_2.36 catanf F
+GLIBC_2.36 catanf128 F
+GLIBC_2.36 catanf32 F
+GLIBC_2.36 catanf32x F
+GLIBC_2.36 catanf64 F
+GLIBC_2.36 catanf64x F
+GLIBC_2.36 catanh F
+GLIBC_2.36 catanhf F
+GLIBC_2.36 catanhf128 F
+GLIBC_2.36 catanhf32 F
+GLIBC_2.36 catanhf32x F
+GLIBC_2.36 catanhf64 F
+GLIBC_2.36 catanhf64x F
+GLIBC_2.36 catanhl F
+GLIBC_2.36 catanl F
+GLIBC_2.36 cbrt F
+GLIBC_2.36 cbrtf F
+GLIBC_2.36 cbrtf128 F
+GLIBC_2.36 cbrtf32 F
+GLIBC_2.36 cbrtf32x F
+GLIBC_2.36 cbrtf64 F
+GLIBC_2.36 cbrtf64x F
+GLIBC_2.36 cbrtl F
+GLIBC_2.36 ccos F
+GLIBC_2.36 ccosf F
+GLIBC_2.36 ccosf128 F
+GLIBC_2.36 ccosf32 F
+GLIBC_2.36 ccosf32x F
+GLIBC_2.36 ccosf64 F
+GLIBC_2.36 ccosf64x F
+GLIBC_2.36 ccosh F
+GLIBC_2.36 ccoshf F
+GLIBC_2.36 ccoshf128 F
+GLIBC_2.36 ccoshf32 F
+GLIBC_2.36 ccoshf32x F
+GLIBC_2.36 ccoshf64 F
+GLIBC_2.36 ccoshf64x F
+GLIBC_2.36 ccoshl F
+GLIBC_2.36 ccosl F
+GLIBC_2.36 ceil F
+GLIBC_2.36 ceilf F
+GLIBC_2.36 ceilf128 F
+GLIBC_2.36 ceilf32 F
+GLIBC_2.36 ceilf32x F
+GLIBC_2.36 ceilf64 F
+GLIBC_2.36 ceilf64x F
+GLIBC_2.36 ceill F
+GLIBC_2.36 cexp F
+GLIBC_2.36 cexpf F
+GLIBC_2.36 cexpf128 F
+GLIBC_2.36 cexpf32 F
+GLIBC_2.36 cexpf32x F
+GLIBC_2.36 cexpf64 F
+GLIBC_2.36 cexpf64x F
+GLIBC_2.36 cexpl F
+GLIBC_2.36 cimag F
+GLIBC_2.36 cimagf F
+GLIBC_2.36 cimagf128 F
+GLIBC_2.36 cimagf32 F
+GLIBC_2.36 cimagf32x F
+GLIBC_2.36 cimagf64 F
+GLIBC_2.36 cimagf64x F
+GLIBC_2.36 cimagl F
+GLIBC_2.36 clog F
+GLIBC_2.36 clog10 F
+GLIBC_2.36 clog10f F
+GLIBC_2.36 clog10f128 F
+GLIBC_2.36 clog10f32 F
+GLIBC_2.36 clog10f32x F
+GLIBC_2.36 clog10f64 F
+GLIBC_2.36 clog10f64x F
+GLIBC_2.36 clog10l F
+GLIBC_2.36 clogf F
+GLIBC_2.36 clogf128 F
+GLIBC_2.36 clogf32 F
+GLIBC_2.36 clogf32x F
+GLIBC_2.36 clogf64 F
+GLIBC_2.36 clogf64x F
+GLIBC_2.36 clogl F
+GLIBC_2.36 conj F
+GLIBC_2.36 conjf F
+GLIBC_2.36 conjf128 F
+GLIBC_2.36 conjf32 F
+GLIBC_2.36 conjf32x F
+GLIBC_2.36 conjf64 F
+GLIBC_2.36 conjf64x F
+GLIBC_2.36 conjl F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignf128 F
+GLIBC_2.36 copysignf32 F
+GLIBC_2.36 copysignf32x F
+GLIBC_2.36 copysignf64 F
+GLIBC_2.36 copysignf64x F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 cos F
+GLIBC_2.36 cosf F
+GLIBC_2.36 cosf128 F
+GLIBC_2.36 cosf32 F
+GLIBC_2.36 cosf32x F
+GLIBC_2.36 cosf64 F
+GLIBC_2.36 cosf64x F
+GLIBC_2.36 cosh F
+GLIBC_2.36 coshf F
+GLIBC_2.36 coshf128 F
+GLIBC_2.36 coshf32 F
+GLIBC_2.36 coshf32x F
+GLIBC_2.36 coshf64 F
+GLIBC_2.36 coshf64x F
+GLIBC_2.36 coshl F
+GLIBC_2.36 cosl F
+GLIBC_2.36 cpow F
+GLIBC_2.36 cpowf F
+GLIBC_2.36 cpowf128 F
+GLIBC_2.36 cpowf32 F
+GLIBC_2.36 cpowf32x F
+GLIBC_2.36 cpowf64 F
+GLIBC_2.36 cpowf64x F
+GLIBC_2.36 cpowl F
+GLIBC_2.36 cproj F
+GLIBC_2.36 cprojf F
+GLIBC_2.36 cprojf128 F
+GLIBC_2.36 cprojf32 F
+GLIBC_2.36 cprojf32x F
+GLIBC_2.36 cprojf64 F
+GLIBC_2.36 cprojf64x F
+GLIBC_2.36 cprojl F
+GLIBC_2.36 creal F
+GLIBC_2.36 crealf F
+GLIBC_2.36 crealf128 F
+GLIBC_2.36 crealf32 F
+GLIBC_2.36 crealf32x F
+GLIBC_2.36 crealf64 F
+GLIBC_2.36 crealf64x F
+GLIBC_2.36 creall F
+GLIBC_2.36 csin F
+GLIBC_2.36 csinf F
+GLIBC_2.36 csinf128 F
+GLIBC_2.36 csinf32 F
+GLIBC_2.36 csinf32x F
+GLIBC_2.36 csinf64 F
+GLIBC_2.36 csinf64x F
+GLIBC_2.36 csinh F
+GLIBC_2.36 csinhf F
+GLIBC_2.36 csinhf128 F
+GLIBC_2.36 csinhf32 F
+GLIBC_2.36 csinhf32x F
+GLIBC_2.36 csinhf64 F
+GLIBC_2.36 csinhf64x F
+GLIBC_2.36 csinhl F
+GLIBC_2.36 csinl F
+GLIBC_2.36 csqrt F
+GLIBC_2.36 csqrtf F
+GLIBC_2.36 csqrtf128 F
+GLIBC_2.36 csqrtf32 F
+GLIBC_2.36 csqrtf32x F
+GLIBC_2.36 csqrtf64 F
+GLIBC_2.36 csqrtf64x F
+GLIBC_2.36 csqrtl F
+GLIBC_2.36 ctan F
+GLIBC_2.36 ctanf F
+GLIBC_2.36 ctanf128 F
+GLIBC_2.36 ctanf32 F
+GLIBC_2.36 ctanf32x F
+GLIBC_2.36 ctanf64 F
+GLIBC_2.36 ctanf64x F
+GLIBC_2.36 ctanh F
+GLIBC_2.36 ctanhf F
+GLIBC_2.36 ctanhf128 F
+GLIBC_2.36 ctanhf32 F
+GLIBC_2.36 ctanhf32x F
+GLIBC_2.36 ctanhf64 F
+GLIBC_2.36 ctanhf64x F
+GLIBC_2.36 ctanhl F
+GLIBC_2.36 ctanl F
+GLIBC_2.36 daddl F
+GLIBC_2.36 ddivl F
+GLIBC_2.36 dfmal F
+GLIBC_2.36 dmull F
+GLIBC_2.36 drem F
+GLIBC_2.36 dremf F
+GLIBC_2.36 dreml F
+GLIBC_2.36 dsqrtl F
+GLIBC_2.36 dsubl F
+GLIBC_2.36 erf F
+GLIBC_2.36 erfc F
+GLIBC_2.36 erfcf F
+GLIBC_2.36 erfcf128 F
+GLIBC_2.36 erfcf32 F
+GLIBC_2.36 erfcf32x F
+GLIBC_2.36 erfcf64 F
+GLIBC_2.36 erfcf64x F
+GLIBC_2.36 erfcl F
+GLIBC_2.36 erff F
+GLIBC_2.36 erff128 F
+GLIBC_2.36 erff32 F
+GLIBC_2.36 erff32x F
+GLIBC_2.36 erff64 F
+GLIBC_2.36 erff64x F
+GLIBC_2.36 erfl F
+GLIBC_2.36 exp F
+GLIBC_2.36 exp10 F
+GLIBC_2.36 exp10f F
+GLIBC_2.36 exp10f128 F
+GLIBC_2.36 exp10f32 F
+GLIBC_2.36 exp10f32x F
+GLIBC_2.36 exp10f64 F
+GLIBC_2.36 exp10f64x F
+GLIBC_2.36 exp10l F
+GLIBC_2.36 exp2 F
+GLIBC_2.36 exp2f F
+GLIBC_2.36 exp2f128 F
+GLIBC_2.36 exp2f32 F
+GLIBC_2.36 exp2f32x F
+GLIBC_2.36 exp2f64 F
+GLIBC_2.36 exp2f64x F
+GLIBC_2.36 exp2l F
+GLIBC_2.36 expf F
+GLIBC_2.36 expf128 F
+GLIBC_2.36 expf32 F
+GLIBC_2.36 expf32x F
+GLIBC_2.36 expf64 F
+GLIBC_2.36 expf64x F
+GLIBC_2.36 expl F
+GLIBC_2.36 expm1 F
+GLIBC_2.36 expm1f F
+GLIBC_2.36 expm1f128 F
+GLIBC_2.36 expm1f32 F
+GLIBC_2.36 expm1f32x F
+GLIBC_2.36 expm1f64 F
+GLIBC_2.36 expm1f64x F
+GLIBC_2.36 expm1l F
+GLIBC_2.36 f32addf128 F
+GLIBC_2.36 f32addf32x F
+GLIBC_2.36 f32addf64 F
+GLIBC_2.36 f32addf64x F
+GLIBC_2.36 f32divf128 F
+GLIBC_2.36 f32divf32x F
+GLIBC_2.36 f32divf64 F
+GLIBC_2.36 f32divf64x F
+GLIBC_2.36 f32fmaf128 F
+GLIBC_2.36 f32fmaf32x F
+GLIBC_2.36 f32fmaf64 F
+GLIBC_2.36 f32fmaf64x F
+GLIBC_2.36 f32mulf128 F
+GLIBC_2.36 f32mulf32x F
+GLIBC_2.36 f32mulf64 F
+GLIBC_2.36 f32mulf64x F
+GLIBC_2.36 f32sqrtf128 F
+GLIBC_2.36 f32sqrtf32x F
+GLIBC_2.36 f32sqrtf64 F
+GLIBC_2.36 f32sqrtf64x F
+GLIBC_2.36 f32subf128 F
+GLIBC_2.36 f32subf32x F
+GLIBC_2.36 f32subf64 F
+GLIBC_2.36 f32subf64x F
+GLIBC_2.36 f32xaddf128 F
+GLIBC_2.36 f32xaddf64 F
+GLIBC_2.36 f32xaddf64x F
+GLIBC_2.36 f32xdivf128 F
+GLIBC_2.36 f32xdivf64 F
+GLIBC_2.36 f32xdivf64x F
+GLIBC_2.36 f32xfmaf128 F
+GLIBC_2.36 f32xfmaf64 F
+GLIBC_2.36 f32xfmaf64x F
+GLIBC_2.36 f32xmulf128 F
+GLIBC_2.36 f32xmulf64 F
+GLIBC_2.36 f32xmulf64x F
+GLIBC_2.36 f32xsqrtf128 F
+GLIBC_2.36 f32xsqrtf64 F
+GLIBC_2.36 f32xsqrtf64x F
+GLIBC_2.36 f32xsubf128 F
+GLIBC_2.36 f32xsubf64 F
+GLIBC_2.36 f32xsubf64x F
+GLIBC_2.36 f64addf128 F
+GLIBC_2.36 f64addf64x F
+GLIBC_2.36 f64divf128 F
+GLIBC_2.36 f64divf64x F
+GLIBC_2.36 f64fmaf128 F
+GLIBC_2.36 f64fmaf64x F
+GLIBC_2.36 f64mulf128 F
+GLIBC_2.36 f64mulf64x F
+GLIBC_2.36 f64sqrtf128 F
+GLIBC_2.36 f64sqrtf64x F
+GLIBC_2.36 f64subf128 F
+GLIBC_2.36 f64subf64x F
+GLIBC_2.36 f64xaddf128 F
+GLIBC_2.36 f64xdivf128 F
+GLIBC_2.36 f64xfmaf128 F
+GLIBC_2.36 f64xmulf128 F
+GLIBC_2.36 f64xsqrtf128 F
+GLIBC_2.36 f64xsubf128 F
+GLIBC_2.36 fabs F
+GLIBC_2.36 fabsf F
+GLIBC_2.36 fabsf128 F
+GLIBC_2.36 fabsf32 F
+GLIBC_2.36 fabsf32x F
+GLIBC_2.36 fabsf64 F
+GLIBC_2.36 fabsf64x F
+GLIBC_2.36 fabsl F
+GLIBC_2.36 fadd F
+GLIBC_2.36 faddl F
+GLIBC_2.36 fdim F
+GLIBC_2.36 fdimf F
+GLIBC_2.36 fdimf128 F
+GLIBC_2.36 fdimf32 F
+GLIBC_2.36 fdimf32x F
+GLIBC_2.36 fdimf64 F
+GLIBC_2.36 fdimf64x F
+GLIBC_2.36 fdiml F
+GLIBC_2.36 fdiv F
+GLIBC_2.36 fdivl F
+GLIBC_2.36 feclearexcept F
+GLIBC_2.36 fedisableexcept F
+GLIBC_2.36 feenableexcept F
+GLIBC_2.36 fegetenv F
+GLIBC_2.36 fegetexcept F
+GLIBC_2.36 fegetexceptflag F
+GLIBC_2.36 fegetmode F
+GLIBC_2.36 fegetround F
+GLIBC_2.36 feholdexcept F
+GLIBC_2.36 feraiseexcept F
+GLIBC_2.36 fesetenv F
+GLIBC_2.36 fesetexcept F
+GLIBC_2.36 fesetexceptflag F
+GLIBC_2.36 fesetmode F
+GLIBC_2.36 fesetround F
+GLIBC_2.36 fetestexcept F
+GLIBC_2.36 fetestexceptflag F
+GLIBC_2.36 feupdateenv F
+GLIBC_2.36 ffma F
+GLIBC_2.36 ffmal F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 floor F
+GLIBC_2.36 floorf F
+GLIBC_2.36 floorf128 F
+GLIBC_2.36 floorf32 F
+GLIBC_2.36 floorf32x F
+GLIBC_2.36 floorf64 F
+GLIBC_2.36 floorf64x F
+GLIBC_2.36 floorl F
+GLIBC_2.36 fma F
+GLIBC_2.36 fmaf F
+GLIBC_2.36 fmaf128 F
+GLIBC_2.36 fmaf32 F
+GLIBC_2.36 fmaf32x F
+GLIBC_2.36 fmaf64 F
+GLIBC_2.36 fmaf64x F
+GLIBC_2.36 fmal F
+GLIBC_2.36 fmax F
+GLIBC_2.36 fmaxf F
+GLIBC_2.36 fmaxf128 F
+GLIBC_2.36 fmaxf32 F
+GLIBC_2.36 fmaxf32x F
+GLIBC_2.36 fmaxf64 F
+GLIBC_2.36 fmaxf64x F
+GLIBC_2.36 fmaximum F
+GLIBC_2.36 fmaximum_mag F
+GLIBC_2.36 fmaximum_mag_num F
+GLIBC_2.36 fmaximum_mag_numf F
+GLIBC_2.36 fmaximum_mag_numf128 F
+GLIBC_2.36 fmaximum_mag_numf32 F
+GLIBC_2.36 fmaximum_mag_numf32x F
+GLIBC_2.36 fmaximum_mag_numf64 F
+GLIBC_2.36 fmaximum_mag_numf64x F
+GLIBC_2.36 fmaximum_mag_numl F
+GLIBC_2.36 fmaximum_magf F
+GLIBC_2.36 fmaximum_magf128 F
+GLIBC_2.36 fmaximum_magf32 F
+GLIBC_2.36 fmaximum_magf32x F
+GLIBC_2.36 fmaximum_magf64 F
+GLIBC_2.36 fmaximum_magf64x F
+GLIBC_2.36 fmaximum_magl F
+GLIBC_2.36 fmaximum_num F
+GLIBC_2.36 fmaximum_numf F
+GLIBC_2.36 fmaximum_numf128 F
+GLIBC_2.36 fmaximum_numf32 F
+GLIBC_2.36 fmaximum_numf32x F
+GLIBC_2.36 fmaximum_numf64 F
+GLIBC_2.36 fmaximum_numf64x F
+GLIBC_2.36 fmaximum_numl F
+GLIBC_2.36 fmaximumf F
+GLIBC_2.36 fmaximumf128 F
+GLIBC_2.36 fmaximumf32 F
+GLIBC_2.36 fmaximumf32x F
+GLIBC_2.36 fmaximumf64 F
+GLIBC_2.36 fmaximumf64x F
+GLIBC_2.36 fmaximuml F
+GLIBC_2.36 fmaxl F
+GLIBC_2.36 fmaxmag F
+GLIBC_2.36 fmaxmagf F
+GLIBC_2.36 fmaxmagf128 F
+GLIBC_2.36 fmaxmagf32 F
+GLIBC_2.36 fmaxmagf32x F
+GLIBC_2.36 fmaxmagf64 F
+GLIBC_2.36 fmaxmagf64x F
+GLIBC_2.36 fmaxmagl F
+GLIBC_2.36 fmin F
+GLIBC_2.36 fminf F
+GLIBC_2.36 fminf128 F
+GLIBC_2.36 fminf32 F
+GLIBC_2.36 fminf32x F
+GLIBC_2.36 fminf64 F
+GLIBC_2.36 fminf64x F
+GLIBC_2.36 fminimum F
+GLIBC_2.36 fminimum_mag F
+GLIBC_2.36 fminimum_mag_num F
+GLIBC_2.36 fminimum_mag_numf F
+GLIBC_2.36 fminimum_mag_numf128 F
+GLIBC_2.36 fminimum_mag_numf32 F
+GLIBC_2.36 fminimum_mag_numf32x F
+GLIBC_2.36 fminimum_mag_numf64 F
+GLIBC_2.36 fminimum_mag_numf64x F
+GLIBC_2.36 fminimum_mag_numl F
+GLIBC_2.36 fminimum_magf F
+GLIBC_2.36 fminimum_magf128 F
+GLIBC_2.36 fminimum_magf32 F
+GLIBC_2.36 fminimum_magf32x F
+GLIBC_2.36 fminimum_magf64 F
+GLIBC_2.36 fminimum_magf64x F
+GLIBC_2.36 fminimum_magl F
+GLIBC_2.36 fminimum_num F
+GLIBC_2.36 fminimum_numf F
+GLIBC_2.36 fminimum_numf128 F
+GLIBC_2.36 fminimum_numf32 F
+GLIBC_2.36 fminimum_numf32x F
+GLIBC_2.36 fminimum_numf64 F
+GLIBC_2.36 fminimum_numf64x F
+GLIBC_2.36 fminimum_numl F
+GLIBC_2.36 fminimumf F
+GLIBC_2.36 fminimumf128 F
+GLIBC_2.36 fminimumf32 F
+GLIBC_2.36 fminimumf32x F
+GLIBC_2.36 fminimumf64 F
+GLIBC_2.36 fminimumf64x F
+GLIBC_2.36 fminimuml F
+GLIBC_2.36 fminl F
+GLIBC_2.36 fminmag F
+GLIBC_2.36 fminmagf F
+GLIBC_2.36 fminmagf128 F
+GLIBC_2.36 fminmagf32 F
+GLIBC_2.36 fminmagf32x F
+GLIBC_2.36 fminmagf64 F
+GLIBC_2.36 fminmagf64x F
+GLIBC_2.36 fminmagl F
+GLIBC_2.36 fmod F
+GLIBC_2.36 fmodf F
+GLIBC_2.36 fmodf128 F
+GLIBC_2.36 fmodf32 F
+GLIBC_2.36 fmodf32x F
+GLIBC_2.36 fmodf64 F
+GLIBC_2.36 fmodf64x F
+GLIBC_2.36 fmodl F
+GLIBC_2.36 fmul F
+GLIBC_2.36 fmull F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpf128 F
+GLIBC_2.36 frexpf32 F
+GLIBC_2.36 frexpf32x F
+GLIBC_2.36 frexpf64 F
+GLIBC_2.36 frexpf64x F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fromfp F
+GLIBC_2.36 fromfpf F
+GLIBC_2.36 fromfpf128 F
+GLIBC_2.36 fromfpf32 F
+GLIBC_2.36 fromfpf32x F
+GLIBC_2.36 fromfpf64 F
+GLIBC_2.36 fromfpf64x F
+GLIBC_2.36 fromfpl F
+GLIBC_2.36 fromfpx F
+GLIBC_2.36 fromfpxf F
+GLIBC_2.36 fromfpxf128 F
+GLIBC_2.36 fromfpxf32 F
+GLIBC_2.36 fromfpxf32x F
+GLIBC_2.36 fromfpxf64 F
+GLIBC_2.36 fromfpxf64x F
+GLIBC_2.36 fromfpxl F
+GLIBC_2.36 fsqrt F
+GLIBC_2.36 fsqrtl F
+GLIBC_2.36 fsub F
+GLIBC_2.36 fsubl F
+GLIBC_2.36 gamma F
+GLIBC_2.36 gammaf F
+GLIBC_2.36 gammal F
+GLIBC_2.36 getpayload F
+GLIBC_2.36 getpayloadf F
+GLIBC_2.36 getpayloadf128 F
+GLIBC_2.36 getpayloadf32 F
+GLIBC_2.36 getpayloadf32x F
+GLIBC_2.36 getpayloadf64 F
+GLIBC_2.36 getpayloadf64x F
+GLIBC_2.36 getpayloadl F
+GLIBC_2.36 hypot F
+GLIBC_2.36 hypotf F
+GLIBC_2.36 hypotf128 F
+GLIBC_2.36 hypotf32 F
+GLIBC_2.36 hypotf32x F
+GLIBC_2.36 hypotf64 F
+GLIBC_2.36 hypotf64x F
+GLIBC_2.36 hypotl F
+GLIBC_2.36 ilogb F
+GLIBC_2.36 ilogbf F
+GLIBC_2.36 ilogbf128 F
+GLIBC_2.36 ilogbf32 F
+GLIBC_2.36 ilogbf32x F
+GLIBC_2.36 ilogbf64 F
+GLIBC_2.36 ilogbf64x F
+GLIBC_2.36 ilogbl F
+GLIBC_2.36 j0 F
+GLIBC_2.36 j0f F
+GLIBC_2.36 j0f128 F
+GLIBC_2.36 j0f32 F
+GLIBC_2.36 j0f32x F
+GLIBC_2.36 j0f64 F
+GLIBC_2.36 j0f64x F
+GLIBC_2.36 j0l F
+GLIBC_2.36 j1 F
+GLIBC_2.36 j1f F
+GLIBC_2.36 j1f128 F
+GLIBC_2.36 j1f32 F
+GLIBC_2.36 j1f32x F
+GLIBC_2.36 j1f64 F
+GLIBC_2.36 j1f64x F
+GLIBC_2.36 j1l F
+GLIBC_2.36 jn F
+GLIBC_2.36 jnf F
+GLIBC_2.36 jnf128 F
+GLIBC_2.36 jnf32 F
+GLIBC_2.36 jnf32x F
+GLIBC_2.36 jnf64 F
+GLIBC_2.36 jnf64x F
+GLIBC_2.36 jnl F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpf128 F
+GLIBC_2.36 ldexpf32 F
+GLIBC_2.36 ldexpf32x F
+GLIBC_2.36 ldexpf64 F
+GLIBC_2.36 ldexpf64x F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 lgamma F
+GLIBC_2.36 lgamma_r F
+GLIBC_2.36 lgammaf F
+GLIBC_2.36 lgammaf128 F
+GLIBC_2.36 lgammaf128_r F
+GLIBC_2.36 lgammaf32 F
+GLIBC_2.36 lgammaf32_r F
+GLIBC_2.36 lgammaf32x F
+GLIBC_2.36 lgammaf32x_r F
+GLIBC_2.36 lgammaf64 F
+GLIBC_2.36 lgammaf64_r F
+GLIBC_2.36 lgammaf64x F
+GLIBC_2.36 lgammaf64x_r F
+GLIBC_2.36 lgammaf_r F
+GLIBC_2.36 lgammal F
+GLIBC_2.36 lgammal_r F
+GLIBC_2.36 llogb F
+GLIBC_2.36 llogbf F
+GLIBC_2.36 llogbf128 F
+GLIBC_2.36 llogbf32 F
+GLIBC_2.36 llogbf32x F
+GLIBC_2.36 llogbf64 F
+GLIBC_2.36 llogbf64x F
+GLIBC_2.36 llogbl F
+GLIBC_2.36 llrint F
+GLIBC_2.36 llrintf F
+GLIBC_2.36 llrintf128 F
+GLIBC_2.36 llrintf32 F
+GLIBC_2.36 llrintf32x F
+GLIBC_2.36 llrintf64 F
+GLIBC_2.36 llrintf64x F
+GLIBC_2.36 llrintl F
+GLIBC_2.36 llround F
+GLIBC_2.36 llroundf F
+GLIBC_2.36 llroundf128 F
+GLIBC_2.36 llroundf32 F
+GLIBC_2.36 llroundf32x F
+GLIBC_2.36 llroundf64 F
+GLIBC_2.36 llroundf64x F
+GLIBC_2.36 llroundl F
+GLIBC_2.36 log F
+GLIBC_2.36 log10 F
+GLIBC_2.36 log10f F
+GLIBC_2.36 log10f128 F
+GLIBC_2.36 log10f32 F
+GLIBC_2.36 log10f32x F
+GLIBC_2.36 log10f64 F
+GLIBC_2.36 log10f64x F
+GLIBC_2.36 log10l F
+GLIBC_2.36 log1p F
+GLIBC_2.36 log1pf F
+GLIBC_2.36 log1pf128 F
+GLIBC_2.36 log1pf32 F
+GLIBC_2.36 log1pf32x F
+GLIBC_2.36 log1pf64 F
+GLIBC_2.36 log1pf64x F
+GLIBC_2.36 log1pl F
+GLIBC_2.36 log2 F
+GLIBC_2.36 log2f F
+GLIBC_2.36 log2f128 F
+GLIBC_2.36 log2f32 F
+GLIBC_2.36 log2f32x F
+GLIBC_2.36 log2f64 F
+GLIBC_2.36 log2f64x F
+GLIBC_2.36 log2l F
+GLIBC_2.36 logb F
+GLIBC_2.36 logbf F
+GLIBC_2.36 logbf128 F
+GLIBC_2.36 logbf32 F
+GLIBC_2.36 logbf32x F
+GLIBC_2.36 logbf64 F
+GLIBC_2.36 logbf64x F
+GLIBC_2.36 logbl F
+GLIBC_2.36 logf F
+GLIBC_2.36 logf128 F
+GLIBC_2.36 logf32 F
+GLIBC_2.36 logf32x F
+GLIBC_2.36 logf64 F
+GLIBC_2.36 logf64x F
+GLIBC_2.36 logl F
+GLIBC_2.36 lrint F
+GLIBC_2.36 lrintf F
+GLIBC_2.36 lrintf128 F
+GLIBC_2.36 lrintf32 F
+GLIBC_2.36 lrintf32x F
+GLIBC_2.36 lrintf64 F
+GLIBC_2.36 lrintf64x F
+GLIBC_2.36 lrintl F
+GLIBC_2.36 lround F
+GLIBC_2.36 lroundf F
+GLIBC_2.36 lroundf128 F
+GLIBC_2.36 lroundf32 F
+GLIBC_2.36 lroundf32x F
+GLIBC_2.36 lroundf64 F
+GLIBC_2.36 lroundf64x F
+GLIBC_2.36 lroundl F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modff128 F
+GLIBC_2.36 modff32 F
+GLIBC_2.36 modff32x F
+GLIBC_2.36 modff64 F
+GLIBC_2.36 modff64x F
+GLIBC_2.36 modfl F
+GLIBC_2.36 nan F
+GLIBC_2.36 nanf F
+GLIBC_2.36 nanf128 F
+GLIBC_2.36 nanf32 F
+GLIBC_2.36 nanf32x F
+GLIBC_2.36 nanf64 F
+GLIBC_2.36 nanf64x F
+GLIBC_2.36 nanl F
+GLIBC_2.36 nearbyint F
+GLIBC_2.36 nearbyintf F
+GLIBC_2.36 nearbyintf128 F
+GLIBC_2.36 nearbyintf32 F
+GLIBC_2.36 nearbyintf32x F
+GLIBC_2.36 nearbyintf64 F
+GLIBC_2.36 nearbyintf64x F
+GLIBC_2.36 nearbyintl F
+GLIBC_2.36 nextafter F
+GLIBC_2.36 nextafterf F
+GLIBC_2.36 nextafterf128 F
+GLIBC_2.36 nextafterf32 F
+GLIBC_2.36 nextafterf32x F
+GLIBC_2.36 nextafterf64 F
+GLIBC_2.36 nextafterf64x F
+GLIBC_2.36 nextafterl F
+GLIBC_2.36 nextdown F
+GLIBC_2.36 nextdownf F
+GLIBC_2.36 nextdownf128 F
+GLIBC_2.36 nextdownf32 F
+GLIBC_2.36 nextdownf32x F
+GLIBC_2.36 nextdownf64 F
+GLIBC_2.36 nextdownf64x F
+GLIBC_2.36 nextdownl F
+GLIBC_2.36 nexttoward F
+GLIBC_2.36 nexttowardf F
+GLIBC_2.36 nexttowardl F
+GLIBC_2.36 nextup F
+GLIBC_2.36 nextupf F
+GLIBC_2.36 nextupf128 F
+GLIBC_2.36 nextupf32 F
+GLIBC_2.36 nextupf32x F
+GLIBC_2.36 nextupf64 F
+GLIBC_2.36 nextupf64x F
+GLIBC_2.36 nextupl F
+GLIBC_2.36 pow F
+GLIBC_2.36 powf F
+GLIBC_2.36 powf128 F
+GLIBC_2.36 powf32 F
+GLIBC_2.36 powf32x F
+GLIBC_2.36 powf64 F
+GLIBC_2.36 powf64x F
+GLIBC_2.36 powl F
+GLIBC_2.36 remainder F
+GLIBC_2.36 remainderf F
+GLIBC_2.36 remainderf128 F
+GLIBC_2.36 remainderf32 F
+GLIBC_2.36 remainderf32x F
+GLIBC_2.36 remainderf64 F
+GLIBC_2.36 remainderf64x F
+GLIBC_2.36 remainderl F
+GLIBC_2.36 remquo F
+GLIBC_2.36 remquof F
+GLIBC_2.36 remquof128 F
+GLIBC_2.36 remquof32 F
+GLIBC_2.36 remquof32x F
+GLIBC_2.36 remquof64 F
+GLIBC_2.36 remquof64x F
+GLIBC_2.36 remquol F
+GLIBC_2.36 rint F
+GLIBC_2.36 rintf F
+GLIBC_2.36 rintf128 F
+GLIBC_2.36 rintf32 F
+GLIBC_2.36 rintf32x F
+GLIBC_2.36 rintf64 F
+GLIBC_2.36 rintf64x F
+GLIBC_2.36 rintl F
+GLIBC_2.36 round F
+GLIBC_2.36 roundeven F
+GLIBC_2.36 roundevenf F
+GLIBC_2.36 roundevenf128 F
+GLIBC_2.36 roundevenf32 F
+GLIBC_2.36 roundevenf32x F
+GLIBC_2.36 roundevenf64 F
+GLIBC_2.36 roundevenf64x F
+GLIBC_2.36 roundevenl F
+GLIBC_2.36 roundf F
+GLIBC_2.36 roundf128 F
+GLIBC_2.36 roundf32 F
+GLIBC_2.36 roundf32x F
+GLIBC_2.36 roundf64 F
+GLIBC_2.36 roundf64x F
+GLIBC_2.36 roundl F
+GLIBC_2.36 scalb F
+GLIBC_2.36 scalbf F
+GLIBC_2.36 scalbl F
+GLIBC_2.36 scalbln F
+GLIBC_2.36 scalblnf F
+GLIBC_2.36 scalblnf128 F
+GLIBC_2.36 scalblnf32 F
+GLIBC_2.36 scalblnf32x F
+GLIBC_2.36 scalblnf64 F
+GLIBC_2.36 scalblnf64x F
+GLIBC_2.36 scalblnl F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnf128 F
+GLIBC_2.36 scalbnf32 F
+GLIBC_2.36 scalbnf32x F
+GLIBC_2.36 scalbnf64 F
+GLIBC_2.36 scalbnf64x F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 setpayload F
+GLIBC_2.36 setpayloadf F
+GLIBC_2.36 setpayloadf128 F
+GLIBC_2.36 setpayloadf32 F
+GLIBC_2.36 setpayloadf32x F
+GLIBC_2.36 setpayloadf64 F
+GLIBC_2.36 setpayloadf64x F
+GLIBC_2.36 setpayloadl F
+GLIBC_2.36 setpayloadsig F
+GLIBC_2.36 setpayloadsigf F
+GLIBC_2.36 setpayloadsigf128 F
+GLIBC_2.36 setpayloadsigf32 F
+GLIBC_2.36 setpayloadsigf32x F
+GLIBC_2.36 setpayloadsigf64 F
+GLIBC_2.36 setpayloadsigf64x F
+GLIBC_2.36 setpayloadsigl F
+GLIBC_2.36 signgam D 0x4
+GLIBC_2.36 significand F
+GLIBC_2.36 significandf F
+GLIBC_2.36 significandl F
+GLIBC_2.36 sin F
+GLIBC_2.36 sincos F
+GLIBC_2.36 sincosf F
+GLIBC_2.36 sincosf128 F
+GLIBC_2.36 sincosf32 F
+GLIBC_2.36 sincosf32x F
+GLIBC_2.36 sincosf64 F
+GLIBC_2.36 sincosf64x F
+GLIBC_2.36 sincosl F
+GLIBC_2.36 sinf F
+GLIBC_2.36 sinf128 F
+GLIBC_2.36 sinf32 F
+GLIBC_2.36 sinf32x F
+GLIBC_2.36 sinf64 F
+GLIBC_2.36 sinf64x F
+GLIBC_2.36 sinh F
+GLIBC_2.36 sinhf F
+GLIBC_2.36 sinhf128 F
+GLIBC_2.36 sinhf32 F
+GLIBC_2.36 sinhf32x F
+GLIBC_2.36 sinhf64 F
+GLIBC_2.36 sinhf64x F
+GLIBC_2.36 sinhl F
+GLIBC_2.36 sinl F
+GLIBC_2.36 sqrt F
+GLIBC_2.36 sqrtf F
+GLIBC_2.36 sqrtf128 F
+GLIBC_2.36 sqrtf32 F
+GLIBC_2.36 sqrtf32x F
+GLIBC_2.36 sqrtf64 F
+GLIBC_2.36 sqrtf64x F
+GLIBC_2.36 sqrtl F
+GLIBC_2.36 tan F
+GLIBC_2.36 tanf F
+GLIBC_2.36 tanf128 F
+GLIBC_2.36 tanf32 F
+GLIBC_2.36 tanf32x F
+GLIBC_2.36 tanf64 F
+GLIBC_2.36 tanf64x F
+GLIBC_2.36 tanh F
+GLIBC_2.36 tanhf F
+GLIBC_2.36 tanhf128 F
+GLIBC_2.36 tanhf32 F
+GLIBC_2.36 tanhf32x F
+GLIBC_2.36 tanhf64 F
+GLIBC_2.36 tanhf64x F
+GLIBC_2.36 tanhl F
+GLIBC_2.36 tanl F
+GLIBC_2.36 tgamma F
+GLIBC_2.36 tgammaf F
+GLIBC_2.36 tgammaf128 F
+GLIBC_2.36 tgammaf32 F
+GLIBC_2.36 tgammaf32x F
+GLIBC_2.36 tgammaf64 F
+GLIBC_2.36 tgammaf64x F
+GLIBC_2.36 tgammal F
+GLIBC_2.36 totalorder F
+GLIBC_2.36 totalorderf F
+GLIBC_2.36 totalorderf128 F
+GLIBC_2.36 totalorderf32 F
+GLIBC_2.36 totalorderf32x F
+GLIBC_2.36 totalorderf64 F
+GLIBC_2.36 totalorderf64x F
+GLIBC_2.36 totalorderl F
+GLIBC_2.36 totalordermag F
+GLIBC_2.36 totalordermagf F
+GLIBC_2.36 totalordermagf128 F
+GLIBC_2.36 totalordermagf32 F
+GLIBC_2.36 totalordermagf32x F
+GLIBC_2.36 totalordermagf64 F
+GLIBC_2.36 totalordermagf64x F
+GLIBC_2.36 totalordermagl F
+GLIBC_2.36 trunc F
+GLIBC_2.36 truncf F
+GLIBC_2.36 truncf128 F
+GLIBC_2.36 truncf32 F
+GLIBC_2.36 truncf32x F
+GLIBC_2.36 truncf64 F
+GLIBC_2.36 truncf64x F
+GLIBC_2.36 truncl F
+GLIBC_2.36 ufromfp F
+GLIBC_2.36 ufromfpf F
+GLIBC_2.36 ufromfpf128 F
+GLIBC_2.36 ufromfpf32 F
+GLIBC_2.36 ufromfpf32x F
+GLIBC_2.36 ufromfpf64 F
+GLIBC_2.36 ufromfpf64x F
+GLIBC_2.36 ufromfpl F
+GLIBC_2.36 ufromfpx F
+GLIBC_2.36 ufromfpxf F
+GLIBC_2.36 ufromfpxf128 F
+GLIBC_2.36 ufromfpxf32 F
+GLIBC_2.36 ufromfpxf32x F
+GLIBC_2.36 ufromfpxf64 F
+GLIBC_2.36 ufromfpxf64x F
+GLIBC_2.36 ufromfpxl F
+GLIBC_2.36 y0 F
+GLIBC_2.36 y0f F
+GLIBC_2.36 y0f128 F
+GLIBC_2.36 y0f32 F
+GLIBC_2.36 y0f32x F
+GLIBC_2.36 y0f64 F
+GLIBC_2.36 y0f64x F
+GLIBC_2.36 y0l F
+GLIBC_2.36 y1 F
+GLIBC_2.36 y1f F
+GLIBC_2.36 y1f128 F
+GLIBC_2.36 y1f32 F
+GLIBC_2.36 y1f32x F
+GLIBC_2.36 y1f64 F
+GLIBC_2.36 y1f64x F
+GLIBC_2.36 y1l F
+GLIBC_2.36 yn F
+GLIBC_2.36 ynf F
+GLIBC_2.36 ynf128 F
+GLIBC_2.36 ynf32 F
+GLIBC_2.36 ynf32x F
+GLIBC_2.36 ynf64 F
+GLIBC_2.36 ynf64x F
+GLIBC_2.36 ynl F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
new file mode 100644
index 0000000000..c30f54c0bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
@@ -0,0 +1,55 @@
+GLIBC_2.36 __b64_ntop F
+GLIBC_2.36 __b64_pton F
+GLIBC_2.36 __dn_count_labels F
+GLIBC_2.36 __fp_nquery F
+GLIBC_2.36 __fp_query F
+GLIBC_2.36 __fp_resstat F
+GLIBC_2.36 __hostalias F
+GLIBC_2.36 __loc_aton F
+GLIBC_2.36 __loc_ntoa F
+GLIBC_2.36 __p_cdname F
+GLIBC_2.36 __p_cdnname F
+GLIBC_2.36 __p_class F
+GLIBC_2.36 __p_class_syms D 0xa8
+GLIBC_2.36 __p_fqname F
+GLIBC_2.36 __p_fqnname F
+GLIBC_2.36 __p_option F
+GLIBC_2.36 __p_query F
+GLIBC_2.36 __p_rcode F
+GLIBC_2.36 __p_time F
+GLIBC_2.36 __p_type F
+GLIBC_2.36 __p_type_syms D 0x450
+GLIBC_2.36 __putlong F
+GLIBC_2.36 __putshort F
+GLIBC_2.36 __res_close F
+GLIBC_2.36 __res_hostalias F
+GLIBC_2.36 __res_isourserver F
+GLIBC_2.36 __res_nameinquery F
+GLIBC_2.36 __res_queriesmatch F
+GLIBC_2.36 __sym_ntop F
+GLIBC_2.36 __sym_ntos F
+GLIBC_2.36 __sym_ston F
+GLIBC_2.36 _getlong F
+GLIBC_2.36 _getshort F
+GLIBC_2.36 inet_net_ntop F
+GLIBC_2.36 inet_net_pton F
+GLIBC_2.36 inet_neta F
+GLIBC_2.36 ns_datetosecs F
+GLIBC_2.36 ns_format_ttl F
+GLIBC_2.36 ns_get16 F
+GLIBC_2.36 ns_get32 F
+GLIBC_2.36 ns_initparse F
+GLIBC_2.36 ns_makecanon F
+GLIBC_2.36 ns_msg_getflag F
+GLIBC_2.36 ns_name_ntol F
+GLIBC_2.36 ns_name_rollback F
+GLIBC_2.36 ns_parse_ttl F
+GLIBC_2.36 ns_parserr F
+GLIBC_2.36 ns_put16 F
+GLIBC_2.36 ns_put32 F
+GLIBC_2.36 ns_samedomain F
+GLIBC_2.36 ns_samename F
+GLIBC_2.36 ns_skiprr F
+GLIBC_2.36 ns_sprintrr F
+GLIBC_2.36 ns_sprintrrf F
+GLIBC_2.36 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
new file mode 100644
index 0000000000..8658803d38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
@@ -0,0 +1,40 @@
+GLIBC_2.36 td_init F
+GLIBC_2.36 td_log F
+GLIBC_2.36 td_symbol_list F
+GLIBC_2.36 td_ta_clear_event F
+GLIBC_2.36 td_ta_delete F
+GLIBC_2.36 td_ta_enable_stats F
+GLIBC_2.36 td_ta_event_addr F
+GLIBC_2.36 td_ta_event_getmsg F
+GLIBC_2.36 td_ta_get_nthreads F
+GLIBC_2.36 td_ta_get_ph F
+GLIBC_2.36 td_ta_get_stats F
+GLIBC_2.36 td_ta_map_id2thr F
+GLIBC_2.36 td_ta_map_lwp2thr F
+GLIBC_2.36 td_ta_new F
+GLIBC_2.36 td_ta_reset_stats F
+GLIBC_2.36 td_ta_set_event F
+GLIBC_2.36 td_ta_setconcurrency F
+GLIBC_2.36 td_ta_thr_iter F
+GLIBC_2.36 td_ta_tsd_iter F
+GLIBC_2.36 td_thr_clear_event F
+GLIBC_2.36 td_thr_dbresume F
+GLIBC_2.36 td_thr_dbsuspend F
+GLIBC_2.36 td_thr_event_enable F
+GLIBC_2.36 td_thr_event_getmsg F
+GLIBC_2.36 td_thr_get_info F
+GLIBC_2.36 td_thr_getfpregs F
+GLIBC_2.36 td_thr_getgregs F
+GLIBC_2.36 td_thr_getxregs F
+GLIBC_2.36 td_thr_getxregsize F
+GLIBC_2.36 td_thr_set_event F
+GLIBC_2.36 td_thr_setfpregs F
+GLIBC_2.36 td_thr_setgregs F
+GLIBC_2.36 td_thr_setprio F
+GLIBC_2.36 td_thr_setsigpending F
+GLIBC_2.36 td_thr_setxregs F
+GLIBC_2.36 td_thr_sigsetmask F
+GLIBC_2.36 td_thr_tls_get_addr F
+GLIBC_2.36 td_thr_tlsbase F
+GLIBC_2.36 td_thr_tsd F
+GLIBC_2.36 td_thr_validate F
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
@ 2022-05-09  7:56   ` Fangrui Song
  2022-05-24  9:49     ` 回复: " caiyinyu
  2022-05-09  8:20   ` Fangrui Song
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 20+ messages in thread
From: Fangrui Song @ 2022-05-09  7:56 UTC (permalink / raw)
  To: caiyinyu; +Cc: libc-alpha, xuchenghua, joseph_myers

On 2022-05-09, caiyinyu wrote:
>---
> sysdeps/loongarch/__longjmp.S                |  52 +++
> sysdeps/loongarch/bits/endianness.h          |  11 +
> sysdeps/loongarch/bits/link.h                |  58 +++
> sysdeps/loongarch/bits/setjmp.h              |  42 +++
> sysdeps/loongarch/bsd-_setjmp.c              |   1 +
> sysdeps/loongarch/bsd-setjmp.c               |   1 +
> sysdeps/loongarch/dl-machine.h               | 362 +++++++++++++++++++
> sysdeps/loongarch/dl-trampoline.S            |  91 +++++
> sysdeps/loongarch/jmpbuf-offsets.h           |  22 ++
> sysdeps/loongarch/jmpbuf-unwind.h            |  45 +++
> sysdeps/loongarch/ldsodefs.h                 |  41 +++
> sysdeps/loongarch/linkmap.h                  |  22 ++
> sysdeps/loongarch/machine-gmon.h             |  37 ++
> sysdeps/loongarch/setjmp.S                   |  66 ++++
> sysdeps/loongarch/sotruss-lib.c              |  50 +++
> sysdeps/loongarch/start.S                    |  67 ++++
> sysdeps/loongarch/sys/asm.h                  |  59 +++
> sysdeps/loongarch/tst-audit.h                |  23 ++
> sysdeps/unix/sysv/linux/loongarch/ldconfig.h |  26 ++
> 19 files changed, 1076 insertions(+)
> create mode 100644 sysdeps/loongarch/__longjmp.S
> create mode 100644 sysdeps/loongarch/bits/endianness.h
> create mode 100644 sysdeps/loongarch/bits/link.h
> create mode 100644 sysdeps/loongarch/bits/setjmp.h
> create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
> create mode 100644 sysdeps/loongarch/bsd-setjmp.c
> create mode 100644 sysdeps/loongarch/dl-machine.h
> create mode 100644 sysdeps/loongarch/dl-trampoline.S
> create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
> create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
> create mode 100644 sysdeps/loongarch/ldsodefs.h
> create mode 100644 sysdeps/loongarch/linkmap.h
> create mode 100644 sysdeps/loongarch/machine-gmon.h
> create mode 100644 sysdeps/loongarch/setjmp.S
> create mode 100644 sysdeps/loongarch/sotruss-lib.c
> create mode 100644 sysdeps/loongarch/start.S
> create mode 100644 sysdeps/loongarch/sys/asm.h
> create mode 100644 sysdeps/loongarch/tst-audit.h
> create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>
>diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
>new file mode 100644
>index 0000000000..b7690dd94f
>--- /dev/null
>+++ b/sysdeps/loongarch/__longjmp.S
>@@ -0,0 +1,52 @@
>+/* longjmp.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+ENTRY (__longjmp)
>+	REG_L ra, a0, 0*SZREG
>+	REG_L sp, a0, 1*SZREG
>+	REG_L x,  a0, 2*SZREG
>+	REG_L fp, a0, 3*SZREG
>+	REG_L s0, a0, 4*SZREG
>+	REG_L s1, a0, 5*SZREG
>+	REG_L s2, a0, 6*SZREG
>+	REG_L s3, a0, 7*SZREG
>+	REG_L s4, a0, 8*SZREG
>+	REG_L s5, a0, 9*SZREG
>+	REG_L s6, a0, 10*SZREG
>+	REG_L s7, a0, 11*SZREG
>+	REG_L s8, a0, 12*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_L $f24, a0, 13*SZREG + 0*SZFREG
>+	FREG_L $f25, a0, 13*SZREG + 1*SZFREG
>+	FREG_L $f26, a0, 13*SZREG + 2*SZFREG
>+	FREG_L $f27, a0, 13*SZREG + 3*SZFREG
>+	FREG_L $f28, a0, 13*SZREG + 4*SZFREG
>+	FREG_L $f29, a0, 13*SZREG + 5*SZFREG
>+	FREG_L $f30, a0, 13*SZREG + 6*SZFREG
>+	FREG_L $f31, a0, 13*SZREG + 7*SZFREG
>+#endif
>+
>+	sltui	a0,a1,1
>+	ADD	a0, a0, a1	 # a0 = (a1 == 0) ? 1 : a1
>+	jirl	zero,ra,0
>+
>+END (__longjmp)
>diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
>new file mode 100644
>index 0000000000..7290be7b18
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/endianness.h
>@@ -0,0 +1,11 @@
>+#ifndef _BITS_ENDIANNESS_H
>+#define _BITS_ENDIANNESS_H 1
>+
>+#ifndef _BITS_ENDIAN_H
>+#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
>+#endif
>+
>+/* LoongArch is little-endian.  */
>+#define __BYTE_ORDER __LITTLE_ENDIAN
>+
>+#endif /* bits/endianness.h */
>diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h
>new file mode 100644
>index 0000000000..4df09989cb
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/link.h
>@@ -0,0 +1,58 @@
>+/* Machine-specific declarations for dynamic linker interface.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LINK_H
>+#error "Never include <bits/link.h> directly; use <link.h> instead."
>+#endif
>+
>+typedef struct La_loongarch_regs
>+{
>+  unsigned long int lr_reg[8]; /* a0 - a7 */
>+  double lr_fpreg[8];	       /* fa0 - fa7 */
>+  unsigned long int lr_ra;
>+  unsigned long int lr_sp;
>+} La_loongarch_regs;
>+
>+/* Return values for calls from PLT on LoongArch.  */
>+typedef struct La_loongarch_retval
>+{
>+  unsigned long int lrv_a0;
>+  unsigned long int lrv_a1;
>+  double lrv_fa0;
>+  double lrv_fa1;
>+} La_loongarch_retval;
>+
>+__BEGIN_DECLS
>+
>+extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) * __sym,
>+					      unsigned int __ndx,
>+					      uintptr_t *__refcook,
>+					      uintptr_t *__defcook,
>+					      La_loongarch_regs *__regs,
>+					      unsigned int *__flags,
>+					      const char *__symname,
>+					      long int *__framesizep);
>+extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) * __sym,
>+					      unsigned int __ndx,
>+					      uintptr_t *__refcook,
>+					      uintptr_t *__defcook,
>+					      const La_loongarch_regs *__inregs,
>+					      La_loongarch_retval *__outregs,
>+					      const char *__symname);
>+
>+__END_DECLS
>diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h
>new file mode 100644
>index 0000000000..8b323ad2b6
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/setjmp.h
>@@ -0,0 +1,42 @@
>+/* Define the machine-dependent type `jmp_buf'.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LOONGARCH_BITS_SETJMP_H
>+#define _LOONGARCH_BITS_SETJMP_H
>+
>+typedef struct __jmp_buf_internal_tag
>+{
>+  /* Program counter.  */
>+  long int __pc;
>+  /* Stack pointer.  */
>+  long int __sp;
>+  /* Reserved */
>+  long int __x;
>+  /* Frame pointer.  */
>+  long int __fp;
>+  /* Callee-saved registers.  */
>+  long int __regs[9];
>+
>+#ifndef __loongarch_soft_float
>+  /* Callee-saved floating point registers.  */
>+  double __fpregs[8];
>+#endif
>+
>+} __jmp_buf[1];
>+
>+#endif /* _LOONGARCH_BITS_SETJMP_H */
>diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
>new file mode 100644
>index 0000000000..32f49441c3
>--- /dev/null
>+++ b/sysdeps/loongarch/bsd-_setjmp.c
>@@ -0,0 +1 @@
>+/* _setjmp is implemented in setjmp.S.  */
>diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c
>new file mode 100644
>index 0000000000..45fd802aac
>--- /dev/null
>+++ b/sysdeps/loongarch/bsd-setjmp.c
>@@ -0,0 +1 @@
>+/* setjmp is implemented in setjmp.S.  */
>diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
>new file mode 100644
>index 0000000000..68b68e677d
>--- /dev/null
>+++ b/sysdeps/loongarch/dl-machine.h
>@@ -0,0 +1,362 @@
>+/* Machine-dependent ELF dynamic relocation inline functions.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef dl_machine_h
>+#define dl_machine_h
>+
>+#define ELF_MACHINE_NAME "LoongArch"
>+
>+#include <entry.h>
>+#include <elf/elf.h>
>+#include <sys/asm.h>
>+#include <dl-tls.h>
>+#include <dl-static-tls.h>
>+#include <dl-machine-rel.h>
>+
>+#ifndef _RTLD_PROLOGUE
>+# define _RTLD_PROLOGUE(entry)					\
>+	".globl\t" __STRING (entry) "\n\t"			\
>+	".type\t" __STRING (entry) ", @function\n\t"		\
>+	CFI_STARTPROC "\n"					\
>+	__STRING (entry) ":\n"
>+#endif
>+
>+#ifndef _RTLD_EPILOGUE
>+# define _RTLD_EPILOGUE(entry)					\
>+	CFI_ENDPROC "\n\t"					\
>+	".size\t" __STRING (entry) ", . - " __STRING (entry) "\n"
>+#endif
>+
>+#define ELF_MACHINE_JMP_SLOT R_LARCH_JUMP_SLOT
>+#define ELF_MACHINE_IRELATIVE R_LARCH_IRELATIVE
>+
>+#define elf_machine_type_class(type)				\
>+  ((ELF_RTYPE_CLASS_PLT * ((type) == ELF_MACHINE_JMP_SLOT	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPREL32)	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPMOD32)	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_TPREL32)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPREL64)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPMOD64)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_TPREL64)))	\
>+   | (ELF_RTYPE_CLASS_COPY * ((type) == R_LARCH_COPY)))
>+
>+#define ELF_MACHINE_NO_REL 1
>+#define ELF_MACHINE_NO_RELA 0
>+
>+/* Return nonzero iff ELF header is compatible with the running host.  */
>+static inline int __attribute_used__
>+elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
>+{
>+  /* We can only run LoongArch binaries.  */
>+  if (ehdr->e_machine != EM_LOONGARCH)
>+    return 0;
>+
>+  return 1;
>+}
>+
>+/* Runtime address of .got */
>+#define _GLOBAL_OFFSET_TABLE_ \
>+  ({ \
>+    ElfW (Addr) * r; \
>+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
>+    r; \
>+  })
>+
>+/* Return the link-time address of _DYNAMIC.  */
>+static inline ElfW (Addr) elf_machine_dynamic (void)
>+{
>+  return _GLOBAL_OFFSET_TABLE_[0];
>+}

_GLOBAL_OFFSET_TABLE_[0] == link_time_dynamic is not recommended.
See
https://maskray.me/blog/2021-09-05-build-glibc-with-lld#global_offset_table_0
aarch64/riscv/x86_64/etc have been updated to use the preferred
approach.

>+#define STRINGXP(X) __STRING (X)
>+#define STRINGXV(X) STRINGV_ (X)
>+#define STRINGV_(...) #__VA_ARGS__
>+
>+/* Return the run-time load address of the shared object.  */
>+static inline ElfW (Addr) elf_machine_load_address (void)
>+{
>+  ElfW (Addr) got_linktime_addr;
>+  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
>+      /* Link-time address in GOT entry before runtime relocation */
>+      : "=r"(got_linktime_addr));
>+  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
>+}
>+
>+/* Initial entry point code for the dynamic linker.
>+   The C function `_dl_start' is the real entry point;
>+   its return value is the user program's entry point.  */
>+
>+#define RTLD_START \
>+  asm(".text\n\
>+      " _RTLD_PROLOGUE (ENTRY_POINT) "\
>+      .cfi_label .Ldummy   \n\
>+      " CFI_UNDEFINED (1) "   \n\
>+      or	$a0, $sp, $zero   \n\
>+      bl	_dl_start   \n\
>+      # Stash user entry point in s0.   \n\
>+      or	$s0, $v0, $zero   \n\
>+      # See if we were run as a command with the executable file   \n\
>+      # name as an extra leading argument.   \n\
>+      la	$a0, _dl_skip_args   \n\
>+      ld.w	$a0, $a0, 0   \n\
>+      # Load the original argument count.   \n\
>+      ld.d	$a1, $sp, 0   \n\
>+      # Subtract _dl_skip_args from it.   \n\
>+      sub.d	$a1, $a1, $a0   \n\
>+      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
>+      slli.d	$a0, $a0, 3   \n\
>+      add.d	$sp, $sp, $a0   \n\
>+      # Save back the modified argument count.   \n\
>+      st.d	$a1, $sp, 0   \n\
>+      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
>+		       char **env)    \n\
>+      la	$a0, _rtld_local   \n\
>+      ld.d	$a0, $a0, 0   \n\
>+      addi.d	$a2, $sp, 8   \n\
>+      slli.d	$a3, $a1, 3   \n\
>+      add.d	$a3, $a3, $a2   \n\
>+      addi.d	$a3, $a3, 8   \n\
>+      # Adjust $sp for 16-aligned   \n\
>+      srli.d  $t0, $sp, 4   \n\
>+      slli.d  $t0, $t0, 4   \n\
>+      ori	$t1, $sp, 0   \n\
>+      addi.d  $sp, $t0, -32   \n\
>+      st.d	$t1, $sp, 24   \n\
>+      # Call the function to run the initializers.   \n\
>+      bl	_dl_init   \n\
>+      # Pass our finalizer function to _start.   \n\
>+      ld.d    $sp, $sp, 24   \n\
>+      la	$a0, _dl_fini   \n\
>+      # Jump to the user entry point.   \n\
>+      jirl	$zero, $s0, 0   \n\
>+      " _RTLD_EPILOGUE (ENTRY_POINT) "\
>+      .previous");
>+
>+/* Names of the architecture-specific auditing callback functions.  */
>+#define ARCH_LA_PLTENTER loongarch_gnu_pltenter
>+#define ARCH_LA_PLTEXIT loongarch_gnu_pltexit
>+
>+/* Bias .got.plt entry by the offset requested by the PLT header.  */
>+#define elf_machine_plt_value(map, reloc, value) (value)
>+
>+static inline ElfW (Addr)
>+  elf_machine_fixup_plt (struct link_map *map, lookup_t t,
>+			 const ElfW (Sym) * refsym, const ElfW (Sym) * sym,
>+			 const ElfW (Rela) * reloc, ElfW (Addr) * reloc_addr,
>+			 ElfW (Addr) value)
>+{
>+  return *reloc_addr = value;
>+}
>+
>+#endif /* !dl_machine_h */
>+
>+#ifdef RESOLVE_MAP
>+
>+/* Perform a relocation described by R_INFO at the location pointed to
>+   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
>+   MAP is the object containing the reloc.  */
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
>+		  const ElfW (Rela) * reloc,
>+		  const ElfW (Sym) * sym,
>+		  const struct r_found_version *version,
>+		  void *const reloc_addr, int skip_ifunc)
>+{
>+  ElfW (Addr) r_info = reloc->r_info;
>+  const unsigned long int r_type = ELFW (R_TYPE) (r_info);
>+  ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr;
>+  const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym;
>+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
>+  ElfW (Addr) value = 0;
>+  if (sym_map != NULL)
>+    value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
>+
>+  if (sym != NULL
>+      && __builtin_expect (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
>+      && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
>+      && __builtin_expect (!skip_ifunc, 1))
>+    value = ((ElfW (Addr) (*) (int)) value) (GLRO (dl_hwcap));
>+
>+  switch (r_type)
>+    {
>+#ifndef RTLD_BOOTSTRAP
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPMOD64:
>+    R_LARCH_TLS_DTPMOD32:
>+      if (sym_map)
>+	*addr_field = sym_map->l_tls_modid;
>+      break;
>+
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64:
>+    R_LARCH_TLS_DTPREL32:
>+      if (sym != NULL)
>+	*addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend;
>+      break;
>+
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64:
>+    R_LARCH_TLS_TPREL32:
>+      if (sym != NULL)
>+	{
>+	  CHECK_STATIC_TLS (map, sym_map);
>+	  *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend;
>+	}
>+      break;
>+
>+    case R_LARCH_COPY:
>+      {
>+	if (__glibc_unlikely (sym == NULL))
>+	  /* This can happen in trace mode if an object could not be
>+	     found.  */
>+	  break;
>+
>+	/* Handle TLS copy relocations.  */
>+	if (__glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_TLS))
>+	  {
>+	    /* There's nothing to do if the symbol is in .tbss.  */
>+	    if (__glibc_likely (sym->st_value
>+				>= sym_map->l_tls_initimage_size))
>+	      break;
>+	    value += (ElfW (Addr)) sym_map->l_tls_initimage - sym_map->l_addr;
>+	  }
>+
>+	size_t size = sym->st_size;
>+	if (__glibc_unlikely (sym->st_size != refsym->st_size))
>+	  {
>+	    const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
>+	    if (sym->st_size > refsym->st_size)
>+	      size = refsym->st_size;
>+	    if (sym->st_size > refsym->st_size || GLRO (dl_verbose))
>+	      _dl_error_printf ("\
>+  %s: Symbol `%s' has different size in shared object, consider re-linking\n",
>+				rtld_progname ?: "<program name unknown>",
>+				strtab + refsym->st_name);
>+	  }
>+
>+	memcpy (reloc_addr, (void *) value, size);
>+	break;
>+      }
>+#endif
>+
>+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
>+    case R_LARCH_RELATIVE:
>+      {
>+#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
>+	/* This is defined in rtld.c, but nowhere in the static libc.a;
>+	   make the reference weak so static programs can still link.
>+	   This declaration cannot be done when compiling rtld.c
>+	   (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
>+	   common defn for _dl_rtld_map, which is incompatible with a
>+	   weak decl in the same file.  */
>+#ifndef SHARED
>+	weak_extern (GL (dl_rtld_map));
>+#endif
>+	if (map != &GL (dl_rtld_map)) /* Already done in rtld itself.  */
>+#endif
>+	  *addr_field = map->l_addr + reloc->r_addend;
>+	break;
>+      }
>+#endif
>+
>+    case R_LARCH_JUMP_SLOT:
>+    case __WORDSIZE == 64 ? R_LARCH_64:
>+    R_LARCH_32:
>+      *addr_field = value;
>+      break;
>+
>+    case R_LARCH_IRELATIVE:
>+      value = map->l_addr + reloc->r_addend;
>+      if (__glibc_likely (!skip_ifunc))
>+	value = ((ElfW (Addr) (*) (void)) value) ();
>+      *addr_field = value;
>+      break;
>+
>+    case R_LARCH_NONE:
>+      break;
>+
>+    default:
>+      _dl_reloc_bad_type (map, r_type, 0);
>+      break;
>+    }
>+}
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) * reloc,
>+			   void *const reloc_addr)
>+{
>+  *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend;
>+}
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
>+		      ElfW (Addr) l_addr,
>+		      const ElfW (Rela) * reloc, int skip_ifunc)
>+{
>+  ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
>+  const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
>+
>+  /* Check for unexpected PLT reloc type.  */
>+  if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT))
>+    {
>+      if (__glibc_unlikely (map->l_mach.plt == 0))
>+	{
>+	  if (l_addr)
>+	    *reloc_addr += l_addr;
>+	}
>+      else
>+	*reloc_addr = map->l_mach.plt;
>+    }
>+  else if (__glibc_unlikely (r_type == R_LARCH_IRELATIVE))
>+    {
>+      ElfW (Addr) *value = (void *) (l_addr + reloc->r_addend);
>+      if (__glibc_likely (!skip_ifunc))
>+	value = (ElfW (Addr) *) ((ElfW (Addr) (*) (void)) value) ();
>+      *reloc_addr = (ElfW (Addr)) value;
>+    }
>+  else
>+    _dl_reloc_bad_type (map, r_type, 1);
>+}
>+
>+/* Set up the loaded object described by L so its stub function
>+   will jump to the on-demand fixup code __dl_runtime_resolve.  */
>+
>+static inline int __attribute__ ((always_inline))
>+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>+			   int lazy, int profile)
>+{
>+#ifndef RTLD_BOOTSTRAP
>+  /* If using PLTs, fill in the first two entries of .got.plt.  */
>+  if (l->l_info[DT_JMPREL])
>+    {
>+      extern void _dl_runtime_resolve (void)
>+	__attribute__ ((visibility ("hidden")));
>+      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
>+      /* If a library is prelinked but we have to relocate anyway,
>+	 we have to be able to undo the prelinking of .got.plt.
>+	 The prelinker saved the address of .plt for us here.  */
>+      if (gotplt[1])
>+	l->l_mach.plt = gotplt[1] + l->l_addr;
>+      gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve;
>+      gotplt[1] = (ElfW (Addr)) l;
>+    }
>+#endif
>+
>+  return lazy;
>+}
>+
>+#endif /* RESOLVE_MAP */
>diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
>new file mode 100644
>index 0000000000..eb610392f6
>--- /dev/null
>+++ b/sysdeps/loongarch/dl-trampoline.S
>@@ -0,0 +1,91 @@
>+/* PLT trampolines.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+/* Assembler veneer called from the PLT header code for lazy loading.
>+   The PLT header passes its own args in t0-t2.  */
>+
>+#ifdef __loongarch_soft_float
>+# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
>+#else
>+# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
>+#endif
>+
>+ENTRY (_dl_runtime_resolve)
>+
>+	/* Save arguments to stack. */
>+	ADDI	sp, sp, -FRAME_SIZE
>+
>+	REG_S	ra, sp, 9*SZREG
>+	REG_S	a0, sp, 1*SZREG
>+	REG_S	a1, sp, 2*SZREG
>+	REG_S	a2, sp, 3*SZREG
>+	REG_S	a3, sp, 4*SZREG
>+	REG_S	a4, sp, 5*SZREG
>+	REG_S	a5, sp, 6*SZREG
>+	REG_S	a6, sp, 7*SZREG
>+	REG_S	a7, sp, 8*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_S	fa0, sp, 10*SZREG + 0*SZFREG
>+	FREG_S	fa1, sp, 10*SZREG + 1*SZFREG
>+	FREG_S	fa2, sp, 10*SZREG + 2*SZFREG
>+	FREG_S	fa3, sp, 10*SZREG + 3*SZFREG
>+	FREG_S	fa4, sp, 10*SZREG + 4*SZFREG
>+	FREG_S	fa5, sp, 10*SZREG + 5*SZFREG
>+	FREG_S	fa6, sp, 10*SZREG + 6*SZFREG
>+	FREG_S	fa7, sp, 10*SZREG + 7*SZFREG
>+#endif
>+
>+	/* Update .got.plt and obtain runtime address of callee */
>+	SLLI	a1, t1, 1
>+	or	a0, t0, zero
>+	ADD	a1, a1, t1
>+	la	a2, _dl_fixup
>+	jirl	ra, a2, 0
>+	or	t1, v0, zero
>+
>+	/* Restore arguments from stack. */
>+	REG_L	ra, sp, 9*SZREG
>+	REG_L	a0, sp, 1*SZREG
>+	REG_L	a1, sp, 2*SZREG
>+	REG_L	a2, sp, 3*SZREG
>+	REG_L	a3, sp, 4*SZREG
>+	REG_L	a4, sp, 5*SZREG
>+	REG_L	a5, sp, 6*SZREG
>+	REG_L	a6, sp, 7*SZREG
>+	REG_L	a7, sp, 8*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_L	fa0, sp, 10*SZREG + 0*SZFREG
>+	FREG_L	fa1, sp, 10*SZREG + 1*SZFREG
>+	FREG_L	fa2, sp, 10*SZREG + 2*SZFREG
>+	FREG_L	fa3, sp, 10*SZREG + 3*SZFREG
>+	FREG_L	fa4, sp, 10*SZREG + 4*SZFREG
>+	FREG_L	fa5, sp, 10*SZREG + 5*SZFREG
>+	FREG_L	fa6, sp, 10*SZREG + 6*SZFREG
>+	FREG_L	fa7, sp, 10*SZREG + 7*SZFREG
>+#endif
>+
>+	ADDI	sp, sp, FRAME_SIZE
>+
>+	/* Invoke the callee. */
>+	jirl		zero, t1, 0
>+END (_dl_runtime_resolve)
>diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
>new file mode 100644
>index 0000000000..a4b8ea690e
>--- /dev/null
>+++ b/sysdeps/loongarch/jmpbuf-offsets.h
>@@ -0,0 +1,22 @@
>+/* Private macros for accessing __jmp_buf contents.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public License as
>+   published by the Free Software Foundation; either version 2.1 of the
>+   License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <jmpbuf-unwind.h>
>+
>+/* Helper for generic ____longjmp_chk().  */
>+#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))
>diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
>new file mode 100644
>index 0000000000..6fa509151d
>--- /dev/null
>+++ b/sysdeps/loongarch/jmpbuf-unwind.h
>@@ -0,0 +1,45 @@
>+/* Examine __jmp_buf for unwinding frames.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <setjmp.h>
>+#include <stdint.h>
>+#include <unwind.h>
>+#include <sysdep.h>
>+
>+/* Test if longjmp to JMPBUF would unwind the frame
>+   containing a local variable at ADDRESS.  */
>+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
>+  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp))
>+
>+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
>+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
>+
>+static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs)
>+{
>+  uintptr_t sp = regs[0].__sp;
>+#ifdef PTR_DEMANGLE
>+  PTR_DEMANGLE (sp);
>+#endif
>+  return sp;
>+}
>+
>+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
>+  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
>+
>+/* We use the normal longjmp for unwinding.  */
>+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
>diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h
>new file mode 100644
>index 0000000000..36b1b25b9f
>--- /dev/null
>+++ b/sysdeps/loongarch/ldsodefs.h
>@@ -0,0 +1,41 @@
>+/* Run-time dynamic linker data structures for loaded ELF shared objects.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LOONGARCH_LDSODEFS_H
>+#define _LOONGARCH_LDSODEFS_H 1
>+
>+#include <elf.h>
>+
>+struct La_loongarch_regs;
>+struct La_loongarch_retval;
>+
>+#define ARCH_PLTENTER_MEMBERS \
>+  ElfW (Addr) (*loongarch_gnu_pltenter) (ElfW (Sym) *, unsigned int, \
>+					 uintptr_t *, uintptr_t *, \
>+					 const struct La_loongarch_regs *, \
>+					 unsigned int *, const char *name, \
>+					 long int *framesizep);
>+
>+#define ARCH_PLTEXIT_MEMBERS \
>+  unsigned int (*loongarch_gnu_pltexit) (ElfW (Sym) *, unsigned int, \
>+		uintptr_t *, uintptr_t *, const struct La_loongarch_regs *, \
>+		struct La_loongarch_retval *, const char *);
>+
>+#include_next <ldsodefs.h>
>+
>+#endif
>diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h
>new file mode 100644
>index 0000000000..bbba73ed70
>--- /dev/null
>+++ b/sysdeps/loongarch/linkmap.h
>@@ -0,0 +1,22 @@
>+/* Definition of link_map_machine.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+struct link_map_machine
>+{
>+  ElfW (Addr) plt; /* Address of .plt.  */
>+};
>diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
>new file mode 100644
>index 0000000000..4a3cdd964e
>--- /dev/null
>+++ b/sysdeps/loongarch/machine-gmon.h
>@@ -0,0 +1,37 @@
>+/* LoongArch definitions for profiling support.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library; if not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+/* Accept 'frompc' address as argument from the function that calls
>+   _mcount for profiling.  Use  __builtin_return_address (0)
>+   for the 'selfpc' address.  */
>+
>+#include <sysdep.h>
>+
>+static void mcount_internal (unsigned long int frompc,
>+			     unsigned long int selfpc);
>+
>+#define _MCOUNT_DECL(frompc, selfpc) \
>+  static inline void mcount_internal (unsigned long int frompc, \
>+				      unsigned long int selfpc)
>+
>+#define MCOUNT \
>+  void _mcount (void *frompc) \
>+  { \
>+    mcount_internal ((unsigned long int) frompc, \
>+		     (unsigned long int) RETURN_ADDRESS (0)); \
>+  }
>diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
>new file mode 100644
>index 0000000000..b93ae2f5da
>--- /dev/null
>+++ b/sysdeps/loongarch/setjmp.S
>@@ -0,0 +1,66 @@
>+/* setjmp for LoongArch.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+ENTRY (_setjmp)
>+	li.w		a1,0
>+	b		__sigsetjmp
>+END (_setjmp)
>+
>+ENTRY (setjmp)
>+	li.w		a1,1
>+END (setjmp)
>+
>+ENTRY (__sigsetjmp)
>+	REG_S ra, a0, 0*SZREG
>+	REG_S sp, a0, 1*SZREG
>+	REG_S x,  a0, 2*SZREG
>+	REG_S fp, a0, 3*SZREG
>+	REG_S s0, a0, 4*SZREG
>+	REG_S s1, a0, 5*SZREG
>+	REG_S s2, a0, 6*SZREG
>+	REG_S s3, a0, 7*SZREG
>+	REG_S s4, a0, 8*SZREG
>+	REG_S s5, a0, 9*SZREG
>+	REG_S s6, a0, 10*SZREG
>+	REG_S s7, a0, 11*SZREG
>+	REG_S s8, a0, 12*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_S $f24, a0, 13*SZREG + 0*SZFREG
>+	FREG_S $f25, a0, 13*SZREG + 1*SZFREG
>+	FREG_S $f26, a0, 13*SZREG + 2*SZFREG
>+	FREG_S $f27, a0, 13*SZREG + 3*SZFREG
>+	FREG_S $f28, a0, 13*SZREG + 4*SZFREG
>+	FREG_S $f29, a0, 13*SZREG + 5*SZFREG
>+	FREG_S $f30, a0, 13*SZREG + 6*SZFREG
>+	FREG_S $f31, a0, 13*SZREG + 7*SZFREG
>+#endif
>+
>+#if !IS_IN (libc) && IS_IN(rtld)
>+	li.w		v0, 0
>+	jirl		zero,ra,0
>+#else
>+	b		__sigjmp_save
>+#endif
>+END (__sigsetjmp)
>+
>+hidden_def (__sigsetjmp)
>+weak_alias (_setjmp, __GI__setjmp)
>diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
>new file mode 100644
>index 0000000000..5b15f4815a
>--- /dev/null
>+++ b/sysdeps/loongarch/sotruss-lib.c
>@@ -0,0 +1,50 @@
>+/* Override generic sotruss-lib.c to define actual functions for LoongArch.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define HAVE_ARCH_PLTENTER
>+#define HAVE_ARCH_PLTEXIT
>+
>+#include <elf/sotruss-lib.c>
>+
>+ElfW (Addr)
>+la_loongarch_gnu_pltenter (ElfW (Sym) * sym __attribute__ ((unused)),
>+			   unsigned int ndx __attribute__ ((unused)),
>+			   uintptr_t *refcook, uintptr_t *defcook,
>+			   La_loongarch_regs *regs, unsigned int *flags,
>+			   const char *symname, long int *framesizep)
>+{
>+  print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1],
>+		   regs->lr_reg[2], *flags);
>+
>+  /* No need to copy anything, we will not need the parameters in any case.  */
>+  *framesizep = 0;
>+
>+  return sym->st_value;
>+}
>+
>+unsigned int
>+la_loongarch_gnu_pltexit (ElfW (Sym) * sym, unsigned int ndx,
>+			  uintptr_t *refcook, uintptr_t *defcook,
>+			  const struct La_loongarch_regs *inregs,
>+			  struct La_loongarch_retval *outregs,
>+			  const char *symname)
>+{
>+  print_exit (refcook, defcook, symname, outregs->lrv_a0);
>+
>+  return 0;
>+}
>diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
>new file mode 100644
>index 0000000000..a9b32aa966
>--- /dev/null
>+++ b/sysdeps/loongarch/start.S
>@@ -0,0 +1,67 @@
>+/* Startup code compliant to the ELF LoongArch ABI.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define __ASSEMBLY__ 1
>+#include <entry.h>
>+#include <sys/asm.h>
>+
>+/* The entry point's job is to call __libc_start_main.  Per the ABI,
>+   a0 contains the address of a function to be passed to atexit.
>+   __libc_start_main wants this in a5.  */
>+
>+/*
>+int
>+__libc_start_main (int (*main) (int, char **, char **),
>+		   int argc,
>+		   char **argv,
>+		   __typeof (main) init,
>+		   void (*fini) (void),
>+		   void (*rtld_fini) (void),
>+		   void *stack_end);
>+ */
>+
>+ENTRY (ENTRY_POINT)
>+
>+/* Terminate call stack by noting ra is undefined.  Use a dummy
>+   .cfi_label to force starting the FDE.  */
>+	.cfi_label .Ldummy
>+	cfi_undefined (1)
>+	or		a5, a0, zero /* rtld_fini */
>+
>+/* We must get symbol main through GOT table, since main may not be local.
>+   For instance: googletest defines main in dynamic library.  */
>+	la.got		a0, t0, main
>+	REG_L		a1, sp, 0
>+	ADDI		a2, sp, SZREG
>+
>+	/* Adjust $sp for 16-aligned */
>+	SRLI		sp, sp, 4
>+	SLLI		sp, sp, 4
>+
>+	move		a3, zero /* used to be init */
>+	move		a4, zero /* used to be fini */
>+	or		a6, sp, zero /* stack_end */
>+
>+	la.got		ra, t0, __libc_start_main
>+	jirl		ra, ra, 0
>+
>+	la.got		ra, t0, abort
>+	jirl		ra, ra, 0
>+END (ENTRY_POINT)
>+
>diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h
>new file mode 100644
>index 0000000000..b41ee59694
>--- /dev/null
>+++ b/sysdeps/loongarch/sys/asm.h
>@@ -0,0 +1,59 @@
>+/* Miscellaneous macros.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _SYS_ASM_H
>+#define _SYS_ASM_H
>+
>+#include <sys/regdef.h>
>+#include <sysdeps/generic/sysdep.h>
>+
>+/* Macros to handle different pointer/register sizes for 32/64-bit code.  */
>+#define SZREG 8
>+#define SZFREG 8
>+#define REG_L ld.d
>+#define REG_S st.d
>+#define SRLI srli.d
>+#define SLLI slli.d
>+#define ADDI addi.d
>+#define ADD  add.d
>+#define BSTRINS  bstrins.d
>+#define LI  li.d
>+#define FREG_L fld.d
>+#define FREG_S fst.d
>+
>+/* Declare leaf routine.  */
>+#define LEAF(symbol) \
>+  .text; \
>+  .globl symbol; \
>+  .align 3; \
>+  cfi_startproc; \
>+  .type symbol, @function; \
>+  symbol:
>+
>+#define ENTRY(symbol) LEAF (symbol)
>+
>+/* Mark end of function.  */
>+#undef END
>+#define END(function) \
>+  cfi_endproc; \
>+  .size function, .- function;
>+
>+/* Stack alignment.  */
>+#define ALMASK ~15
>+
>+#endif /* sys/asm.h */
>diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
>new file mode 100644
>index 0000000000..e71948c86e
>--- /dev/null
>+++ b/sysdeps/loongarch/tst-audit.h
>@@ -0,0 +1,23 @@
>+/* Definitions for testing PLT entry/exit auditing.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define pltenter la_loongarch_gnu_pltenter
>+#define pltexit la_loongarch_gnu_pltexit
>+#define La_regs La_loongarch_regs
>+#define La_retval La_loongarch_retval
>+#define int_retval lrv_a0
>diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>new file mode 100644
>index 0000000000..4887c30ca2
>--- /dev/null
>+++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>@@ -0,0 +1,26 @@
>+/* ldconfig default paths and libraries.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <http://www.gnu.org/licenses/>.  */
>+
>+#include <sysdeps/generic/ldconfig.h>
>+
>+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
>+  { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
>+
>+#define SYSDEP_KNOWN_LIBRARY_NAMES	\
>+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
>+  { "libm.so.6", FLAG_ELF_LIBC6 },
>-- 
>2.31.1
>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
  2022-05-09  7:56   ` Fangrui Song
@ 2022-05-09  8:20   ` Fangrui Song
  2022-05-09 11:33     ` Adhemerval Zanella
  2022-05-09 12:39   ` Adhemerval Zanella
  2022-05-29 13:10   ` Adhemerval Zanella
  3 siblings, 1 reply; 20+ messages in thread
From: Fangrui Song @ 2022-05-09  8:20 UTC (permalink / raw)
  To: caiyinyu; +Cc: libc-alpha, xuchenghua, joseph_myers


On 2022-05-09, caiyinyu wrote:
>---
> sysdeps/loongarch/__longjmp.S                |  52 +++
> sysdeps/loongarch/bits/endianness.h          |  11 +
> sysdeps/loongarch/bits/link.h                |  58 +++
> sysdeps/loongarch/bits/setjmp.h              |  42 +++
> sysdeps/loongarch/bsd-_setjmp.c              |   1 +
> sysdeps/loongarch/bsd-setjmp.c               |   1 +
> sysdeps/loongarch/dl-machine.h               | 362 +++++++++++++++++++
> sysdeps/loongarch/dl-trampoline.S            |  91 +++++
> sysdeps/loongarch/jmpbuf-offsets.h           |  22 ++
> sysdeps/loongarch/jmpbuf-unwind.h            |  45 +++
> sysdeps/loongarch/ldsodefs.h                 |  41 +++
> sysdeps/loongarch/linkmap.h                  |  22 ++
> sysdeps/loongarch/machine-gmon.h             |  37 ++
> sysdeps/loongarch/setjmp.S                   |  66 ++++
> sysdeps/loongarch/sotruss-lib.c              |  50 +++
> sysdeps/loongarch/start.S                    |  67 ++++
> sysdeps/loongarch/sys/asm.h                  |  59 +++
> sysdeps/loongarch/tst-audit.h                |  23 ++
> sysdeps/unix/sysv/linux/loongarch/ldconfig.h |  26 ++
> 19 files changed, 1076 insertions(+)
> create mode 100644 sysdeps/loongarch/__longjmp.S
> create mode 100644 sysdeps/loongarch/bits/endianness.h
> create mode 100644 sysdeps/loongarch/bits/link.h
> create mode 100644 sysdeps/loongarch/bits/setjmp.h
> create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
> create mode 100644 sysdeps/loongarch/bsd-setjmp.c
> create mode 100644 sysdeps/loongarch/dl-machine.h
> create mode 100644 sysdeps/loongarch/dl-trampoline.S
> create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
> create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
> create mode 100644 sysdeps/loongarch/ldsodefs.h
> create mode 100644 sysdeps/loongarch/linkmap.h
> create mode 100644 sysdeps/loongarch/machine-gmon.h
> create mode 100644 sysdeps/loongarch/setjmp.S
> create mode 100644 sysdeps/loongarch/sotruss-lib.c
> create mode 100644 sysdeps/loongarch/start.S
> create mode 100644 sysdeps/loongarch/sys/asm.h
> create mode 100644 sysdeps/loongarch/tst-audit.h
> create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>
>diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
>new file mode 100644
>index 0000000000..b7690dd94f
>--- /dev/null
>+++ b/sysdeps/loongarch/__longjmp.S
>@@ -0,0 +1,52 @@
>+/* longjmp.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+ENTRY (__longjmp)
>+	REG_L ra, a0, 0*SZREG
>+	REG_L sp, a0, 1*SZREG
>+	REG_L x,  a0, 2*SZREG
>+	REG_L fp, a0, 3*SZREG
>+	REG_L s0, a0, 4*SZREG
>+	REG_L s1, a0, 5*SZREG
>+	REG_L s2, a0, 6*SZREG
>+	REG_L s3, a0, 7*SZREG
>+	REG_L s4, a0, 8*SZREG
>+	REG_L s5, a0, 9*SZREG
>+	REG_L s6, a0, 10*SZREG
>+	REG_L s7, a0, 11*SZREG
>+	REG_L s8, a0, 12*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_L $f24, a0, 13*SZREG + 0*SZFREG
>+	FREG_L $f25, a0, 13*SZREG + 1*SZFREG
>+	FREG_L $f26, a0, 13*SZREG + 2*SZFREG
>+	FREG_L $f27, a0, 13*SZREG + 3*SZFREG
>+	FREG_L $f28, a0, 13*SZREG + 4*SZFREG
>+	FREG_L $f29, a0, 13*SZREG + 5*SZFREG
>+	FREG_L $f30, a0, 13*SZREG + 6*SZFREG
>+	FREG_L $f31, a0, 13*SZREG + 7*SZFREG
>+#endif
>+
>+	sltui	a0,a1,1
>+	ADD	a0, a0, a1	 # a0 = (a1 == 0) ? 1 : a1
>+	jirl	zero,ra,0
>+
>+END (__longjmp)
>diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
>new file mode 100644
>index 0000000000..7290be7b18
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/endianness.h
>@@ -0,0 +1,11 @@
>+#ifndef _BITS_ENDIANNESS_H
>+#define _BITS_ENDIANNESS_H 1
>+
>+#ifndef _BITS_ENDIAN_H
>+#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
>+#endif
>+
>+/* LoongArch is little-endian.  */
>+#define __BYTE_ORDER __LITTLE_ENDIAN
>+
>+#endif /* bits/endianness.h */
>diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h
>new file mode 100644
>index 0000000000..4df09989cb
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/link.h
>@@ -0,0 +1,58 @@
>+/* Machine-specific declarations for dynamic linker interface.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LINK_H
>+#error "Never include <bits/link.h> directly; use <link.h> instead."
>+#endif
>+
>+typedef struct La_loongarch_regs
>+{
>+  unsigned long int lr_reg[8]; /* a0 - a7 */
>+  double lr_fpreg[8];	       /* fa0 - fa7 */
>+  unsigned long int lr_ra;
>+  unsigned long int lr_sp;
>+} La_loongarch_regs;
>+
>+/* Return values for calls from PLT on LoongArch.  */
>+typedef struct La_loongarch_retval
>+{
>+  unsigned long int lrv_a0;
>+  unsigned long int lrv_a1;
>+  double lrv_fa0;
>+  double lrv_fa1;
>+} La_loongarch_retval;
>+
>+__BEGIN_DECLS
>+
>+extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) * __sym,
>+					      unsigned int __ndx,
>+					      uintptr_t *__refcook,
>+					      uintptr_t *__defcook,
>+					      La_loongarch_regs *__regs,
>+					      unsigned int *__flags,
>+					      const char *__symname,
>+					      long int *__framesizep);
>+extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) * __sym,
>+					      unsigned int __ndx,
>+					      uintptr_t *__refcook,
>+					      uintptr_t *__defcook,
>+					      const La_loongarch_regs *__inregs,
>+					      La_loongarch_retval *__outregs,
>+					      const char *__symname);
>+
>+__END_DECLS
>diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h
>new file mode 100644
>index 0000000000..8b323ad2b6
>--- /dev/null
>+++ b/sysdeps/loongarch/bits/setjmp.h
>@@ -0,0 +1,42 @@
>+/* Define the machine-dependent type `jmp_buf'.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LOONGARCH_BITS_SETJMP_H
>+#define _LOONGARCH_BITS_SETJMP_H
>+
>+typedef struct __jmp_buf_internal_tag
>+{
>+  /* Program counter.  */
>+  long int __pc;
>+  /* Stack pointer.  */
>+  long int __sp;
>+  /* Reserved */
>+  long int __x;
>+  /* Frame pointer.  */
>+  long int __fp;
>+  /* Callee-saved registers.  */
>+  long int __regs[9];
>+
>+#ifndef __loongarch_soft_float
>+  /* Callee-saved floating point registers.  */
>+  double __fpregs[8];
>+#endif
>+
>+} __jmp_buf[1];
>+
>+#endif /* _LOONGARCH_BITS_SETJMP_H */
>diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
>new file mode 100644
>index 0000000000..32f49441c3
>--- /dev/null
>+++ b/sysdeps/loongarch/bsd-_setjmp.c
>@@ -0,0 +1 @@
>+/* _setjmp is implemented in setjmp.S.  */
>diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c
>new file mode 100644
>index 0000000000..45fd802aac
>--- /dev/null
>+++ b/sysdeps/loongarch/bsd-setjmp.c
>@@ -0,0 +1 @@
>+/* setjmp is implemented in setjmp.S.  */
>diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
>new file mode 100644
>index 0000000000..68b68e677d
>--- /dev/null
>+++ b/sysdeps/loongarch/dl-machine.h
>@@ -0,0 +1,362 @@
>+/* Machine-dependent ELF dynamic relocation inline functions.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef dl_machine_h
>+#define dl_machine_h
>+
>+#define ELF_MACHINE_NAME "LoongArch"
>+
>+#include <entry.h>
>+#include <elf/elf.h>
>+#include <sys/asm.h>
>+#include <dl-tls.h>
>+#include <dl-static-tls.h>
>+#include <dl-machine-rel.h>
>+
>+#ifndef _RTLD_PROLOGUE
>+# define _RTLD_PROLOGUE(entry)					\
>+	".globl\t" __STRING (entry) "\n\t"			\
>+	".type\t" __STRING (entry) ", @function\n\t"		\
>+	CFI_STARTPROC "\n"					\
>+	__STRING (entry) ":\n"
>+#endif
>+
>+#ifndef _RTLD_EPILOGUE
>+# define _RTLD_EPILOGUE(entry)					\
>+	CFI_ENDPROC "\n\t"					\
>+	".size\t" __STRING (entry) ", . - " __STRING (entry) "\n"
>+#endif
>+
>+#define ELF_MACHINE_JMP_SLOT R_LARCH_JUMP_SLOT
>+#define ELF_MACHINE_IRELATIVE R_LARCH_IRELATIVE
>+
>+#define elf_machine_type_class(type)				\
>+  ((ELF_RTYPE_CLASS_PLT * ((type) == ELF_MACHINE_JMP_SLOT	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPREL32)	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPMOD32)	\
>+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_TPREL32)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPREL64)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPMOD64)	\
>+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_TPREL64)))	\
>+   | (ELF_RTYPE_CLASS_COPY * ((type) == R_LARCH_COPY)))
>+
>+#define ELF_MACHINE_NO_REL 1
>+#define ELF_MACHINE_NO_RELA 0
>+
>+/* Return nonzero iff ELF header is compatible with the running host.  */
>+static inline int __attribute_used__
>+elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
>+{
>+  /* We can only run LoongArch binaries.  */
>+  if (ehdr->e_machine != EM_LOONGARCH)
>+    return 0;
>+
>+  return 1;
>+}
>+
>+/* Runtime address of .got */
>+#define _GLOBAL_OFFSET_TABLE_ \
>+  ({ \
>+    ElfW (Addr) * r; \
>+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
>+    r; \
>+  })
>+
>+/* Return the link-time address of _DYNAMIC.  */
>+static inline ElfW (Addr) elf_machine_dynamic (void)
>+{
>+  return _GLOBAL_OFFSET_TABLE_[0];
>+}
>+
>+#define STRINGXP(X) __STRING (X)
>+#define STRINGXV(X) STRINGV_ (X)
>+#define STRINGV_(...) #__VA_ARGS__
>+
>+/* Return the run-time load address of the shared object.  */
>+static inline ElfW (Addr) elf_machine_load_address (void)
>+{
>+  ElfW (Addr) got_linktime_addr;
>+  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
>+      /* Link-time address in GOT entry before runtime relocation */
>+      : "=r"(got_linktime_addr));
>+  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
>+}
>+
>+/* Initial entry point code for the dynamic linker.
>+   The C function `_dl_start' is the real entry point;
>+   its return value is the user program's entry point.  */
>+
>+#define RTLD_START \
>+  asm(".text\n\
>+      " _RTLD_PROLOGUE (ENTRY_POINT) "\
>+      .cfi_label .Ldummy   \n\
>+      " CFI_UNDEFINED (1) "   \n\
>+      or	$a0, $sp, $zero   \n\
>+      bl	_dl_start   \n\
>+      # Stash user entry point in s0.   \n\
>+      or	$s0, $v0, $zero   \n\
>+      # See if we were run as a command with the executable file   \n\
>+      # name as an extra leading argument.   \n\
>+      la	$a0, _dl_skip_args   \n\
>+      ld.w	$a0, $a0, 0   \n\
>+      # Load the original argument count.   \n\
>+      ld.d	$a1, $sp, 0   \n\
>+      # Subtract _dl_skip_args from it.   \n\
>+      sub.d	$a1, $a1, $a0   \n\
>+      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
>+      slli.d	$a0, $a0, 3   \n\
>+      add.d	$sp, $sp, $a0   \n\
>+      # Save back the modified argument count.   \n\
>+      st.d	$a1, $sp, 0   \n\
>+      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
>+		       char **env)    \n\
>+      la	$a0, _rtld_local   \n\
>+      ld.d	$a0, $a0, 0   \n\
>+      addi.d	$a2, $sp, 8   \n\
>+      slli.d	$a3, $a1, 3   \n\
>+      add.d	$a3, $a3, $a2   \n\
>+      addi.d	$a3, $a3, 8   \n\
>+      # Adjust $sp for 16-aligned   \n\
>+      srli.d  $t0, $sp, 4   \n\
>+      slli.d  $t0, $t0, 4   \n\
>+      ori	$t1, $sp, 0   \n\
>+      addi.d  $sp, $t0, -32   \n\
>+      st.d	$t1, $sp, 24   \n\
>+      # Call the function to run the initializers.   \n\
>+      bl	_dl_init   \n\
>+      # Pass our finalizer function to _start.   \n\
>+      ld.d    $sp, $sp, 24   \n\
>+      la	$a0, _dl_fini   \n\
>+      # Jump to the user entry point.   \n\
>+      jirl	$zero, $s0, 0   \n\
>+      " _RTLD_EPILOGUE (ENTRY_POINT) "\
>+      .previous");
>+
>+/* Names of the architecture-specific auditing callback functions.  */
>+#define ARCH_LA_PLTENTER loongarch_gnu_pltenter
>+#define ARCH_LA_PLTEXIT loongarch_gnu_pltexit
>+
>+/* Bias .got.plt entry by the offset requested by the PLT header.  */
>+#define elf_machine_plt_value(map, reloc, value) (value)
>+
>+static inline ElfW (Addr)
>+  elf_machine_fixup_plt (struct link_map *map, lookup_t t,
>+			 const ElfW (Sym) * refsym, const ElfW (Sym) * sym,
>+			 const ElfW (Rela) * reloc, ElfW (Addr) * reloc_addr,
>+			 ElfW (Addr) value)
>+{
>+  return *reloc_addr = value;
>+}
>+
>+#endif /* !dl_machine_h */
>+
>+#ifdef RESOLVE_MAP
>+
>+/* Perform a relocation described by R_INFO at the location pointed to
>+   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
>+   MAP is the object containing the reloc.  */
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
>+		  const ElfW (Rela) * reloc,
>+		  const ElfW (Sym) * sym,
>+		  const struct r_found_version *version,
>+		  void *const reloc_addr, int skip_ifunc)
>+{
>+  ElfW (Addr) r_info = reloc->r_info;
>+  const unsigned long int r_type = ELFW (R_TYPE) (r_info);
>+  ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr;
>+  const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym;
>+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
>+  ElfW (Addr) value = 0;
>+  if (sym_map != NULL)
>+    value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
>+
>+  if (sym != NULL
>+      && __builtin_expect (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
>+      && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
>+      && __builtin_expect (!skip_ifunc, 1))
>+    value = ((ElfW (Addr) (*) (int)) value) (GLRO (dl_hwcap));
>+
>+  switch (r_type)
>+    {
>+#ifndef RTLD_BOOTSTRAP
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPMOD64:
>+    R_LARCH_TLS_DTPMOD32:
>+      if (sym_map)
>+	*addr_field = sym_map->l_tls_modid;
>+      break;
>+
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64:
>+    R_LARCH_TLS_DTPREL32:
>+      if (sym != NULL)
>+	*addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend;
>+      break;
>+
>+    case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64:
>+    R_LARCH_TLS_TPREL32:
>+      if (sym != NULL)
>+	{
>+	  CHECK_STATIC_TLS (map, sym_map);
>+	  *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend;
>+	}
>+      break;
>+
>+    case R_LARCH_COPY:
>+      {
>+	if (__glibc_unlikely (sym == NULL))
>+	  /* This can happen in trace mode if an object could not be
>+	     found.  */
>+	  break;
>+
>+	/* Handle TLS copy relocations.  */
>+	if (__glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_TLS))
>+	  {
>+	    /* There's nothing to do if the symbol is in .tbss.  */
>+	    if (__glibc_likely (sym->st_value
>+				>= sym_map->l_tls_initimage_size))
>+	      break;
>+	    value += (ElfW (Addr)) sym_map->l_tls_initimage - sym_map->l_addr;
>+	  }

Please don't copy TLS copy relocations from riscv. It was a mistake:
https://sourceware.org/bugzilla/show_bug.cgi?id=23825

>+	size_t size = sym->st_size;
>+	if (__glibc_unlikely (sym->st_size != refsym->st_size))
>+	  {
>+	    const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
>+	    if (sym->st_size > refsym->st_size)
>+	      size = refsym->st_size;
>+	    if (sym->st_size > refsym->st_size || GLRO (dl_verbose))
>+	      _dl_error_printf ("\
>+  %s: Symbol `%s' has different size in shared object, consider re-linking\n",
>+				rtld_progname ?: "<program name unknown>",
>+				strtab + refsym->st_name);
>+	  }
>+
>+	memcpy (reloc_addr, (void *) value, size);
>+	break;
>+      }
>+#endif
>+
>+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
>+    case R_LARCH_RELATIVE:

I have recently removed HAVE_Z_COMBRELOC. Please remove it here.

>+      {
>+#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
>+	/* This is defined in rtld.c, but nowhere in the static libc.a;
>+	   make the reference weak so static programs can still link.
>+	   This declaration cannot be done when compiling rtld.c
>+	   (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
>+	   common defn for _dl_rtld_map, which is incompatible with a
>+	   weak decl in the same file.  */
>+#ifndef SHARED
>+	weak_extern (GL (dl_rtld_map));
>+#endif
>+	if (map != &GL (dl_rtld_map)) /* Already done in rtld itself.  */
>+#endif
>+	  *addr_field = map->l_addr + reloc->r_addend;
>+	break;
>+      }
>+#endif
>+
>+    case R_LARCH_JUMP_SLOT:
>+    case __WORDSIZE == 64 ? R_LARCH_64:
>+    R_LARCH_32:
>+      *addr_field = value;
>+      break;
>+
>+    case R_LARCH_IRELATIVE:
>+      value = map->l_addr + reloc->r_addend;
>+      if (__glibc_likely (!skip_ifunc))
>+	value = ((ElfW (Addr) (*) (void)) value) ();
>+      *addr_field = value;
>+      break;
>+
>+    case R_LARCH_NONE:
>+      break;
>+    default:
>+      _dl_reloc_bad_type (map, r_type, 0);
>+      break;
>+    }
>+}
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) * reloc,
>+			   void *const reloc_addr)
>+{
>+  *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend;
>+}
>+
>+static inline void __attribute__ ((always_inline))
>+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
>+		      ElfW (Addr) l_addr,
>+		      const ElfW (Rela) * reloc, int skip_ifunc)
>+{
>+  ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
>+  const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
>+
>+  /* Check for unexpected PLT reloc type.  */
>+  if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT))
>+    {
>+      if (__glibc_unlikely (map->l_mach.plt == 0))
>+	{
>+	  if (l_addr)
>+	    *reloc_addr += l_addr;
>+	}
>+      else
>+	*reloc_addr = map->l_mach.plt;
>+    }
>+  else if (__glibc_unlikely (r_type == R_LARCH_IRELATIVE))
>+    {
>+      ElfW (Addr) *value = (void *) (l_addr + reloc->r_addend);
>+      if (__glibc_likely (!skip_ifunc))
>+	value = (ElfW (Addr) *) ((ElfW (Addr) (*) (void)) value) ();
>+      *reloc_addr = (ElfW (Addr)) value;
>+    }
>+  else
>+    _dl_reloc_bad_type (map, r_type, 1);
>+}

If you can ensure ld doesn't place IRELATIVE in .rela.plt, you can drop
IRELATIVE check in this function.

>+/* Set up the loaded object described by L so its stub function
>+   will jump to the on-demand fixup code __dl_runtime_resolve.  */
>+
>+static inline int __attribute__ ((always_inline))
>+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>+			   int lazy, int profile)
>+{
>+#ifndef RTLD_BOOTSTRAP
>+  /* If using PLTs, fill in the first two entries of .got.plt.  */
>+  if (l->l_info[DT_JMPREL])
>+    {
>+      extern void _dl_runtime_resolve (void)
>+	__attribute__ ((visibility ("hidden")));
>+      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
>+      /* If a library is prelinked but we have to relocate anyway,
>+	 we have to be able to undo the prelinking of .got.plt.
>+	 The prelinker saved the address of .plt for us here.  */

prelink has been deprecated and will be removed. You can drop complexity
here and avoid mentioning prelink.

>+      if (gotplt[1])
>+	l->l_mach.plt = gotplt[1] + l->l_addr;
>+      gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve;
>+      gotplt[1] = (ElfW (Addr)) l;
>+    }
>+#endif
>+
>+  return lazy;
>+}
>+
>+#endif /* RESOLVE_MAP */
>diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
>new file mode 100644
>index 0000000000..eb610392f6
>--- /dev/null
>+++ b/sysdeps/loongarch/dl-trampoline.S
>@@ -0,0 +1,91 @@
>+/* PLT trampolines.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+/* Assembler veneer called from the PLT header code for lazy loading.
>+   The PLT header passes its own args in t0-t2.  */
>+
>+#ifdef __loongarch_soft_float
>+# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
>+#else
>+# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
>+#endif
>+
>+ENTRY (_dl_runtime_resolve)
>+
>+	/* Save arguments to stack. */
>+	ADDI	sp, sp, -FRAME_SIZE
>+
>+	REG_S	ra, sp, 9*SZREG
>+	REG_S	a0, sp, 1*SZREG
>+	REG_S	a1, sp, 2*SZREG
>+	REG_S	a2, sp, 3*SZREG
>+	REG_S	a3, sp, 4*SZREG
>+	REG_S	a4, sp, 5*SZREG
>+	REG_S	a5, sp, 6*SZREG
>+	REG_S	a6, sp, 7*SZREG
>+	REG_S	a7, sp, 8*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_S	fa0, sp, 10*SZREG + 0*SZFREG
>+	FREG_S	fa1, sp, 10*SZREG + 1*SZFREG
>+	FREG_S	fa2, sp, 10*SZREG + 2*SZFREG
>+	FREG_S	fa3, sp, 10*SZREG + 3*SZFREG
>+	FREG_S	fa4, sp, 10*SZREG + 4*SZFREG
>+	FREG_S	fa5, sp, 10*SZREG + 5*SZFREG
>+	FREG_S	fa6, sp, 10*SZREG + 6*SZFREG
>+	FREG_S	fa7, sp, 10*SZREG + 7*SZFREG
>+#endif
>+
>+	/* Update .got.plt and obtain runtime address of callee */
>+	SLLI	a1, t1, 1
>+	or	a0, t0, zero
>+	ADD	a1, a1, t1
>+	la	a2, _dl_fixup
>+	jirl	ra, a2, 0
>+	or	t1, v0, zero
>+
>+	/* Restore arguments from stack. */
>+	REG_L	ra, sp, 9*SZREG
>+	REG_L	a0, sp, 1*SZREG
>+	REG_L	a1, sp, 2*SZREG
>+	REG_L	a2, sp, 3*SZREG
>+	REG_L	a3, sp, 4*SZREG
>+	REG_L	a4, sp, 5*SZREG
>+	REG_L	a5, sp, 6*SZREG
>+	REG_L	a6, sp, 7*SZREG
>+	REG_L	a7, sp, 8*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_L	fa0, sp, 10*SZREG + 0*SZFREG
>+	FREG_L	fa1, sp, 10*SZREG + 1*SZFREG
>+	FREG_L	fa2, sp, 10*SZREG + 2*SZFREG
>+	FREG_L	fa3, sp, 10*SZREG + 3*SZFREG
>+	FREG_L	fa4, sp, 10*SZREG + 4*SZFREG
>+	FREG_L	fa5, sp, 10*SZREG + 5*SZFREG
>+	FREG_L	fa6, sp, 10*SZREG + 6*SZFREG
>+	FREG_L	fa7, sp, 10*SZREG + 7*SZFREG
>+#endif
>+
>+	ADDI	sp, sp, FRAME_SIZE
>+
>+	/* Invoke the callee. */
>+	jirl		zero, t1, 0
>+END (_dl_runtime_resolve)
>diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
>new file mode 100644
>index 0000000000..a4b8ea690e
>--- /dev/null
>+++ b/sysdeps/loongarch/jmpbuf-offsets.h
>@@ -0,0 +1,22 @@
>+/* Private macros for accessing __jmp_buf contents.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public License as
>+   published by the Free Software Foundation; either version 2.1 of the
>+   License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <jmpbuf-unwind.h>
>+
>+/* Helper for generic ____longjmp_chk().  */
>+#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))
>diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
>new file mode 100644
>index 0000000000..6fa509151d
>--- /dev/null
>+++ b/sysdeps/loongarch/jmpbuf-unwind.h
>@@ -0,0 +1,45 @@
>+/* Examine __jmp_buf for unwinding frames.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <setjmp.h>
>+#include <stdint.h>
>+#include <unwind.h>
>+#include <sysdep.h>
>+
>+/* Test if longjmp to JMPBUF would unwind the frame
>+   containing a local variable at ADDRESS.  */
>+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
>+  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp))
>+
>+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
>+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
>+
>+static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs)
>+{
>+  uintptr_t sp = regs[0].__sp;
>+#ifdef PTR_DEMANGLE
>+  PTR_DEMANGLE (sp);
>+#endif
>+  return sp;
>+}
>+
>+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
>+  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
>+
>+/* We use the normal longjmp for unwinding.  */
>+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
>diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h
>new file mode 100644
>index 0000000000..36b1b25b9f
>--- /dev/null
>+++ b/sysdeps/loongarch/ldsodefs.h
>@@ -0,0 +1,41 @@
>+/* Run-time dynamic linker data structures for loaded ELF shared objects.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _LOONGARCH_LDSODEFS_H
>+#define _LOONGARCH_LDSODEFS_H 1
>+
>+#include <elf.h>
>+
>+struct La_loongarch_regs;
>+struct La_loongarch_retval;
>+
>+#define ARCH_PLTENTER_MEMBERS \
>+  ElfW (Addr) (*loongarch_gnu_pltenter) (ElfW (Sym) *, unsigned int, \
>+					 uintptr_t *, uintptr_t *, \
>+					 const struct La_loongarch_regs *, \
>+					 unsigned int *, const char *name, \
>+					 long int *framesizep);
>+
>+#define ARCH_PLTEXIT_MEMBERS \
>+  unsigned int (*loongarch_gnu_pltexit) (ElfW (Sym) *, unsigned int, \
>+		uintptr_t *, uintptr_t *, const struct La_loongarch_regs *, \
>+		struct La_loongarch_retval *, const char *);
>+
>+#include_next <ldsodefs.h>
>+
>+#endif
>diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h
>new file mode 100644
>index 0000000000..bbba73ed70
>--- /dev/null
>+++ b/sysdeps/loongarch/linkmap.h
>@@ -0,0 +1,22 @@
>+/* Definition of link_map_machine.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+struct link_map_machine
>+{
>+  ElfW (Addr) plt; /* Address of .plt.  */
>+};
>diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
>new file mode 100644
>index 0000000000..4a3cdd964e
>--- /dev/null
>+++ b/sysdeps/loongarch/machine-gmon.h
>@@ -0,0 +1,37 @@
>+/* LoongArch definitions for profiling support.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library; if not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+/* Accept 'frompc' address as argument from the function that calls
>+   _mcount for profiling.  Use  __builtin_return_address (0)
>+   for the 'selfpc' address.  */
>+
>+#include <sysdep.h>
>+
>+static void mcount_internal (unsigned long int frompc,
>+			     unsigned long int selfpc);
>+
>+#define _MCOUNT_DECL(frompc, selfpc) \
>+  static inline void mcount_internal (unsigned long int frompc, \
>+				      unsigned long int selfpc)
>+
>+#define MCOUNT \
>+  void _mcount (void *frompc) \
>+  { \
>+    mcount_internal ((unsigned long int) frompc, \
>+		     (unsigned long int) RETURN_ADDRESS (0)); \
>+  }
>diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
>new file mode 100644
>index 0000000000..b93ae2f5da
>--- /dev/null
>+++ b/sysdeps/loongarch/setjmp.S
>@@ -0,0 +1,66 @@
>+/* setjmp for LoongArch.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#include <sysdep.h>
>+#include <sys/asm.h>
>+
>+ENTRY (_setjmp)
>+	li.w		a1,0
>+	b		__sigsetjmp
>+END (_setjmp)
>+
>+ENTRY (setjmp)
>+	li.w		a1,1
>+END (setjmp)
>+
>+ENTRY (__sigsetjmp)
>+	REG_S ra, a0, 0*SZREG
>+	REG_S sp, a0, 1*SZREG
>+	REG_S x,  a0, 2*SZREG
>+	REG_S fp, a0, 3*SZREG
>+	REG_S s0, a0, 4*SZREG
>+	REG_S s1, a0, 5*SZREG
>+	REG_S s2, a0, 6*SZREG
>+	REG_S s3, a0, 7*SZREG
>+	REG_S s4, a0, 8*SZREG
>+	REG_S s5, a0, 9*SZREG
>+	REG_S s6, a0, 10*SZREG
>+	REG_S s7, a0, 11*SZREG
>+	REG_S s8, a0, 12*SZREG
>+
>+#ifndef __loongarch_soft_float
>+	FREG_S $f24, a0, 13*SZREG + 0*SZFREG
>+	FREG_S $f25, a0, 13*SZREG + 1*SZFREG
>+	FREG_S $f26, a0, 13*SZREG + 2*SZFREG
>+	FREG_S $f27, a0, 13*SZREG + 3*SZFREG
>+	FREG_S $f28, a0, 13*SZREG + 4*SZFREG
>+	FREG_S $f29, a0, 13*SZREG + 5*SZFREG
>+	FREG_S $f30, a0, 13*SZREG + 6*SZFREG
>+	FREG_S $f31, a0, 13*SZREG + 7*SZFREG
>+#endif
>+
>+#if !IS_IN (libc) && IS_IN(rtld)
>+	li.w		v0, 0
>+	jirl		zero,ra,0
>+#else
>+	b		__sigjmp_save
>+#endif
>+END (__sigsetjmp)
>+
>+hidden_def (__sigsetjmp)
>+weak_alias (_setjmp, __GI__setjmp)
>diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
>new file mode 100644
>index 0000000000..5b15f4815a
>--- /dev/null
>+++ b/sysdeps/loongarch/sotruss-lib.c
>@@ -0,0 +1,50 @@
>+/* Override generic sotruss-lib.c to define actual functions for LoongArch.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define HAVE_ARCH_PLTENTER
>+#define HAVE_ARCH_PLTEXIT
>+
>+#include <elf/sotruss-lib.c>
>+
>+ElfW (Addr)
>+la_loongarch_gnu_pltenter (ElfW (Sym) * sym __attribute__ ((unused)),
>+			   unsigned int ndx __attribute__ ((unused)),
>+			   uintptr_t *refcook, uintptr_t *defcook,
>+			   La_loongarch_regs *regs, unsigned int *flags,
>+			   const char *symname, long int *framesizep)
>+{
>+  print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1],
>+		   regs->lr_reg[2], *flags);
>+
>+  /* No need to copy anything, we will not need the parameters in any case.  */
>+  *framesizep = 0;
>+
>+  return sym->st_value;
>+}
>+
>+unsigned int
>+la_loongarch_gnu_pltexit (ElfW (Sym) * sym, unsigned int ndx,
>+			  uintptr_t *refcook, uintptr_t *defcook,
>+			  const struct La_loongarch_regs *inregs,
>+			  struct La_loongarch_retval *outregs,
>+			  const char *symname)
>+{
>+  print_exit (refcook, defcook, symname, outregs->lrv_a0);
>+
>+  return 0;
>+}
>diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
>new file mode 100644
>index 0000000000..a9b32aa966
>--- /dev/null
>+++ b/sysdeps/loongarch/start.S
>@@ -0,0 +1,67 @@
>+/* Startup code compliant to the ELF LoongArch ABI.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define __ASSEMBLY__ 1
>+#include <entry.h>
>+#include <sys/asm.h>
>+
>+/* The entry point's job is to call __libc_start_main.  Per the ABI,
>+   a0 contains the address of a function to be passed to atexit.
>+   __libc_start_main wants this in a5.  */
>+
>+/*
>+int
>+__libc_start_main (int (*main) (int, char **, char **),
>+		   int argc,
>+		   char **argv,
>+		   __typeof (main) init,
>+		   void (*fini) (void),
>+		   void (*rtld_fini) (void),
>+		   void *stack_end);
>+ */
>+
>+ENTRY (ENTRY_POINT)
>+
>+/* Terminate call stack by noting ra is undefined.  Use a dummy
>+   .cfi_label to force starting the FDE.  */
>+	.cfi_label .Ldummy
>+	cfi_undefined (1)
>+	or		a5, a0, zero /* rtld_fini */
>+
>+/* We must get symbol main through GOT table, since main may not be local.
>+   For instance: googletest defines main in dynamic library.  */
>+	la.got		a0, t0, main
>+	REG_L		a1, sp, 0
>+	ADDI		a2, sp, SZREG
>+
>+	/* Adjust $sp for 16-aligned */
>+	SRLI		sp, sp, 4
>+	SLLI		sp, sp, 4
>+
>+	move		a3, zero /* used to be init */
>+	move		a4, zero /* used to be fini */
>+	or		a6, sp, zero /* stack_end */
>+
>+	la.got		ra, t0, __libc_start_main
>+	jirl		ra, ra, 0
>+
>+	la.got		ra, t0, abort
>+	jirl		ra, ra, 0
>+END (ENTRY_POINT)
>+
>diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h
>new file mode 100644
>index 0000000000..b41ee59694
>--- /dev/null
>+++ b/sysdeps/loongarch/sys/asm.h
>@@ -0,0 +1,59 @@
>+/* Miscellaneous macros.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#ifndef _SYS_ASM_H
>+#define _SYS_ASM_H
>+
>+#include <sys/regdef.h>
>+#include <sysdeps/generic/sysdep.h>
>+
>+/* Macros to handle different pointer/register sizes for 32/64-bit code.  */
>+#define SZREG 8
>+#define SZFREG 8
>+#define REG_L ld.d
>+#define REG_S st.d
>+#define SRLI srli.d
>+#define SLLI slli.d
>+#define ADDI addi.d
>+#define ADD  add.d
>+#define BSTRINS  bstrins.d
>+#define LI  li.d
>+#define FREG_L fld.d
>+#define FREG_S fst.d
>+
>+/* Declare leaf routine.  */
>+#define LEAF(symbol) \
>+  .text; \
>+  .globl symbol; \
>+  .align 3; \
>+  cfi_startproc; \
>+  .type symbol, @function; \
>+  symbol:
>+
>+#define ENTRY(symbol) LEAF (symbol)
>+
>+/* Mark end of function.  */
>+#undef END
>+#define END(function) \
>+  cfi_endproc; \
>+  .size function, .- function;
>+
>+/* Stack alignment.  */
>+#define ALMASK ~15
>+
>+#endif /* sys/asm.h */
>diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
>new file mode 100644
>index 0000000000..e71948c86e
>--- /dev/null
>+++ b/sysdeps/loongarch/tst-audit.h
>@@ -0,0 +1,23 @@
>+/* Definitions for testing PLT entry/exit auditing.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <https://www.gnu.org/licenses/>.  */
>+
>+#define pltenter la_loongarch_gnu_pltenter
>+#define pltexit la_loongarch_gnu_pltexit
>+#define La_regs La_loongarch_regs
>+#define La_retval La_loongarch_retval
>+#define int_retval lrv_a0
>diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>new file mode 100644
>index 0000000000..4887c30ca2
>--- /dev/null
>+++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
>@@ -0,0 +1,26 @@
>+/* ldconfig default paths and libraries.
>+   Copyright (C) 2022 Free Software Foundation, Inc.
>+   This file is part of the GNU C Library.
>+
>+   The GNU C Library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 2.1 of the License, or (at your option) any later version.
>+
>+   The GNU C Library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Lesser General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public
>+   License along with the GNU C Library.  If not, see
>+   <http://www.gnu.org/licenses/>.  */
>+
>+#include <sysdeps/generic/ldconfig.h>
>+
>+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
>+  { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
>+
>+#define SYSDEP_KNOWN_LIBRARY_NAMES	\
>+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
>+  { "libm.so.6", FLAG_ELF_LIBC6 },
>-- 
>2.31.1
>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  8:20   ` Fangrui Song
@ 2022-05-09 11:33     ` Adhemerval Zanella
  0 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2022-05-09 11:33 UTC (permalink / raw)
  To: libc-alpha



On 09/05/2022 05:20, Fangrui Song via Libc-alpha wrote:
> 
>> +/* Set up the loaded object described by L so its stub function
>> +   will jump to the on-demand fixup code __dl_runtime_resolve.  */
>> +
>> +static inline int __attribute__ ((always_inline))
>> +elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>> +               int lazy, int profile)
>> +{
>> +#ifndef RTLD_BOOTSTRAP
>> +  /* If using PLTs, fill in the first two entries of .got.plt.  */
>> +  if (l->l_info[DT_JMPREL])
>> +    {
>> +      extern void _dl_runtime_resolve (void)
>> +    __attribute__ ((visibility ("hidden")));
>> +      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
>> +      /* If a library is prelinked but we have to relocate anyway,
>> +     we have to be able to undo the prelinking of .got.plt.
>> +     The prelinker saved the address of .plt for us here.  */
> 
> prelink has been deprecated and will be removed. You can drop complexity
> here and avoid mentioning prelink.

It was removed already.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
  2022-05-09  7:56   ` Fangrui Song
  2022-05-09  8:20   ` Fangrui Song
@ 2022-05-09 12:39   ` Adhemerval Zanella
  2022-05-09 12:46     ` Florian Weimer
  2022-05-29 13:10   ` Adhemerval Zanella
  3 siblings, 1 reply; 20+ messages in thread
From: Adhemerval Zanella @ 2022-05-09 12:39 UTC (permalink / raw)
  To: caiyinyu, libc-alpha; +Cc: joseph_myers, xuchenghua



On 08/05/2022 23:30, caiyinyu wrote:
> ---
>  sysdeps/loongarch/__longjmp.S                |  52 +++
>  sysdeps/loongarch/bits/endianness.h          |  11 +
>  sysdeps/loongarch/bits/link.h                |  58 +++
>  sysdeps/loongarch/bits/setjmp.h              |  42 +++
>  sysdeps/loongarch/bsd-_setjmp.c              |   1 +
>  sysdeps/loongarch/bsd-setjmp.c               |   1 +
>  sysdeps/loongarch/dl-machine.h               | 362 +++++++++++++++++++
>  sysdeps/loongarch/dl-trampoline.S            |  91 +++++
>  sysdeps/loongarch/jmpbuf-offsets.h           |  22 ++
>  sysdeps/loongarch/jmpbuf-unwind.h            |  45 +++
>  sysdeps/loongarch/ldsodefs.h                 |  41 +++
>  sysdeps/loongarch/linkmap.h                  |  22 ++
>  sysdeps/loongarch/machine-gmon.h             |  37 ++
>  sysdeps/loongarch/setjmp.S                   |  66 ++++
>  sysdeps/loongarch/sotruss-lib.c              |  50 +++
>  sysdeps/loongarch/start.S                    |  67 ++++
>  sysdeps/loongarch/sys/asm.h                  |  59 +++
>  sysdeps/loongarch/tst-audit.h                |  23 ++
>  sysdeps/unix/sysv/linux/loongarch/ldconfig.h |  26 ++
>  19 files changed, 1076 insertions(+)
>  create mode 100644 sysdeps/loongarch/__longjmp.S
>  create mode 100644 sysdeps/loongarch/bits/endianness.h
>  create mode 100644 sysdeps/loongarch/bits/link.h
>  create mode 100644 sysdeps/loongarch/bits/setjmp.h
>  create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
>  create mode 100644 sysdeps/loongarch/bsd-setjmp.c
>  create mode 100644 sysdeps/loongarch/dl-machine.h
>  create mode 100644 sysdeps/loongarch/dl-trampoline.S
>  create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
>  create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
>  create mode 100644 sysdeps/loongarch/ldsodefs.h
>  create mode 100644 sysdeps/loongarch/linkmap.h
>  create mode 100644 sysdeps/loongarch/machine-gmon.h
>  create mode 100644 sysdeps/loongarch/setjmp.S
>  create mode 100644 sysdeps/loongarch/sotruss-lib.c
>  create mode 100644 sysdeps/loongarch/start.S
>  create mode 100644 sysdeps/loongarch/sys/asm.h
>  create mode 100644 sysdeps/loongarch/tst-audit.h
>  create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
> 
> diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
> new file mode 100644
> index 0000000000..b7690dd94f
> --- /dev/null
> +++ b/sysdeps/loongarch/__longjmp.S
> @@ -0,0 +1,52 @@
> +/* longjmp.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <sys/asm.h>
> +
> +ENTRY (__longjmp)
> +	REG_L ra, a0, 0*SZREG
> +	REG_L sp, a0, 1*SZREG
> +	REG_L x,  a0, 2*SZREG
> +	REG_L fp, a0, 3*SZREG
> +	REG_L s0, a0, 4*SZREG
> +	REG_L s1, a0, 5*SZREG
> +	REG_L s2, a0, 6*SZREG
> +	REG_L s3, a0, 7*SZREG
> +	REG_L s4, a0, 8*SZREG
> +	REG_L s5, a0, 9*SZREG
> +	REG_L s6, a0, 10*SZREG
> +	REG_L s7, a0, 11*SZREG
> +	REG_L s8, a0, 12*SZREG
> +
> +#ifndef __loongarch_soft_float
> +	FREG_L $f24, a0, 13*SZREG + 0*SZFREG
> +	FREG_L $f25, a0, 13*SZREG + 1*SZFREG
> +	FREG_L $f26, a0, 13*SZREG + 2*SZFREG
> +	FREG_L $f27, a0, 13*SZREG + 3*SZFREG
> +	FREG_L $f28, a0, 13*SZREG + 4*SZFREG
> +	FREG_L $f29, a0, 13*SZREG + 5*SZFREG
> +	FREG_L $f30, a0, 13*SZREG + 6*SZFREG
> +	FREG_L $f31, a0, 13*SZREG + 7*SZFREG
> +#endif
> +
> +	sltui	a0,a1,1
> +	ADD	a0, a0, a1	 # a0 = (a1 == 0) ? 1 : a1
> +	jirl	zero,ra,0
> +
> +END (__longjmp)
> diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
> new file mode 100644
> index 0000000000..7290be7b18
> --- /dev/null
> +++ b/sysdeps/loongarch/bits/endianness.h
> @@ -0,0 +1,11 @@
> +#ifndef _BITS_ENDIANNESS_H
> +#define _BITS_ENDIANNESS_H 1
> +
> +#ifndef _BITS_ENDIAN_H
> +#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
> +#endif
> +
> +/* LoongArch is little-endian.  */
> +#define __BYTE_ORDER __LITTLE_ENDIAN
> +
> +#endif /* bits/endianness.h */
> diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h
> new file mode 100644
> index 0000000000..4df09989cb
> --- /dev/null
> +++ b/sysdeps/loongarch/bits/link.h
> @@ -0,0 +1,58 @@
> +/* Machine-specific declarations for dynamic linker interface.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _LINK_H
> +#error "Never include <bits/link.h> directly; use <link.h> instead."
> +#endif
> +
> +typedef struct La_loongarch_regs
> +{
> +  unsigned long int lr_reg[8]; /* a0 - a7 */
> +  double lr_fpreg[8];	       /* fa0 - fa7 */
> +  unsigned long int lr_ra;
> +  unsigned long int lr_sp;
> +} La_loongarch_regs;
> +
> +/* Return values for calls from PLT on LoongArch.  */
> +typedef struct La_loongarch_retval
> +{
> +  unsigned long int lrv_a0;
> +  unsigned long int lrv_a1;
> +  double lrv_fa0;
> +  double lrv_fa1;
> +} La_loongarch_retval;
> +
> +__BEGIN_DECLS
> +
> +extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) * __sym,
> +					      unsigned int __ndx,
> +					      uintptr_t *__refcook,
> +					      uintptr_t *__defcook,
> +					      La_loongarch_regs *__regs,
> +					      unsigned int *__flags,
> +					      const char *__symname,
> +					      long int *__framesizep);
> +extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) * __sym,
> +					      unsigned int __ndx,
> +					      uintptr_t *__refcook,
> +					      uintptr_t *__defcook,
> +					      const La_loongarch_regs *__inregs,
> +					      La_loongarch_retval *__outregs,
> +					      const char *__symname);
> +
> +__END_DECLS
> diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h
> new file mode 100644
> index 0000000000..8b323ad2b6
> --- /dev/null
> +++ b/sysdeps/loongarch/bits/setjmp.h
> @@ -0,0 +1,42 @@
> +/* Define the machine-dependent type `jmp_buf'.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _LOONGARCH_BITS_SETJMP_H
> +#define _LOONGARCH_BITS_SETJMP_H
> +
> +typedef struct __jmp_buf_internal_tag
> +{
> +  /* Program counter.  */
> +  long int __pc;
> +  /* Stack pointer.  */
> +  long int __sp;
> +  /* Reserved */
> +  long int __x;
> +  /* Frame pointer.  */
> +  long int __fp;
> +  /* Callee-saved registers.  */
> +  long int __regs[9];
> +
> +#ifndef __loongarch_soft_float
> +  /* Callee-saved floating point registers.  */
> +  double __fpregs[8];
> +#endif
> +
> +} __jmp_buf[1];
> +
> +#endif /* _LOONGARCH_BITS_SETJMP_H */
> diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
> new file mode 100644
> index 0000000000..32f49441c3
> --- /dev/null
> +++ b/sysdeps/loongarch/bsd-_setjmp.c
> @@ -0,0 +1 @@
> +/* _setjmp is implemented in setjmp.S.  */
> diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c
> new file mode 100644
> index 0000000000..45fd802aac
> --- /dev/null
> +++ b/sysdeps/loongarch/bsd-setjmp.c
> @@ -0,0 +1 @@
> +/* setjmp is implemented in setjmp.S.  */
> diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
> new file mode 100644
> index 0000000000..68b68e677d
> --- /dev/null
> +++ b/sysdeps/loongarch/dl-machine.h
> @@ -0,0 +1,362 @@
> +/* Machine-dependent ELF dynamic relocation inline functions.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef dl_machine_h
> +#define dl_machine_h
> +
> +#define ELF_MACHINE_NAME "LoongArch"
> +
> +#include <entry.h>
> +#include <elf/elf.h>
> +#include <sys/asm.h>
> +#include <dl-tls.h>
> +#include <dl-static-tls.h>
> +#include <dl-machine-rel.h>
> +
> +#ifndef _RTLD_PROLOGUE
> +# define _RTLD_PROLOGUE(entry)					\
> +	".globl\t" __STRING (entry) "\n\t"			\
> +	".type\t" __STRING (entry) ", @function\n\t"		\
> +	CFI_STARTPROC "\n"					\
> +	__STRING (entry) ":\n"
> +#endif
> +
> +#ifndef _RTLD_EPILOGUE
> +# define _RTLD_EPILOGUE(entry)					\
> +	CFI_ENDPROC "\n\t"					\
> +	".size\t" __STRING (entry) ", . - " __STRING (entry) "\n"
> +#endif
> +
> +#define ELF_MACHINE_JMP_SLOT R_LARCH_JUMP_SLOT
> +#define ELF_MACHINE_IRELATIVE R_LARCH_IRELATIVE
> +
> +#define elf_machine_type_class(type)				\
> +  ((ELF_RTYPE_CLASS_PLT * ((type) == ELF_MACHINE_JMP_SLOT	\
> +     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPREL32)	\
> +     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPMOD32)	\
> +     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_TPREL32)	\
> +     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPREL64)	\
> +     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPMOD64)	\
> +     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_TPREL64)))	\
> +   | (ELF_RTYPE_CLASS_COPY * ((type) == R_LARCH_COPY)))
> +
> +#define ELF_MACHINE_NO_REL 1
> +#define ELF_MACHINE_NO_RELA 0
> +
> +/* Return nonzero iff ELF header is compatible with the running host.  */
> +static inline int __attribute_used__

I am almost sure that with GNU C11 that we use to build glibc there is no need
to use __attribute_used__.  I take you are copy/paste from other ports, but it
would be goot to see if we can clean this up.

> +elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
> +{
> +  /* We can only run LoongArch binaries.  */
> +  if (ehdr->e_machine != EM_LOONGARCH)
> +    return 0;
> +
> +  return 1;
> +}
> +
> +/* Runtime address of .got */
> +#define _GLOBAL_OFFSET_TABLE_ \
> +  ({ \
> +    ElfW (Addr) * r; \
> +    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
> +    r; \
> +  })
> +
> +/* Return the link-time address of _DYNAMIC.  */
> +static inline ElfW (Addr) elf_machine_dynamic (void)
> +{
> +  return _GLOBAL_OFFSET_TABLE_[0];
> +}
> +
> +#define STRINGXP(X) __STRING (X)
> +#define STRINGXV(X) STRINGV_ (X)
> +#define STRINGV_(...) #__VA_ARGS__

These seems not be used on the patch.

> +
> +/* Return the run-time load address of the shared object.  */
> +static inline ElfW (Addr) elf_machine_load_address (void)
> +{
> +  ElfW (Addr) got_linktime_addr;
> +  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
> +      /* Link-time address in GOT entry before runtime relocation */
> +      : "=r"(got_linktime_addr));
> +  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
> +}
> +
> +/* Initial entry point code for the dynamic linker.
> +   The C function `_dl_start' is the real entry point;
> +   its return value is the user program's entry point.  */
> +
> +#define RTLD_START \
> +  asm(".text\n\
> +      " _RTLD_PROLOGUE (ENTRY_POINT) "\
> +      .cfi_label .Ldummy   \n\
> +      " CFI_UNDEFINED (1) "   \n\
> +      or	$a0, $sp, $zero   \n\
> +      bl	_dl_start   \n\
> +      # Stash user entry point in s0.   \n\
> +      or	$s0, $v0, $zero   \n\
> +      # See if we were run as a command with the executable file   \n\
> +      # name as an extra leading argument.   \n\
> +      la	$a0, _dl_skip_args   \n\
> +      ld.w	$a0, $a0, 0   \n\
> +      # Load the original argument count.   \n\
> +      ld.d	$a1, $sp, 0   \n\
> +      # Subtract _dl_skip_args from it.   \n\
> +      sub.d	$a1, $a1, $a0   \n\
> +      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
> +      slli.d	$a0, $a0, 3   \n\
> +      add.d	$sp, $sp, $a0   \n\
> +      # Save back the modified argument count.   \n\
> +      st.d	$a1, $sp, 0   \n\
> +      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
> +		       char **env)    \n\
> +      la	$a0, _rtld_local   \n\
> +      ld.d	$a0, $a0, 0   \n\
> +      addi.d	$a2, $sp, 8   \n\
> +      slli.d	$a3, $a1, 3   \n\
> +      add.d	$a3, $a3, $a2   \n\
> +      addi.d	$a3, $a3, 8   \n\
> +      # Adjust $sp for 16-aligned   \n\
> +      srli.d  $t0, $sp, 4   \n\
> +      slli.d  $t0, $t0, 4   \n\
> +      ori	$t1, $sp, 0   \n\
> +      addi.d  $sp, $t0, -32   \n\
> +      st.d	$t1, $sp, 24   \n\
> +      # Call the function to run the initializers.   \n\
> +      bl	_dl_init   \n\
> +      # Pass our finalizer function to _start.   \n\
> +      ld.d    $sp, $sp, 24   \n\
> +      la	$a0, _dl_fini   \n\
> +      # Jump to the user entry point.   \n\
> +      jirl	$zero, $s0, 0   \n\
> +      " _RTLD_EPILOGUE (ENTRY_POINT) "\
> +      .previous");
> +
> +/* Names of the architecture-specific auditing callback functions.  */
> +#define ARCH_LA_PLTENTER loongarch_gnu_pltenter
> +#define ARCH_LA_PLTEXIT loongarch_gnu_pltexit
> +
> +/* Bias .got.plt entry by the offset requested by the PLT header.  */
> +#define elf_machine_plt_value(map, reloc, value) (value)
> +
> +static inline ElfW (Addr)
> +  elf_machine_fixup_plt (struct link_map *map, lookup_t t,

Indentation seeems off here.

> +			 const ElfW (Sym) * refsym, const ElfW (Sym) * sym,
> +			 const ElfW (Rela) * reloc, ElfW (Addr) * reloc_addr,
> +			 ElfW (Addr) value)
> +{
> +  return *reloc_addr = value;
> +}
> +
> +#endif /* !dl_machine_h */
> +
> +#ifdef RESOLVE_MAP
> +
> +/* Perform a relocation described by R_INFO at the location pointed to
> +   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
> +   MAP is the object containing the reloc.  */
> +
> +static inline void __attribute__ ((always_inline))
> +elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> +		  const ElfW (Rela) * reloc,
> +		  const ElfW (Sym) * sym,
> +		  const struct r_found_version *version,
> +		  void *const reloc_addr, int skip_ifunc)
> +{
> +  ElfW (Addr) r_info = reloc->r_info;
> +  const unsigned long int r_type = ELFW (R_TYPE) (r_info);
> +  ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr;
> +  const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym;
> +  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
> +  ElfW (Addr) value = 0;
> +  if (sym_map != NULL)
> +    value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
> +
> +  if (sym != NULL
> +      && __builtin_expect (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
> +      && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
> +      && __builtin_expect (!skip_ifunc, 1))

I think we should use __glibc_likely on newer code, as you are already doing
below.

> +    value = ((ElfW (Addr) (*) (int)) value) (GLRO (dl_hwcap));
> +
> +  switch (r_type)
> +    {
> +#ifndef RTLD_BOOTSTRAP
> +    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPMOD64:
> +    R_LARCH_TLS_DTPMOD32:
> +      if (sym_map)
> +	*addr_field = sym_map->l_tls_modid;
> +      break;
> +
> +    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64:
> +    R_LARCH_TLS_DTPREL32:
> +      if (sym != NULL)
> +	*addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend;
> +      break;
> +
> +    case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64:
> +    R_LARCH_TLS_TPREL32:
> +      if (sym != NULL)
> +	{
> +	  CHECK_STATIC_TLS (map, sym_map);
> +	  *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend;
> +	}
> +      break;
> +
> +    case R_LARCH_COPY:
> +      {
> +	if (__glibc_unlikely (sym == NULL))
> +	  /* This can happen in trace mode if an object could not be
> +	     found.  */
> +	  break;
> +
> +	/* Handle TLS copy relocations.  */
> +	if (__glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_TLS))
> +	  {
> +	    /* There's nothing to do if the symbol is in .tbss.  */
> +	    if (__glibc_likely (sym->st_value
> +				>= sym_map->l_tls_initimage_size))
> +	      break;
> +	    value += (ElfW (Addr)) sym_map->l_tls_initimage - sym_map->l_addr;
> +	  }
> +
> +	size_t size = sym->st_size;
> +	if (__glibc_unlikely (sym->st_size != refsym->st_size))
> +	  {
> +	    const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
> +	    if (sym->st_size > refsym->st_size)
> +	      size = refsym->st_size;
> +	    if (sym->st_size > refsym->st_size || GLRO (dl_verbose))
> +	      _dl_error_printf ("\
> +  %s: Symbol `%s' has different size in shared object, consider re-linking\n",
> +				rtld_progname ?: "<program name unknown>",
> +				strtab + refsym->st_name);
> +	  }
> +
> +	memcpy (reloc_addr, (void *) value, size);
> +	break;
> +      }
> +#endif
> +
> +#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
> +    case R_LARCH_RELATIVE:
> +      {
> +#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
> +	/* This is defined in rtld.c, but nowhere in the static libc.a;
> +	   make the reference weak so static programs can still link.
> +	   This declaration cannot be done when compiling rtld.c
> +	   (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
> +	   common defn for _dl_rtld_map, which is incompatible with a
> +	   weak decl in the same file.  */
> +#ifndef SHARED
> +	weak_extern (GL (dl_rtld_map));
> +#endif
> +	if (map != &GL (dl_rtld_map)) /* Already done in rtld itself.  */
> +#endif
> +	  *addr_field = map->l_addr + reloc->r_addend;
> +	break;
> +      }
> +#endif
> +
> +    case R_LARCH_JUMP_SLOT:
> +    case __WORDSIZE == 64 ? R_LARCH_64:
> +    R_LARCH_32:
> +      *addr_field = value;
> +      break;
> +
> +    case R_LARCH_IRELATIVE:
> +      value = map->l_addr + reloc->r_addend;
> +      if (__glibc_likely (!skip_ifunc))
> +	value = ((ElfW (Addr) (*) (void)) value) ();
> +      *addr_field = value;
> +      break;
> +
> +    case R_LARCH_NONE:
> +      break;
> +
> +    default:
> +      _dl_reloc_bad_type (map, r_type, 0);
> +      break;
> +    }
> +}
> +
> +static inline void __attribute__ ((always_inline))
> +elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) * reloc,
> +			   void *const reloc_addr)
> +{
> +  *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend;
> +}
> +
> +static inline void __attribute__ ((always_inline))
> +elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
> +		      ElfW (Addr) l_addr,
> +		      const ElfW (Rela) * reloc, int skip_ifunc)
> +{
> +  ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
> +  const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
> +
> +  /* Check for unexpected PLT reloc type.  */
> +  if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT))
> +    {
> +      if (__glibc_unlikely (map->l_mach.plt == 0))
> +	{
> +	  if (l_addr)
> +	    *reloc_addr += l_addr;
> +	}
> +      else
> +	*reloc_addr = map->l_mach.plt;
> +    }
> +  else if (__glibc_unlikely (r_type == R_LARCH_IRELATIVE))
> +    {
> +      ElfW (Addr) *value = (void *) (l_addr + reloc->r_addend);
> +      if (__glibc_likely (!skip_ifunc))
> +	value = (ElfW (Addr) *) ((ElfW (Addr) (*) (void)) value) ();
> +      *reloc_addr = (ElfW (Addr)) value;
> +    }
> +  else
> +    _dl_reloc_bad_type (map, r_type, 1);
> +}
> +
> +/* Set up the loaded object described by L so its stub function
> +   will jump to the on-demand fixup code __dl_runtime_resolve.  */
> +
> +static inline int __attribute__ ((always_inline))
> +elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
> +			   int lazy, int profile)
> +{
> +#ifndef RTLD_BOOTSTRAP
> +  /* If using PLTs, fill in the first two entries of .got.plt.  */
> +  if (l->l_info[DT_JMPREL])
> +    {
> +      extern void _dl_runtime_resolve (void)
> +	__attribute__ ((visibility ("hidden")));
> +      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
> +      /* If a library is prelinked but we have to relocate anyway,
> +	 we have to be able to undo the prelinking of .got.plt.
> +	 The prelinker saved the address of .plt for us here.  */
> +      if (gotplt[1])
> +	l->l_mach.plt = gotplt[1] + l->l_addr;
> +      gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve;
> +      gotplt[1] = (ElfW (Addr)) l;
> +    }
> +#endif
> +
> +  return lazy;
> +}
> +
> +#endif /* RESOLVE_MAP */
> diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
> new file mode 100644
> index 0000000000..eb610392f6
> --- /dev/null
> +++ b/sysdeps/loongarch/dl-trampoline.S
> @@ -0,0 +1,91 @@
> +/* PLT trampolines.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <sys/asm.h>
> +
> +/* Assembler veneer called from the PLT header code for lazy loading.
> +   The PLT header passes its own args in t0-t2.  */
> +
> +#ifdef __loongarch_soft_float
> +# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
> +#else
> +# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
> +#endif
> +
> +ENTRY (_dl_runtime_resolve)
> +
> +	/* Save arguments to stack. */
> +	ADDI	sp, sp, -FRAME_SIZE
> +
> +	REG_S	ra, sp, 9*SZREG
> +	REG_S	a0, sp, 1*SZREG
> +	REG_S	a1, sp, 2*SZREG
> +	REG_S	a2, sp, 3*SZREG
> +	REG_S	a3, sp, 4*SZREG
> +	REG_S	a4, sp, 5*SZREG
> +	REG_S	a5, sp, 6*SZREG
> +	REG_S	a6, sp, 7*SZREG
> +	REG_S	a7, sp, 8*SZREG
> +
> +#ifndef __loongarch_soft_float
> +	FREG_S	fa0, sp, 10*SZREG + 0*SZFREG
> +	FREG_S	fa1, sp, 10*SZREG + 1*SZFREG
> +	FREG_S	fa2, sp, 10*SZREG + 2*SZFREG
> +	FREG_S	fa3, sp, 10*SZREG + 3*SZFREG
> +	FREG_S	fa4, sp, 10*SZREG + 4*SZFREG
> +	FREG_S	fa5, sp, 10*SZREG + 5*SZFREG
> +	FREG_S	fa6, sp, 10*SZREG + 6*SZFREG
> +	FREG_S	fa7, sp, 10*SZREG + 7*SZFREG
> +#endif
> +
> +	/* Update .got.plt and obtain runtime address of callee */
> +	SLLI	a1, t1, 1
> +	or	a0, t0, zero
> +	ADD	a1, a1, t1
> +	la	a2, _dl_fixup
> +	jirl	ra, a2, 0
> +	or	t1, v0, zero
> +
> +	/* Restore arguments from stack. */
> +	REG_L	ra, sp, 9*SZREG
> +	REG_L	a0, sp, 1*SZREG
> +	REG_L	a1, sp, 2*SZREG
> +	REG_L	a2, sp, 3*SZREG
> +	REG_L	a3, sp, 4*SZREG
> +	REG_L	a4, sp, 5*SZREG
> +	REG_L	a5, sp, 6*SZREG
> +	REG_L	a6, sp, 7*SZREG
> +	REG_L	a7, sp, 8*SZREG
> +
> +#ifndef __loongarch_soft_float
> +	FREG_L	fa0, sp, 10*SZREG + 0*SZFREG
> +	FREG_L	fa1, sp, 10*SZREG + 1*SZFREG
> +	FREG_L	fa2, sp, 10*SZREG + 2*SZFREG
> +	FREG_L	fa3, sp, 10*SZREG + 3*SZFREG
> +	FREG_L	fa4, sp, 10*SZREG + 4*SZFREG
> +	FREG_L	fa5, sp, 10*SZREG + 5*SZFREG
> +	FREG_L	fa6, sp, 10*SZREG + 6*SZFREG
> +	FREG_L	fa7, sp, 10*SZREG + 7*SZFREG
> +#endif
> +
> +	ADDI	sp, sp, FRAME_SIZE
> +
> +	/* Invoke the callee. */
> +	jirl		zero, t1, 0
> +END (_dl_runtime_resolve)
> diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
> new file mode 100644
> index 0000000000..a4b8ea690e
> --- /dev/null
> +++ b/sysdeps/loongarch/jmpbuf-offsets.h
> @@ -0,0 +1,22 @@
> +/* Private macros for accessing __jmp_buf contents.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public License as
> +   published by the Free Software Foundation; either version 2.1 of the
> +   License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <jmpbuf-unwind.h>
> +
> +/* Helper for generic ____longjmp_chk().  */
> +#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))
> diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
> new file mode 100644
> index 0000000000..6fa509151d
> --- /dev/null
> +++ b/sysdeps/loongarch/jmpbuf-unwind.h
> @@ -0,0 +1,45 @@
> +/* Examine __jmp_buf for unwinding frames.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <setjmp.h>
> +#include <stdint.h>
> +#include <unwind.h>
> +#include <sysdep.h>
> +
> +/* Test if longjmp to JMPBUF would unwind the frame
> +   containing a local variable at ADDRESS.  */
> +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
> +  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp))
> +
> +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
> +  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
> +
> +static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs)
> +{
> +  uintptr_t sp = regs[0].__sp;
> +#ifdef PTR_DEMANGLE
> +  PTR_DEMANGLE (sp);
> +#endif
> +  return sp;
> +}
> +
> +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
> +  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
> +
> +/* We use the normal longjmp for unwinding.  */
> +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
> diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h
> new file mode 100644
> index 0000000000..36b1b25b9f
> --- /dev/null
> +++ b/sysdeps/loongarch/ldsodefs.h
> @@ -0,0 +1,41 @@
> +/* Run-time dynamic linker data structures for loaded ELF shared objects.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _LOONGARCH_LDSODEFS_H
> +#define _LOONGARCH_LDSODEFS_H 1
> +
> +#include <elf.h>
> +
> +struct La_loongarch_regs;
> +struct La_loongarch_retval;
> +
> +#define ARCH_PLTENTER_MEMBERS \
> +  ElfW (Addr) (*loongarch_gnu_pltenter) (ElfW (Sym) *, unsigned int, \
> +					 uintptr_t *, uintptr_t *, \
> +					 const struct La_loongarch_regs *, \
> +					 unsigned int *, const char *name, \
> +					 long int *framesizep);
> +
> +#define ARCH_PLTEXIT_MEMBERS \
> +  unsigned int (*loongarch_gnu_pltexit) (ElfW (Sym) *, unsigned int, \
> +		uintptr_t *, uintptr_t *, const struct La_loongarch_regs *, \
> +		struct La_loongarch_retval *, const char *);
> +
> +#include_next <ldsodefs.h>
> +
> +#endif
> diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h
> new file mode 100644
> index 0000000000..bbba73ed70
> --- /dev/null
> +++ b/sysdeps/loongarch/linkmap.h
> @@ -0,0 +1,22 @@
> +/* Definition of link_map_machine.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +struct link_map_machine
> +{
> +  ElfW (Addr) plt; /* Address of .plt.  */
> +};
> diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
> new file mode 100644
> index 0000000000..4a3cdd964e
> --- /dev/null
> +++ b/sysdeps/loongarch/machine-gmon.h
> @@ -0,0 +1,37 @@
> +/* LoongArch definitions for profiling support.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +/* Accept 'frompc' address as argument from the function that calls
> +   _mcount for profiling.  Use  __builtin_return_address (0)
> +   for the 'selfpc' address.  */
> +
> +#include <sysdep.h>
> +
> +static void mcount_internal (unsigned long int frompc,
> +			     unsigned long int selfpc);
> +
> +#define _MCOUNT_DECL(frompc, selfpc) \
> +  static inline void mcount_internal (unsigned long int frompc, \
> +				      unsigned long int selfpc)
> +
> +#define MCOUNT \
> +  void _mcount (void *frompc) \
> +  { \
> +    mcount_internal ((unsigned long int) frompc, \
> +		     (unsigned long int) RETURN_ADDRESS (0)); \
> +  }
> diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
> new file mode 100644
> index 0000000000..b93ae2f5da
> --- /dev/null
> +++ b/sysdeps/loongarch/setjmp.S
> @@ -0,0 +1,66 @@
> +/* setjmp for LoongArch.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdep.h>
> +#include <sys/asm.h>
> +
> +ENTRY (_setjmp)
> +	li.w		a1,0
> +	b		__sigsetjmp
> +END (_setjmp)
> +
> +ENTRY (setjmp)
> +	li.w		a1,1
> +END (setjmp)
> +
> +ENTRY (__sigsetjmp)
> +	REG_S ra, a0, 0*SZREG
> +	REG_S sp, a0, 1*SZREG
> +	REG_S x,  a0, 2*SZREG
> +	REG_S fp, a0, 3*SZREG
> +	REG_S s0, a0, 4*SZREG
> +	REG_S s1, a0, 5*SZREG
> +	REG_S s2, a0, 6*SZREG
> +	REG_S s3, a0, 7*SZREG
> +	REG_S s4, a0, 8*SZREG
> +	REG_S s5, a0, 9*SZREG
> +	REG_S s6, a0, 10*SZREG
> +	REG_S s7, a0, 11*SZREG
> +	REG_S s8, a0, 12*SZREG
> +
> +#ifndef __loongarch_soft_float
> +	FREG_S $f24, a0, 13*SZREG + 0*SZFREG
> +	FREG_S $f25, a0, 13*SZREG + 1*SZFREG
> +	FREG_S $f26, a0, 13*SZREG + 2*SZFREG
> +	FREG_S $f27, a0, 13*SZREG + 3*SZFREG
> +	FREG_S $f28, a0, 13*SZREG + 4*SZFREG
> +	FREG_S $f29, a0, 13*SZREG + 5*SZFREG
> +	FREG_S $f30, a0, 13*SZREG + 6*SZFREG
> +	FREG_S $f31, a0, 13*SZREG + 7*SZFREG
> +#endif
> +
> +#if !IS_IN (libc) && IS_IN(rtld)
> +	li.w		v0, 0
> +	jirl		zero,ra,0
> +#else
> +	b		__sigjmp_save
> +#endif
> +END (__sigsetjmp)
> +
> +hidden_def (__sigsetjmp)
> +weak_alias (_setjmp, __GI__setjmp)
> diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
> new file mode 100644
> index 0000000000..5b15f4815a
> --- /dev/null
> +++ b/sysdeps/loongarch/sotruss-lib.c
> @@ -0,0 +1,50 @@
> +/* Override generic sotruss-lib.c to define actual functions for LoongArch.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define HAVE_ARCH_PLTENTER
> +#define HAVE_ARCH_PLTEXIT
> +
> +#include <elf/sotruss-lib.c>
> +
> +ElfW (Addr)
> +la_loongarch_gnu_pltenter (ElfW (Sym) * sym __attribute__ ((unused)),
> +			   unsigned int ndx __attribute__ ((unused)),
> +			   uintptr_t *refcook, uintptr_t *defcook,
> +			   La_loongarch_regs *regs, unsigned int *flags,
> +			   const char *symname, long int *framesizep)
> +{
> +  print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1],
> +		   regs->lr_reg[2], *flags);
> +
> +  /* No need to copy anything, we will not need the parameters in any case.  */
> +  *framesizep = 0;
> +
> +  return sym->st_value;
> +}
> +
> +unsigned int
> +la_loongarch_gnu_pltexit (ElfW (Sym) * sym, unsigned int ndx,
> +			  uintptr_t *refcook, uintptr_t *defcook,
> +			  const struct La_loongarch_regs *inregs,
> +			  struct La_loongarch_retval *outregs,
> +			  const char *symname)
> +{
> +  print_exit (refcook, defcook, symname, outregs->lrv_a0);
> +
> +  return 0;
> +}
> diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
> new file mode 100644
> index 0000000000..a9b32aa966
> --- /dev/null
> +++ b/sysdeps/loongarch/start.S
> @@ -0,0 +1,67 @@
> +/* Startup code compliant to the ELF LoongArch ABI.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __ASSEMBLY__ 1
> +#include <entry.h>
> +#include <sys/asm.h>
> +
> +/* The entry point's job is to call __libc_start_main.  Per the ABI,
> +   a0 contains the address of a function to be passed to atexit.
> +   __libc_start_main wants this in a5.  */
> +
> +/*
> +int
> +__libc_start_main (int (*main) (int, char **, char **),
> +		   int argc,
> +		   char **argv,
> +		   __typeof (main) init,
> +		   void (*fini) (void),
> +		   void (*rtld_fini) (void),
> +		   void *stack_end);
> + */
> +
> +ENTRY (ENTRY_POINT)
> +
> +/* Terminate call stack by noting ra is undefined.  Use a dummy
> +   .cfi_label to force starting the FDE.  */
> +	.cfi_label .Ldummy
> +	cfi_undefined (1)
> +	or		a5, a0, zero /* rtld_fini */
> +
> +/* We must get symbol main through GOT table, since main may not be local.
> +   For instance: googletest defines main in dynamic library.  */
> +	la.got		a0, t0, main
> +	REG_L		a1, sp, 0
> +	ADDI		a2, sp, SZREG
> +
> +	/* Adjust $sp for 16-aligned */
> +	SRLI		sp, sp, 4
> +	SLLI		sp, sp, 4
> +
> +	move		a3, zero /* used to be init */
> +	move		a4, zero /* used to be fini */
> +	or		a6, sp, zero /* stack_end */
> +
> +	la.got		ra, t0, __libc_start_main
> +	jirl		ra, ra, 0
> +
> +	la.got		ra, t0, abort
> +	jirl		ra, ra, 0
> +END (ENTRY_POINT)
> +
> diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h
> new file mode 100644
> index 0000000000..b41ee59694
> --- /dev/null
> +++ b/sysdeps/loongarch/sys/asm.h
> @@ -0,0 +1,59 @@
> +/* Miscellaneous macros.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_ASM_H
> +#define _SYS_ASM_H
> +
> +#include <sys/regdef.h>
> +#include <sysdeps/generic/sysdep.h>
> +
> +/* Macros to handle different pointer/register sizes for 32/64-bit code.  */
> +#define SZREG 8
> +#define SZFREG 8
> +#define REG_L ld.d
> +#define REG_S st.d
> +#define SRLI srli.d
> +#define SLLI slli.d
> +#define ADDI addi.d
> +#define ADD  add.d
> +#define BSTRINS  bstrins.d
> +#define LI  li.d
> +#define FREG_L fld.d
> +#define FREG_S fst.d
> +
> +/* Declare leaf routine.  */
> +#define LEAF(symbol) \
> +  .text; \
> +  .globl symbol; \
> +  .align 3; \
> +  cfi_startproc; \
> +  .type symbol, @function; \
> +  symbol:
> +
> +#define ENTRY(symbol) LEAF (symbol)
> +
> +/* Mark end of function.  */
> +#undef END
> +#define END(function) \
> +  cfi_endproc; \
> +  .size function, .- function;
> +
> +/* Stack alignment.  */
> +#define ALMASK ~15
> +
> +#endif /* sys/asm.h */
> diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
> new file mode 100644
> index 0000000000..e71948c86e
> --- /dev/null
> +++ b/sysdeps/loongarch/tst-audit.h
> @@ -0,0 +1,23 @@
> +/* Definitions for testing PLT entry/exit auditing.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define pltenter la_loongarch_gnu_pltenter
> +#define pltexit la_loongarch_gnu_pltexit
> +#define La_regs La_loongarch_regs
> +#define La_retval La_loongarch_retval
> +#define int_retval lrv_a0
> diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
> new file mode 100644
> index 0000000000..4887c30ca2
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
> @@ -0,0 +1,26 @@
> +/* ldconfig default paths and libraries.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library.  If not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <sysdeps/generic/ldconfig.h>
> +
> +#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> +  { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
> +
> +#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> +  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> +  { "libm.so.6", FLAG_ELF_LIBC6 },

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09 12:39   ` Adhemerval Zanella
@ 2022-05-09 12:46     ` Florian Weimer
  0 siblings, 0 replies; 20+ messages in thread
From: Florian Weimer @ 2022-05-09 12:46 UTC (permalink / raw)
  To: Adhemerval Zanella via Libc-alpha
  Cc: caiyinyu, Adhemerval Zanella, xuchenghua, joseph_myers

* Adhemerval Zanella via Libc-alpha:

>> +/* Return nonzero iff ELF header is compatible with the running host.  */
>> +static inline int __attribute_used__
>
> I am almost sure that with GNU C11 that we use to build glibc there is no need
> to use __attribute_used__.  I take you are copy/paste from other ports, but it
> would be goot to see if we can clean this up.

And __attribute_used__ does more than suppressing the warning: it also
emits a copy for access from assembler code (which is not needed here).

Thanks,
Florian


^ permalink raw reply	[flat|nested] 20+ messages in thread

* 回复: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  7:56   ` Fangrui Song
@ 2022-05-24  9:49     ` caiyinyu
  2022-05-24 19:55       ` Fangrui Song
  0 siblings, 1 reply; 20+ messages in thread
From: caiyinyu @ 2022-05-24  9:49 UTC (permalink / raw)
  To: Fangrui Song; +Cc: libc-alpha, xuchenghua, joseph_myers



从 Windows 版邮件发送

发件人: Fangrui Song
发送时间: 2022年5月9日 16:24
收件人: caiyinyu
抄送: libc-alpha@sourceware.org; xuchenghua@loongson.cn; joseph_myers@mentor.com
主题: Re: [PATCH v4 04/13] LoongArch: ABI Implementation

>+/* Runtime address of .got */
>+#define _GLOBAL_OFFSET_TABLE_ \
>+  ({ \
>+    ElfW (Addr) * r; \
>+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
>+    r; \
>+  })
>+
>+/* Return the link-time address of _DYNAMIC.  */
>+static inline ElfW (Addr) elf_machine_dynamic (void)
>+{
>+  return _GLOBAL_OFFSET_TABLE_[0];
>+}

_GLOBAL_OFFSET_TABLE_[0] == link_time_dynamic is not recommended.
See
https://maskray.me/blog/2021-09-05-build-glibc-with-lld#global_offset_table_0
aarch64/riscv/x86_64/etc have been updated to use the preferred
approach.

Fixed.


diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
index f902410213..361f7555f9 100644
--- a/sysdeps/loongarch/dl-machine.h
+++ b/sysdeps/loongarch/dl-machine.h
@@ -70,28 +70,18 @@ elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
   return 1;
 }

-/* Runtime address of .got */
-#define _GLOBAL_OFFSET_TABLE_ \
-  ({ \
-    ElfW (Addr) * r; \
-    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
-    r; \
-  })
-
-/* Return the link-time address of _DYNAMIC.  */
-static inline ElfW (Addr) elf_machine_dynamic (void)
+/* Return the run-time load address of the shared object.  */
+static inline ElfW (Addr) elf_machine_load_address (void)
 {
-  return _GLOBAL_OFFSET_TABLE_[0];
+  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
+  return (ElfW(Addr)) &__ehdr_start;
 }

-/* Return the run-time load address of the shared object.  */
-static inline ElfW (Addr) elf_machine_load_address (void)
+/* Return the link-time address of _DYNAMIC.  */
+static inline ElfW (Addr) elf_machine_dynamic (void)
 {
-  ElfW (Addr) got_linktime_addr;
-  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
-      /* Link-time address in GOT entry before runtime relocation */
-      : "=r"(got_linktime_addr));
-  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
+  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
+  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
 }





>


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: 回复: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-24  9:49     ` 回复: " caiyinyu
@ 2022-05-24 19:55       ` Fangrui Song
  0 siblings, 0 replies; 20+ messages in thread
From: Fangrui Song @ 2022-05-24 19:55 UTC (permalink / raw)
  To: caiyinyu; +Cc: libc-alpha, xuchenghua, joseph_myers

On 2022-05-24, caiyinyu@loongson.cn wrote:
>
>
>从 Windows 版邮件发送
>
>发件人: Fangrui Song
>发送时间: 2022年5月9日 16:24
>收件人: caiyinyu
>抄送: libc-alpha@sourceware.org; xuchenghua@loongson.cn; joseph_myers@mentor.com
>主题: Re: [PATCH v4 04/13] LoongArch: ABI Implementation
>
>>+/* Runtime address of .got */
>>+#define _GLOBAL_OFFSET_TABLE_ \
>>+  ({ \
>>+    ElfW (Addr) * r; \
>>+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
>>+    r; \
>>+  })
>>+
>>+/* Return the link-time address of _DYNAMIC.  */
>>+static inline ElfW (Addr) elf_machine_dynamic (void)
>>+{
>>+  return _GLOBAL_OFFSET_TABLE_[0];
>>+}
>
>_GLOBAL_OFFSET_TABLE_[0] == link_time_dynamic is not recommended.
>See
>https://maskray.me/blog/2021-09-05-build-glibc-with-lld#global_offset_table_0
>aarch64/riscv/x86_64/etc have been updated to use the preferred
>approach.
>
>Fixed.
>
>
>diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
>index f902410213..361f7555f9 100644
>--- a/sysdeps/loongarch/dl-machine.h
>+++ b/sysdeps/loongarch/dl-machine.h
>@@ -70,28 +70,18 @@ elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
>   return 1;
> }
>
>-/* Runtime address of .got */
>-#define _GLOBAL_OFFSET_TABLE_ \
>-  ({ \
>-    ElfW (Addr) * r; \
>-    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
>-    r; \
>-  })
>-
>-/* Return the link-time address of _DYNAMIC.  */
>-static inline ElfW (Addr) elf_machine_dynamic (void)
>+/* Return the run-time load address of the shared object.  */
>+static inline ElfW (Addr) elf_machine_load_address (void)
> {
>-  return _GLOBAL_OFFSET_TABLE_[0];
>+  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
>+  return (ElfW(Addr)) &__ehdr_start;
> }
>
>-/* Return the run-time load address of the shared object.  */
>-static inline ElfW (Addr) elf_machine_load_address (void)
>+/* Return the link-time address of _DYNAMIC.  */
>+static inline ElfW (Addr) elf_machine_dynamic (void)
> {
>-  ElfW (Addr) got_linktime_addr;
>-  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
>-      /* Link-time address in GOT entry before runtime relocation */
>-      : "=r"(got_linktime_addr));
>-  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
>+  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
>+  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> }

Thank you. The updated elf_machine_load_address and elf_machine_dynamic
look good.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v4 04/13] LoongArch: ABI Implementation
  2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
                     ` (2 preceding siblings ...)
  2022-05-09 12:39   ` Adhemerval Zanella
@ 2022-05-29 13:10   ` Adhemerval Zanella
  3 siblings, 0 replies; 20+ messages in thread
From: Adhemerval Zanella @ 2022-05-29 13:10 UTC (permalink / raw)
  To: caiyinyu, libc-alpha; +Cc: joseph_myers, xuchenghua



On 08/05/2022 23:30, caiyinyu wrote:
> ---
> +/* Return the run-time load address of the shared object.  */
> +static inline ElfW (Addr) elf_machine_load_address (void)
> +{
> +  ElfW (Addr) got_linktime_addr;
> +  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
> +      /* Link-time address in GOT entry before runtime relocation */
> +      : "=r"(got_linktime_addr));
> +  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
> +}
> +
> +/* Initial entry point code for the dynamic linker.
> +   The C function `_dl_start' is the real entry point;
> +   its return value is the user program's entry point.  */
> +
> +#define RTLD_START \
> +  asm(".text\n\
> +      " _RTLD_PROLOGUE (ENTRY_POINT) "\
> +      .cfi_label .Ldummy   \n\
> +      " CFI_UNDEFINED (1) "   \n\
> +      or	$a0, $sp, $zero   \n\
> +      bl	_dl_start   \n\
> +      # Stash user entry point in s0.   \n\
> +      or	$s0, $v0, $zero   \n\
> +      # See if we were run as a command with the executable file   \n\
> +      # name as an extra leading argument.   \n\
> +      la	$a0, _dl_skip_args   \n\
> +      ld.w	$a0, $a0, 0   \n\
> +      # Load the original argument count.   \n\
> +      ld.d	$a1, $sp, 0   \n\
> +      # Subtract _dl_skip_args from it.   \n\
> +      sub.d	$a1, $a1, $a0   \n\
> +      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
> +      slli.d	$a0, $a0, 3   \n\
> +      add.d	$sp, $sp, $a0   \n\
> +      # Save back the modified argument count.   \n\
> +      st.d	$a1, $sp, 0   \n\
> +      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
> +		       char **env)    \n\

Since ad43cac44a6860eaefcadadfb2acb349921e96bf there is no need to adjust the
arguments using _dl_skip_args; if you don't do anything ABI special you just
need to just reload argc from _dl_argc. I have adapted all of architectures to
eventually remove _dl_skip_args [1], so please follow the same pattern here.

[1] https://patchwork.sourceware.org/project/glibc/list/?series=9706

> +      la	$a0, _rtld_local   \n\
> +      ld.d	$a0, $a0, 0   \n\
> +      addi.d	$a2, $sp, 8   \n\
> +      slli.d	$a3, $a1, 3   \n\
> +      add.d	$a3, $a3, $a2   \n\
> +      addi.d	$a3, $a3, 8   \n\
> +      # Adjust $sp for 16-aligned   \n\
> +      srli.d  $t0, $sp, 4   \n\
> +      slli.d  $t0, $t0, 4   \n\
> +      ori	$t1, $sp, 0   \n\
> +      addi.d  $sp, $t0, -32   \n\
> +      st.d	$t1, $sp, 24   \n\
> +      # Call the function to run the initializers.   \n\
> +      bl	_dl_init   \n\
> +      # Pass our finalizer function to _start.   \n\
> +      ld.d    $sp, $sp, 24   \n\
> +      la	$a0, _dl_fini   \n\
> +      # Jump to the user entry point.   \n\
> +      jirl	$zero, $s0, 0   \n\
> +      " _RTLD_EPILOGUE (ENTRY_POINT) "\
> +      .previous");
>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v4 10/13] LoongArch: Add ABI Lists
  2022-05-09  2:25 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
@ 2022-05-09  2:26 ` caiyinyu
  0 siblings, 0 replies; 20+ messages in thread
From: caiyinyu @ 2022-05-09  2:26 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

---
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 11 files changed, 3369 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist

diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
new file mode 100644
index 0000000000..ac925ccb36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:l
+blkcnt_t:l
+blksize_t:i
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:m
+fd_mask:l
+fsblkcnt64_t:m
+fsblkcnt_t:m
+fsfilcnt64_t:m
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:m
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:l
+int8_t:a
+intptr_t:l
+key_t:i
+loff_t:l
+mode_t:j
+nlink_t:j
+off64_t:l
+off_t:l
+pid_t:i
+pthread_attr_t:14pthread_attr_t
+pthread_barrier_t:17pthread_barrier_t
+pthread_barrierattr_t:21pthread_barrierattr_t
+pthread_cond_t:14pthread_cond_t
+pthread_condattr_t:18pthread_condattr_t
+pthread_key_t:j
+pthread_mutex_t:15pthread_mutex_t
+pthread_mutexattr_t:19pthread_mutexattr_t
+pthread_once_t:i
+pthread_rwlock_t:16pthread_rwlock_t
+pthread_rwlockattr_t:20pthread_rwlockattr_t
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:l
+register_t:l
+rlim64_t:m
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:m
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:m
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
new file mode 100644
index 0000000000..93fcd64eee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.36 __libc_stack_end D 0x8
+GLIBC_2.36 __rseq_flags D 0x4
+GLIBC_2.36 __rseq_offset D 0x8
+GLIBC_2.36 __rseq_size D 0x4
+GLIBC_2.36 __stack_chk_guard D 0x8
+GLIBC_2.36 __tls_get_addr F
+GLIBC_2.36 _dl_mcount F
+GLIBC_2.36 _r_debug D 0x28
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
new file mode 100644
index 0000000000..404afa3683
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
@@ -0,0 +1 @@
+GLIBC_2.36 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
new file mode 100644
index 0000000000..f94fd65022
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -0,0 +1,2139 @@
+GLIBC_2.36 _Exit F
+GLIBC_2.36 _Fork F
+GLIBC_2.36 _IO_2_1_stderr_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdin_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdout_ D 0xe0
+GLIBC_2.36 _IO_adjust_column F
+GLIBC_2.36 _IO_adjust_wcolumn F
+GLIBC_2.36 _IO_default_doallocate F
+GLIBC_2.36 _IO_default_finish F
+GLIBC_2.36 _IO_default_pbackfail F
+GLIBC_2.36 _IO_default_uflow F
+GLIBC_2.36 _IO_default_xsgetn F
+GLIBC_2.36 _IO_default_xsputn F
+GLIBC_2.36 _IO_do_write F
+GLIBC_2.36 _IO_doallocbuf F
+GLIBC_2.36 _IO_fclose F
+GLIBC_2.36 _IO_fdopen F
+GLIBC_2.36 _IO_feof F
+GLIBC_2.36 _IO_ferror F
+GLIBC_2.36 _IO_fflush F
+GLIBC_2.36 _IO_fgetpos F
+GLIBC_2.36 _IO_fgetpos64 F
+GLIBC_2.36 _IO_fgets F
+GLIBC_2.36 _IO_file_attach F
+GLIBC_2.36 _IO_file_close F
+GLIBC_2.36 _IO_file_close_it F
+GLIBC_2.36 _IO_file_doallocate F
+GLIBC_2.36 _IO_file_finish F
+GLIBC_2.36 _IO_file_fopen F
+GLIBC_2.36 _IO_file_init F
+GLIBC_2.36 _IO_file_jumps D 0xa8
+GLIBC_2.36 _IO_file_open F
+GLIBC_2.36 _IO_file_overflow F
+GLIBC_2.36 _IO_file_read F
+GLIBC_2.36 _IO_file_seek F
+GLIBC_2.36 _IO_file_seekoff F
+GLIBC_2.36 _IO_file_setbuf F
+GLIBC_2.36 _IO_file_stat F
+GLIBC_2.36 _IO_file_sync F
+GLIBC_2.36 _IO_file_underflow F
+GLIBC_2.36 _IO_file_write F
+GLIBC_2.36 _IO_file_xsputn F
+GLIBC_2.36 _IO_flockfile F
+GLIBC_2.36 _IO_flush_all F
+GLIBC_2.36 _IO_flush_all_linebuffered F
+GLIBC_2.36 _IO_fopen F
+GLIBC_2.36 _IO_fprintf F
+GLIBC_2.36 _IO_fputs F
+GLIBC_2.36 _IO_fread F
+GLIBC_2.36 _IO_free_backup_area F
+GLIBC_2.36 _IO_free_wbackup_area F
+GLIBC_2.36 _IO_fsetpos F
+GLIBC_2.36 _IO_fsetpos64 F
+GLIBC_2.36 _IO_ftell F
+GLIBC_2.36 _IO_ftrylockfile F
+GLIBC_2.36 _IO_funlockfile F
+GLIBC_2.36 _IO_fwrite F
+GLIBC_2.36 _IO_getc F
+GLIBC_2.36 _IO_getline F
+GLIBC_2.36 _IO_getline_info F
+GLIBC_2.36 _IO_gets F
+GLIBC_2.36 _IO_init F
+GLIBC_2.36 _IO_init_marker F
+GLIBC_2.36 _IO_init_wmarker F
+GLIBC_2.36 _IO_iter_begin F
+GLIBC_2.36 _IO_iter_end F
+GLIBC_2.36 _IO_iter_file F
+GLIBC_2.36 _IO_iter_next F
+GLIBC_2.36 _IO_least_wmarker F
+GLIBC_2.36 _IO_link_in F
+GLIBC_2.36 _IO_list_all D 0x8
+GLIBC_2.36 _IO_list_lock F
+GLIBC_2.36 _IO_list_resetlock F
+GLIBC_2.36 _IO_list_unlock F
+GLIBC_2.36 _IO_marker_delta F
+GLIBC_2.36 _IO_marker_difference F
+GLIBC_2.36 _IO_padn F
+GLIBC_2.36 _IO_peekc_locked F
+GLIBC_2.36 _IO_popen F
+GLIBC_2.36 _IO_printf F
+GLIBC_2.36 _IO_proc_close F
+GLIBC_2.36 _IO_proc_open F
+GLIBC_2.36 _IO_putc F
+GLIBC_2.36 _IO_puts F
+GLIBC_2.36 _IO_remove_marker F
+GLIBC_2.36 _IO_seekmark F
+GLIBC_2.36 _IO_seekoff F
+GLIBC_2.36 _IO_seekpos F
+GLIBC_2.36 _IO_seekwmark F
+GLIBC_2.36 _IO_setb F
+GLIBC_2.36 _IO_setbuffer F
+GLIBC_2.36 _IO_setvbuf F
+GLIBC_2.36 _IO_sgetn F
+GLIBC_2.36 _IO_sprintf F
+GLIBC_2.36 _IO_sputbackc F
+GLIBC_2.36 _IO_sputbackwc F
+GLIBC_2.36 _IO_sscanf F
+GLIBC_2.36 _IO_str_init_readonly F
+GLIBC_2.36 _IO_str_init_static F
+GLIBC_2.36 _IO_str_overflow F
+GLIBC_2.36 _IO_str_pbackfail F
+GLIBC_2.36 _IO_str_seekoff F
+GLIBC_2.36 _IO_str_underflow F
+GLIBC_2.36 _IO_sungetc F
+GLIBC_2.36 _IO_sungetwc F
+GLIBC_2.36 _IO_switch_to_get_mode F
+GLIBC_2.36 _IO_switch_to_main_wget_area F
+GLIBC_2.36 _IO_switch_to_wbackup_area F
+GLIBC_2.36 _IO_switch_to_wget_mode F
+GLIBC_2.36 _IO_un_link F
+GLIBC_2.36 _IO_ungetc F
+GLIBC_2.36 _IO_unsave_markers F
+GLIBC_2.36 _IO_unsave_wmarkers F
+GLIBC_2.36 _IO_vfprintf F
+GLIBC_2.36 _IO_vsprintf F
+GLIBC_2.36 _IO_wdefault_doallocate F
+GLIBC_2.36 _IO_wdefault_finish F
+GLIBC_2.36 _IO_wdefault_pbackfail F
+GLIBC_2.36 _IO_wdefault_uflow F
+GLIBC_2.36 _IO_wdefault_xsgetn F
+GLIBC_2.36 _IO_wdefault_xsputn F
+GLIBC_2.36 _IO_wdo_write F
+GLIBC_2.36 _IO_wdoallocbuf F
+GLIBC_2.36 _IO_wfile_jumps D 0xa8
+GLIBC_2.36 _IO_wfile_overflow F
+GLIBC_2.36 _IO_wfile_seekoff F
+GLIBC_2.36 _IO_wfile_sync F
+GLIBC_2.36 _IO_wfile_underflow F
+GLIBC_2.36 _IO_wfile_xsputn F
+GLIBC_2.36 _IO_wmarker_delta F
+GLIBC_2.36 _IO_wsetb F
+GLIBC_2.36 __adjtimex F
+GLIBC_2.36 __argz_count F
+GLIBC_2.36 __argz_next F
+GLIBC_2.36 __argz_stringify F
+GLIBC_2.36 __asprintf F
+GLIBC_2.36 __asprintf_chk F
+GLIBC_2.36 __assert F
+GLIBC_2.36 __assert_fail F
+GLIBC_2.36 __assert_perror_fail F
+GLIBC_2.36 __backtrace F
+GLIBC_2.36 __backtrace_symbols F
+GLIBC_2.36 __backtrace_symbols_fd F
+GLIBC_2.36 __bsd_getpgrp F
+GLIBC_2.36 __bzero F
+GLIBC_2.36 __check_rhosts_file D 0x4
+GLIBC_2.36 __chk_fail F
+GLIBC_2.36 __clone F
+GLIBC_2.36 __close F
+GLIBC_2.36 __cmsg_nxthdr F
+GLIBC_2.36 __confstr_chk F
+GLIBC_2.36 __connect F
+GLIBC_2.36 __ctype_b_loc F
+GLIBC_2.36 __ctype_get_mb_cur_max F
+GLIBC_2.36 __ctype_tolower_loc F
+GLIBC_2.36 __ctype_toupper_loc F
+GLIBC_2.36 __curbrk D 0x8
+GLIBC_2.36 __cxa_at_quick_exit F
+GLIBC_2.36 __cxa_atexit F
+GLIBC_2.36 __cxa_finalize F
+GLIBC_2.36 __cxa_thread_atexit_impl F
+GLIBC_2.36 __cyg_profile_func_enter F
+GLIBC_2.36 __cyg_profile_func_exit F
+GLIBC_2.36 __daylight D 0x4
+GLIBC_2.36 __dcgettext F
+GLIBC_2.36 __dgettext F
+GLIBC_2.36 __dprintf_chk F
+GLIBC_2.36 __dup2 F
+GLIBC_2.36 __duplocale F
+GLIBC_2.36 __endmntent F
+GLIBC_2.36 __environ D 0x8
+GLIBC_2.36 __errno_location F
+GLIBC_2.36 __explicit_bzero_chk F
+GLIBC_2.36 __fbufsize F
+GLIBC_2.36 __fcntl F
+GLIBC_2.36 __fdelt_chk F
+GLIBC_2.36 __fdelt_warn F
+GLIBC_2.36 __ffs F
+GLIBC_2.36 __fgets_chk F
+GLIBC_2.36 __fgets_unlocked_chk F
+GLIBC_2.36 __fgetws_chk F
+GLIBC_2.36 __fgetws_unlocked_chk F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __flbf F
+GLIBC_2.36 __fork F
+GLIBC_2.36 __fpending F
+GLIBC_2.36 __fprintf_chk F
+GLIBC_2.36 __fpu_control D 0x4
+GLIBC_2.36 __fpurge F
+GLIBC_2.36 __fread_chk F
+GLIBC_2.36 __fread_unlocked_chk F
+GLIBC_2.36 __freadable F
+GLIBC_2.36 __freading F
+GLIBC_2.36 __freelocale F
+GLIBC_2.36 __fsetlocking F
+GLIBC_2.36 __fwprintf_chk F
+GLIBC_2.36 __fwritable F
+GLIBC_2.36 __fwriting F
+GLIBC_2.36 __getauxval F
+GLIBC_2.36 __getcwd_chk F
+GLIBC_2.36 __getdelim F
+GLIBC_2.36 __getdomainname_chk F
+GLIBC_2.36 __getgroups_chk F
+GLIBC_2.36 __gethostname_chk F
+GLIBC_2.36 __getlogin_r_chk F
+GLIBC_2.36 __getmntent_r F
+GLIBC_2.36 __getpagesize F
+GLIBC_2.36 __getpgid F
+GLIBC_2.36 __getpid F
+GLIBC_2.36 __gets_chk F
+GLIBC_2.36 __gettimeofday F
+GLIBC_2.36 __getwd_chk F
+GLIBC_2.36 __gmtime_r F
+GLIBC_2.36 __h_errno_location F
+GLIBC_2.36 __isalnum_l F
+GLIBC_2.36 __isalpha_l F
+GLIBC_2.36 __isascii_l F
+GLIBC_2.36 __isblank_l F
+GLIBC_2.36 __iscntrl_l F
+GLIBC_2.36 __isctype F
+GLIBC_2.36 __isdigit_l F
+GLIBC_2.36 __isgraph_l F
+GLIBC_2.36 __isinf F
+GLIBC_2.36 __isinff F
+GLIBC_2.36 __isinfl F
+GLIBC_2.36 __islower_l F
+GLIBC_2.36 __isnan F
+GLIBC_2.36 __isnanf F
+GLIBC_2.36 __isnanl F
+GLIBC_2.36 __isoc99_fscanf F
+GLIBC_2.36 __isoc99_fwscanf F
+GLIBC_2.36 __isoc99_scanf F
+GLIBC_2.36 __isoc99_sscanf F
+GLIBC_2.36 __isoc99_swscanf F
+GLIBC_2.36 __isoc99_vfscanf F
+GLIBC_2.36 __isoc99_vfwscanf F
+GLIBC_2.36 __isoc99_vscanf F
+GLIBC_2.36 __isoc99_vsscanf F
+GLIBC_2.36 __isoc99_vswscanf F
+GLIBC_2.36 __isoc99_vwscanf F
+GLIBC_2.36 __isoc99_wscanf F
+GLIBC_2.36 __isprint_l F
+GLIBC_2.36 __ispunct_l F
+GLIBC_2.36 __isspace_l F
+GLIBC_2.36 __isupper_l F
+GLIBC_2.36 __iswalnum_l F
+GLIBC_2.36 __iswalpha_l F
+GLIBC_2.36 __iswblank_l F
+GLIBC_2.36 __iswcntrl_l F
+GLIBC_2.36 __iswctype F
+GLIBC_2.36 __iswctype_l F
+GLIBC_2.36 __iswdigit_l F
+GLIBC_2.36 __iswgraph_l F
+GLIBC_2.36 __iswlower_l F
+GLIBC_2.36 __iswprint_l F
+GLIBC_2.36 __iswpunct_l F
+GLIBC_2.36 __iswspace_l F
+GLIBC_2.36 __iswupper_l F
+GLIBC_2.36 __iswxdigit_l F
+GLIBC_2.36 __isxdigit_l F
+GLIBC_2.36 __ivaliduser F
+GLIBC_2.36 __libc_allocate_rtsig F
+GLIBC_2.36 __libc_calloc F
+GLIBC_2.36 __libc_current_sigrtmax F
+GLIBC_2.36 __libc_current_sigrtmin F
+GLIBC_2.36 __libc_free F
+GLIBC_2.36 __libc_freeres F
+GLIBC_2.36 __libc_init_first F
+GLIBC_2.36 __libc_mallinfo F
+GLIBC_2.36 __libc_malloc F
+GLIBC_2.36 __libc_mallopt F
+GLIBC_2.36 __libc_memalign F
+GLIBC_2.36 __libc_pvalloc F
+GLIBC_2.36 __libc_realloc F
+GLIBC_2.36 __libc_sa_len F
+GLIBC_2.36 __libc_single_threaded D 0x1
+GLIBC_2.36 __libc_start_main F
+GLIBC_2.36 __libc_valloc F
+GLIBC_2.36 __longjmp_chk F
+GLIBC_2.36 __lseek F
+GLIBC_2.36 __mbrlen F
+GLIBC_2.36 __mbrtowc F
+GLIBC_2.36 __mbsnrtowcs_chk F
+GLIBC_2.36 __mbsrtowcs_chk F
+GLIBC_2.36 __mbstowcs_chk F
+GLIBC_2.36 __memcmpeq F
+GLIBC_2.36 __memcpy_chk F
+GLIBC_2.36 __memmove_chk F
+GLIBC_2.36 __mempcpy F
+GLIBC_2.36 __mempcpy_chk F
+GLIBC_2.36 __memset_chk F
+GLIBC_2.36 __monstartup F
+GLIBC_2.36 __mq_open_2 F
+GLIBC_2.36 __nanosleep F
+GLIBC_2.36 __newlocale F
+GLIBC_2.36 __nl_langinfo_l F
+GLIBC_2.36 __nss_configure_lookup F
+GLIBC_2.36 __nss_hostname_digits_dots F
+GLIBC_2.36 __obstack_printf_chk F
+GLIBC_2.36 __obstack_vprintf_chk F
+GLIBC_2.36 __open F
+GLIBC_2.36 __open64 F
+GLIBC_2.36 __open64_2 F
+GLIBC_2.36 __open_2 F
+GLIBC_2.36 __openat64_2 F
+GLIBC_2.36 __openat_2 F
+GLIBC_2.36 __overflow F
+GLIBC_2.36 __pipe F
+GLIBC_2.36 __poll F
+GLIBC_2.36 __poll_chk F
+GLIBC_2.36 __posix_getopt F
+GLIBC_2.36 __ppoll_chk F
+GLIBC_2.36 __pread64 F
+GLIBC_2.36 __pread64_chk F
+GLIBC_2.36 __pread_chk F
+GLIBC_2.36 __printf_chk F
+GLIBC_2.36 __printf_fp F
+GLIBC_2.36 __profile_frequency F
+GLIBC_2.36 __progname D 0x8
+GLIBC_2.36 __progname_full D 0x8
+GLIBC_2.36 __pthread_cleanup_routine F
+GLIBC_2.36 __pthread_key_create F
+GLIBC_2.36 __pthread_register_cancel F
+GLIBC_2.36 __pthread_register_cancel_defer F
+GLIBC_2.36 __pthread_rwlock_unlock F
+GLIBC_2.36 __pthread_unregister_cancel F
+GLIBC_2.36 __pthread_unregister_cancel_restore F
+GLIBC_2.36 __pthread_unwind_next F
+GLIBC_2.36 __ptsname_r_chk F
+GLIBC_2.36 __pwrite64 F
+GLIBC_2.36 __rawmemchr F
+GLIBC_2.36 __rcmd_errstr D 0x8
+GLIBC_2.36 __read F
+GLIBC_2.36 __read_chk F
+GLIBC_2.36 __readlink_chk F
+GLIBC_2.36 __readlinkat_chk F
+GLIBC_2.36 __realpath_chk F
+GLIBC_2.36 __recv_chk F
+GLIBC_2.36 __recvfrom_chk F
+GLIBC_2.36 __register_atfork F
+GLIBC_2.36 __res_init F
+GLIBC_2.36 __res_nclose F
+GLIBC_2.36 __res_ninit F
+GLIBC_2.36 __res_randomid F
+GLIBC_2.36 __res_state F
+GLIBC_2.36 __sbrk F
+GLIBC_2.36 __sched_cpualloc F
+GLIBC_2.36 __sched_cpucount F
+GLIBC_2.36 __sched_cpufree F
+GLIBC_2.36 __sched_get_priority_max F
+GLIBC_2.36 __sched_get_priority_min F
+GLIBC_2.36 __sched_getparam F
+GLIBC_2.36 __sched_getscheduler F
+GLIBC_2.36 __sched_setscheduler F
+GLIBC_2.36 __sched_yield F
+GLIBC_2.36 __select F
+GLIBC_2.36 __send F
+GLIBC_2.36 __setmntent F
+GLIBC_2.36 __setpgid F
+GLIBC_2.36 __sigaction F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __sigpause F
+GLIBC_2.36 __sigsetjmp F
+GLIBC_2.36 __sigsuspend F
+GLIBC_2.36 __snprintf_chk F
+GLIBC_2.36 __sprintf_chk F
+GLIBC_2.36 __stack_chk_fail F
+GLIBC_2.36 __statfs F
+GLIBC_2.36 __stpcpy F
+GLIBC_2.36 __stpcpy_chk F
+GLIBC_2.36 __stpncpy F
+GLIBC_2.36 __stpncpy_chk F
+GLIBC_2.36 __strcasecmp F
+GLIBC_2.36 __strcasecmp_l F
+GLIBC_2.36 __strcasestr F
+GLIBC_2.36 __strcat_chk F
+GLIBC_2.36 __strcoll_l F
+GLIBC_2.36 __strcpy_chk F
+GLIBC_2.36 __strdup F
+GLIBC_2.36 __strerror_r F
+GLIBC_2.36 __strfmon_l F
+GLIBC_2.36 __strftime_l F
+GLIBC_2.36 __strncasecmp_l F
+GLIBC_2.36 __strncat_chk F
+GLIBC_2.36 __strncpy_chk F
+GLIBC_2.36 __strndup F
+GLIBC_2.36 __strsep_g F
+GLIBC_2.36 __strtod_internal F
+GLIBC_2.36 __strtod_l F
+GLIBC_2.36 __strtof_internal F
+GLIBC_2.36 __strtof_l F
+GLIBC_2.36 __strtok_r F
+GLIBC_2.36 __strtol_internal F
+GLIBC_2.36 __strtol_l F
+GLIBC_2.36 __strtold_internal F
+GLIBC_2.36 __strtold_l F
+GLIBC_2.36 __strtoll_internal F
+GLIBC_2.36 __strtoll_l F
+GLIBC_2.36 __strtoul_internal F
+GLIBC_2.36 __strtoul_l F
+GLIBC_2.36 __strtoull_internal F
+GLIBC_2.36 __strtoull_l F
+GLIBC_2.36 __strverscmp F
+GLIBC_2.36 __strxfrm_l F
+GLIBC_2.36 __swprintf_chk F
+GLIBC_2.36 __sysconf F
+GLIBC_2.36 __syslog_chk F
+GLIBC_2.36 __sysv_signal F
+GLIBC_2.36 __timezone D 0x8
+GLIBC_2.36 __toascii_l F
+GLIBC_2.36 __tolower_l F
+GLIBC_2.36 __toupper_l F
+GLIBC_2.36 __towctrans F
+GLIBC_2.36 __towctrans_l F
+GLIBC_2.36 __towlower_l F
+GLIBC_2.36 __towupper_l F
+GLIBC_2.36 __ttyname_r_chk F
+GLIBC_2.36 __tzname D 0x10
+GLIBC_2.36 __uflow F
+GLIBC_2.36 __underflow F
+GLIBC_2.36 __uselocale F
+GLIBC_2.36 __vasprintf_chk F
+GLIBC_2.36 __vdprintf_chk F
+GLIBC_2.36 __vfork F
+GLIBC_2.36 __vfprintf_chk F
+GLIBC_2.36 __vfscanf F
+GLIBC_2.36 __vfwprintf_chk F
+GLIBC_2.36 __vprintf_chk F
+GLIBC_2.36 __vsnprintf F
+GLIBC_2.36 __vsnprintf_chk F
+GLIBC_2.36 __vsprintf_chk F
+GLIBC_2.36 __vsscanf F
+GLIBC_2.36 __vswprintf_chk F
+GLIBC_2.36 __vsyslog_chk F
+GLIBC_2.36 __vwprintf_chk F
+GLIBC_2.36 __wait F
+GLIBC_2.36 __waitpid F
+GLIBC_2.36 __wcpcpy_chk F
+GLIBC_2.36 __wcpncpy_chk F
+GLIBC_2.36 __wcrtomb_chk F
+GLIBC_2.36 __wcscasecmp_l F
+GLIBC_2.36 __wcscat_chk F
+GLIBC_2.36 __wcscoll_l F
+GLIBC_2.36 __wcscpy_chk F
+GLIBC_2.36 __wcsftime_l F
+GLIBC_2.36 __wcsncasecmp_l F
+GLIBC_2.36 __wcsncat_chk F
+GLIBC_2.36 __wcsncpy_chk F
+GLIBC_2.36 __wcsnrtombs_chk F
+GLIBC_2.36 __wcsrtombs_chk F
+GLIBC_2.36 __wcstod_internal F
+GLIBC_2.36 __wcstod_l F
+GLIBC_2.36 __wcstof_internal F
+GLIBC_2.36 __wcstof_l F
+GLIBC_2.36 __wcstol_internal F
+GLIBC_2.36 __wcstol_l F
+GLIBC_2.36 __wcstold_internal F
+GLIBC_2.36 __wcstold_l F
+GLIBC_2.36 __wcstoll_internal F
+GLIBC_2.36 __wcstoll_l F
+GLIBC_2.36 __wcstombs_chk F
+GLIBC_2.36 __wcstoul_internal F
+GLIBC_2.36 __wcstoul_l F
+GLIBC_2.36 __wcstoull_internal F
+GLIBC_2.36 __wcstoull_l F
+GLIBC_2.36 __wcsxfrm_l F
+GLIBC_2.36 __wctomb_chk F
+GLIBC_2.36 __wctrans_l F
+GLIBC_2.36 __wctype_l F
+GLIBC_2.36 __wmemcpy_chk F
+GLIBC_2.36 __wmemmove_chk F
+GLIBC_2.36 __wmempcpy_chk F
+GLIBC_2.36 __wmemset_chk F
+GLIBC_2.36 __woverflow F
+GLIBC_2.36 __wprintf_chk F
+GLIBC_2.36 __write F
+GLIBC_2.36 __wuflow F
+GLIBC_2.36 __wunderflow F
+GLIBC_2.36 __xpg_basename F
+GLIBC_2.36 __xpg_sigpause F
+GLIBC_2.36 __xpg_strerror_r F
+GLIBC_2.36 _dl_find_object F
+GLIBC_2.36 _dl_mcount_wrapper F
+GLIBC_2.36 _dl_mcount_wrapper_check F
+GLIBC_2.36 _environ D 0x8
+GLIBC_2.36 _exit F
+GLIBC_2.36 _flushlbf F
+GLIBC_2.36 _libc_intl_domainname D 0x5
+GLIBC_2.36 _longjmp F
+GLIBC_2.36 _mcleanup F
+GLIBC_2.36 _mcount F
+GLIBC_2.36 _nl_default_dirname D 0x12
+GLIBC_2.36 _nl_domain_bindings D 0x8
+GLIBC_2.36 _nl_msg_cat_cntr D 0x4
+GLIBC_2.36 _obstack_allocated_p F
+GLIBC_2.36 _obstack_begin F
+GLIBC_2.36 _obstack_begin_1 F
+GLIBC_2.36 _obstack_free F
+GLIBC_2.36 _obstack_memory_used F
+GLIBC_2.36 _obstack_newchunk F
+GLIBC_2.36 _pthread_cleanup_pop F
+GLIBC_2.36 _pthread_cleanup_push F
+GLIBC_2.36 _res D 0x238
+GLIBC_2.36 _res_hconf D 0x48
+GLIBC_2.36 _setjmp F
+GLIBC_2.36 _tolower F
+GLIBC_2.36 _toupper F
+GLIBC_2.36 a64l F
+GLIBC_2.36 abort F
+GLIBC_2.36 abs F
+GLIBC_2.36 accept F
+GLIBC_2.36 accept4 F
+GLIBC_2.36 access F
+GLIBC_2.36 acct F
+GLIBC_2.36 addmntent F
+GLIBC_2.36 addseverity F
+GLIBC_2.36 adjtime F
+GLIBC_2.36 adjtimex F
+GLIBC_2.36 aio_cancel F
+GLIBC_2.36 aio_cancel64 F
+GLIBC_2.36 aio_error F
+GLIBC_2.36 aio_error64 F
+GLIBC_2.36 aio_fsync F
+GLIBC_2.36 aio_fsync64 F
+GLIBC_2.36 aio_init F
+GLIBC_2.36 aio_read F
+GLIBC_2.36 aio_read64 F
+GLIBC_2.36 aio_return F
+GLIBC_2.36 aio_return64 F
+GLIBC_2.36 aio_suspend F
+GLIBC_2.36 aio_suspend64 F
+GLIBC_2.36 aio_write F
+GLIBC_2.36 aio_write64 F
+GLIBC_2.36 alarm F
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 alphasort F
+GLIBC_2.36 alphasort64 F
+GLIBC_2.36 argp_err_exit_status D 0x4
+GLIBC_2.36 argp_error F
+GLIBC_2.36 argp_failure F
+GLIBC_2.36 argp_help F
+GLIBC_2.36 argp_parse F
+GLIBC_2.36 argp_program_bug_address D 0x8
+GLIBC_2.36 argp_program_version D 0x8
+GLIBC_2.36 argp_program_version_hook D 0x8
+GLIBC_2.36 argp_state_help F
+GLIBC_2.36 argp_usage F
+GLIBC_2.36 argz_add F
+GLIBC_2.36 argz_add_sep F
+GLIBC_2.36 argz_append F
+GLIBC_2.36 argz_count F
+GLIBC_2.36 argz_create F
+GLIBC_2.36 argz_create_sep F
+GLIBC_2.36 argz_delete F
+GLIBC_2.36 argz_extract F
+GLIBC_2.36 argz_insert F
+GLIBC_2.36 argz_next F
+GLIBC_2.36 argz_replace F
+GLIBC_2.36 argz_stringify F
+GLIBC_2.36 asctime F
+GLIBC_2.36 asctime_r F
+GLIBC_2.36 asprintf F
+GLIBC_2.36 atof F
+GLIBC_2.36 atoi F
+GLIBC_2.36 atol F
+GLIBC_2.36 atoll F
+GLIBC_2.36 backtrace F
+GLIBC_2.36 backtrace_symbols F
+GLIBC_2.36 backtrace_symbols_fd F
+GLIBC_2.36 basename F
+GLIBC_2.36 bcmp F
+GLIBC_2.36 bcopy F
+GLIBC_2.36 bind F
+GLIBC_2.36 bind_textdomain_codeset F
+GLIBC_2.36 bindresvport F
+GLIBC_2.36 bindtextdomain F
+GLIBC_2.36 brk F
+GLIBC_2.36 bsd_signal F
+GLIBC_2.36 bsearch F
+GLIBC_2.36 btowc F
+GLIBC_2.36 bzero F
+GLIBC_2.36 c16rtomb F
+GLIBC_2.36 c32rtomb F
+GLIBC_2.36 call_once F
+GLIBC_2.36 calloc F
+GLIBC_2.36 canonicalize_file_name F
+GLIBC_2.36 capget F
+GLIBC_2.36 capset F
+GLIBC_2.36 catclose F
+GLIBC_2.36 catgets F
+GLIBC_2.36 catopen F
+GLIBC_2.36 cfgetispeed F
+GLIBC_2.36 cfgetospeed F
+GLIBC_2.36 cfmakeraw F
+GLIBC_2.36 cfsetispeed F
+GLIBC_2.36 cfsetospeed F
+GLIBC_2.36 cfsetspeed F
+GLIBC_2.36 chdir F
+GLIBC_2.36 chflags F
+GLIBC_2.36 chmod F
+GLIBC_2.36 chown F
+GLIBC_2.36 chroot F
+GLIBC_2.36 clearenv F
+GLIBC_2.36 clearerr F
+GLIBC_2.36 clearerr_unlocked F
+GLIBC_2.36 clock F
+GLIBC_2.36 clock_adjtime F
+GLIBC_2.36 clock_getcpuclockid F
+GLIBC_2.36 clock_getres F
+GLIBC_2.36 clock_gettime F
+GLIBC_2.36 clock_nanosleep F
+GLIBC_2.36 clock_settime F
+GLIBC_2.36 clone F
+GLIBC_2.36 close F
+GLIBC_2.36 close_range F
+GLIBC_2.36 closedir F
+GLIBC_2.36 closefrom F
+GLIBC_2.36 closelog F
+GLIBC_2.36 cnd_broadcast F
+GLIBC_2.36 cnd_destroy F
+GLIBC_2.36 cnd_init F
+GLIBC_2.36 cnd_signal F
+GLIBC_2.36 cnd_timedwait F
+GLIBC_2.36 cnd_wait F
+GLIBC_2.36 confstr F
+GLIBC_2.36 connect F
+GLIBC_2.36 copy_file_range F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 creat F
+GLIBC_2.36 creat64 F
+GLIBC_2.36 ctermid F
+GLIBC_2.36 ctime F
+GLIBC_2.36 ctime_r F
+GLIBC_2.36 cuserid F
+GLIBC_2.36 daemon F
+GLIBC_2.36 daylight D 0x4
+GLIBC_2.36 dcgettext F
+GLIBC_2.36 dcngettext F
+GLIBC_2.36 delete_module F
+GLIBC_2.36 dgettext F
+GLIBC_2.36 difftime F
+GLIBC_2.36 dirfd F
+GLIBC_2.36 dirname F
+GLIBC_2.36 div F
+GLIBC_2.36 dl_iterate_phdr F
+GLIBC_2.36 dladdr F
+GLIBC_2.36 dladdr1 F
+GLIBC_2.36 dlclose F
+GLIBC_2.36 dlerror F
+GLIBC_2.36 dlinfo F
+GLIBC_2.36 dlmopen F
+GLIBC_2.36 dlopen F
+GLIBC_2.36 dlsym F
+GLIBC_2.36 dlvsym F
+GLIBC_2.36 dn_comp F
+GLIBC_2.36 dn_expand F
+GLIBC_2.36 dn_skipname F
+GLIBC_2.36 dngettext F
+GLIBC_2.36 dprintf F
+GLIBC_2.36 drand48 F
+GLIBC_2.36 drand48_r F
+GLIBC_2.36 dup F
+GLIBC_2.36 dup2 F
+GLIBC_2.36 dup3 F
+GLIBC_2.36 duplocale F
+GLIBC_2.36 dysize F
+GLIBC_2.36 eaccess F
+GLIBC_2.36 ecvt F
+GLIBC_2.36 ecvt_r F
+GLIBC_2.36 endaliasent F
+GLIBC_2.36 endfsent F
+GLIBC_2.36 endgrent F
+GLIBC_2.36 endhostent F
+GLIBC_2.36 endmntent F
+GLIBC_2.36 endnetent F
+GLIBC_2.36 endnetgrent F
+GLIBC_2.36 endprotoent F
+GLIBC_2.36 endpwent F
+GLIBC_2.36 endrpcent F
+GLIBC_2.36 endservent F
+GLIBC_2.36 endsgent F
+GLIBC_2.36 endspent F
+GLIBC_2.36 endttyent F
+GLIBC_2.36 endusershell F
+GLIBC_2.36 endutent F
+GLIBC_2.36 endutxent F
+GLIBC_2.36 environ D 0x8
+GLIBC_2.36 envz_add F
+GLIBC_2.36 envz_entry F
+GLIBC_2.36 envz_get F
+GLIBC_2.36 envz_merge F
+GLIBC_2.36 envz_remove F
+GLIBC_2.36 envz_strip F
+GLIBC_2.36 epoll_create F
+GLIBC_2.36 epoll_create1 F
+GLIBC_2.36 epoll_ctl F
+GLIBC_2.36 epoll_pwait F
+GLIBC_2.36 epoll_pwait2 F
+GLIBC_2.36 epoll_wait F
+GLIBC_2.36 erand48 F
+GLIBC_2.36 erand48_r F
+GLIBC_2.36 err F
+GLIBC_2.36 error F
+GLIBC_2.36 error_at_line F
+GLIBC_2.36 error_message_count D 0x4
+GLIBC_2.36 error_one_per_line D 0x4
+GLIBC_2.36 error_print_progname D 0x8
+GLIBC_2.36 errx F
+GLIBC_2.36 ether_aton F
+GLIBC_2.36 ether_aton_r F
+GLIBC_2.36 ether_hostton F
+GLIBC_2.36 ether_line F
+GLIBC_2.36 ether_ntoa F
+GLIBC_2.36 ether_ntoa_r F
+GLIBC_2.36 ether_ntohost F
+GLIBC_2.36 euidaccess F
+GLIBC_2.36 eventfd F
+GLIBC_2.36 eventfd_read F
+GLIBC_2.36 eventfd_write F
+GLIBC_2.36 execl F
+GLIBC_2.36 execle F
+GLIBC_2.36 execlp F
+GLIBC_2.36 execv F
+GLIBC_2.36 execve F
+GLIBC_2.36 execveat F
+GLIBC_2.36 execvp F
+GLIBC_2.36 execvpe F
+GLIBC_2.36 exit F
+GLIBC_2.36 explicit_bzero F
+GLIBC_2.36 faccessat F
+GLIBC_2.36 fallocate F
+GLIBC_2.36 fallocate64 F
+GLIBC_2.36 fanotify_init F
+GLIBC_2.36 fanotify_mark F
+GLIBC_2.36 fchdir F
+GLIBC_2.36 fchflags F
+GLIBC_2.36 fchmod F
+GLIBC_2.36 fchmodat F
+GLIBC_2.36 fchown F
+GLIBC_2.36 fchownat F
+GLIBC_2.36 fclose F
+GLIBC_2.36 fcloseall F
+GLIBC_2.36 fcntl F
+GLIBC_2.36 fcntl64 F
+GLIBC_2.36 fcvt F
+GLIBC_2.36 fcvt_r F
+GLIBC_2.36 fdatasync F
+GLIBC_2.36 fdopen F
+GLIBC_2.36 fdopendir F
+GLIBC_2.36 feof F
+GLIBC_2.36 feof_unlocked F
+GLIBC_2.36 ferror F
+GLIBC_2.36 ferror_unlocked F
+GLIBC_2.36 fexecve F
+GLIBC_2.36 fflush F
+GLIBC_2.36 fflush_unlocked F
+GLIBC_2.36 ffs F
+GLIBC_2.36 ffsl F
+GLIBC_2.36 ffsll F
+GLIBC_2.36 fgetc F
+GLIBC_2.36 fgetc_unlocked F
+GLIBC_2.36 fgetgrent F
+GLIBC_2.36 fgetgrent_r F
+GLIBC_2.36 fgetpos F
+GLIBC_2.36 fgetpos64 F
+GLIBC_2.36 fgetpwent F
+GLIBC_2.36 fgetpwent_r F
+GLIBC_2.36 fgets F
+GLIBC_2.36 fgets_unlocked F
+GLIBC_2.36 fgetsgent F
+GLIBC_2.36 fgetsgent_r F
+GLIBC_2.36 fgetspent F
+GLIBC_2.36 fgetspent_r F
+GLIBC_2.36 fgetwc F
+GLIBC_2.36 fgetwc_unlocked F
+GLIBC_2.36 fgetws F
+GLIBC_2.36 fgetws_unlocked F
+GLIBC_2.36 fgetxattr F
+GLIBC_2.36 fileno F
+GLIBC_2.36 fileno_unlocked F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 flistxattr F
+GLIBC_2.36 flock F
+GLIBC_2.36 flockfile F
+GLIBC_2.36 fmemopen F
+GLIBC_2.36 fmtmsg F
+GLIBC_2.36 fnmatch F
+GLIBC_2.36 fopen F
+GLIBC_2.36 fopen64 F
+GLIBC_2.36 fopencookie F
+GLIBC_2.36 fork F
+GLIBC_2.36 forkpty F
+GLIBC_2.36 fpathconf F
+GLIBC_2.36 fprintf F
+GLIBC_2.36 fputc F
+GLIBC_2.36 fputc_unlocked F
+GLIBC_2.36 fputs F
+GLIBC_2.36 fputs_unlocked F
+GLIBC_2.36 fputwc F
+GLIBC_2.36 fputwc_unlocked F
+GLIBC_2.36 fputws F
+GLIBC_2.36 fputws_unlocked F
+GLIBC_2.36 fread F
+GLIBC_2.36 fread_unlocked F
+GLIBC_2.36 free F
+GLIBC_2.36 freeaddrinfo F
+GLIBC_2.36 freeifaddrs F
+GLIBC_2.36 freelocale F
+GLIBC_2.36 fremovexattr F
+GLIBC_2.36 freopen F
+GLIBC_2.36 freopen64 F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fscanf F
+GLIBC_2.36 fseek F
+GLIBC_2.36 fseeko F
+GLIBC_2.36 fseeko64 F
+GLIBC_2.36 fsetpos F
+GLIBC_2.36 fsetpos64 F
+GLIBC_2.36 fsetxattr F
+GLIBC_2.36 fstat F
+GLIBC_2.36 fstat64 F
+GLIBC_2.36 fstatat F
+GLIBC_2.36 fstatat64 F
+GLIBC_2.36 fstatfs F
+GLIBC_2.36 fstatfs64 F
+GLIBC_2.36 fstatvfs F
+GLIBC_2.36 fstatvfs64 F
+GLIBC_2.36 fsync F
+GLIBC_2.36 ftell F
+GLIBC_2.36 ftello F
+GLIBC_2.36 ftello64 F
+GLIBC_2.36 ftime F
+GLIBC_2.36 ftok F
+GLIBC_2.36 ftruncate F
+GLIBC_2.36 ftruncate64 F
+GLIBC_2.36 ftrylockfile F
+GLIBC_2.36 fts64_children F
+GLIBC_2.36 fts64_close F
+GLIBC_2.36 fts64_open F
+GLIBC_2.36 fts64_read F
+GLIBC_2.36 fts64_set F
+GLIBC_2.36 fts_children F
+GLIBC_2.36 fts_close F
+GLIBC_2.36 fts_open F
+GLIBC_2.36 fts_read F
+GLIBC_2.36 fts_set F
+GLIBC_2.36 ftw F
+GLIBC_2.36 ftw64 F
+GLIBC_2.36 funlockfile F
+GLIBC_2.36 futimens F
+GLIBC_2.36 futimes F
+GLIBC_2.36 futimesat F
+GLIBC_2.36 fwide F
+GLIBC_2.36 fwprintf F
+GLIBC_2.36 fwrite F
+GLIBC_2.36 fwrite_unlocked F
+GLIBC_2.36 fwscanf F
+GLIBC_2.36 gai_cancel F
+GLIBC_2.36 gai_error F
+GLIBC_2.36 gai_strerror F
+GLIBC_2.36 gai_suspend F
+GLIBC_2.36 gcvt F
+GLIBC_2.36 get_avphys_pages F
+GLIBC_2.36 get_current_dir_name F
+GLIBC_2.36 get_nprocs F
+GLIBC_2.36 get_nprocs_conf F
+GLIBC_2.36 get_phys_pages F
+GLIBC_2.36 getaddrinfo F
+GLIBC_2.36 getaddrinfo_a F
+GLIBC_2.36 getaliasbyname F
+GLIBC_2.36 getaliasbyname_r F
+GLIBC_2.36 getaliasent F
+GLIBC_2.36 getaliasent_r F
+GLIBC_2.36 getauxval F
+GLIBC_2.36 getc F
+GLIBC_2.36 getc_unlocked F
+GLIBC_2.36 getchar F
+GLIBC_2.36 getchar_unlocked F
+GLIBC_2.36 getcontext F
+GLIBC_2.36 getcpu F
+GLIBC_2.36 getcwd F
+GLIBC_2.36 getdate F
+GLIBC_2.36 getdate_err D 0x4
+GLIBC_2.36 getdate_r F
+GLIBC_2.36 getdelim F
+GLIBC_2.36 getdents64 F
+GLIBC_2.36 getdirentries F
+GLIBC_2.36 getdirentries64 F
+GLIBC_2.36 getdomainname F
+GLIBC_2.36 getdtablesize F
+GLIBC_2.36 getegid F
+GLIBC_2.36 getentropy F
+GLIBC_2.36 getenv F
+GLIBC_2.36 geteuid F
+GLIBC_2.36 getfsent F
+GLIBC_2.36 getfsfile F
+GLIBC_2.36 getfsspec F
+GLIBC_2.36 getgid F
+GLIBC_2.36 getgrent F
+GLIBC_2.36 getgrent_r F
+GLIBC_2.36 getgrgid F
+GLIBC_2.36 getgrgid_r F
+GLIBC_2.36 getgrnam F
+GLIBC_2.36 getgrnam_r F
+GLIBC_2.36 getgrouplist F
+GLIBC_2.36 getgroups F
+GLIBC_2.36 gethostbyaddr F
+GLIBC_2.36 gethostbyaddr_r F
+GLIBC_2.36 gethostbyname F
+GLIBC_2.36 gethostbyname2 F
+GLIBC_2.36 gethostbyname2_r F
+GLIBC_2.36 gethostbyname_r F
+GLIBC_2.36 gethostent F
+GLIBC_2.36 gethostent_r F
+GLIBC_2.36 gethostid F
+GLIBC_2.36 gethostname F
+GLIBC_2.36 getifaddrs F
+GLIBC_2.36 getipv4sourcefilter F
+GLIBC_2.36 getitimer F
+GLIBC_2.36 getline F
+GLIBC_2.36 getloadavg F
+GLIBC_2.36 getlogin F
+GLIBC_2.36 getlogin_r F
+GLIBC_2.36 getmntent F
+GLIBC_2.36 getmntent_r F
+GLIBC_2.36 getnameinfo F
+GLIBC_2.36 getnetbyaddr F
+GLIBC_2.36 getnetbyaddr_r F
+GLIBC_2.36 getnetbyname F
+GLIBC_2.36 getnetbyname_r F
+GLIBC_2.36 getnetent F
+GLIBC_2.36 getnetent_r F
+GLIBC_2.36 getnetgrent F
+GLIBC_2.36 getnetgrent_r F
+GLIBC_2.36 getopt F
+GLIBC_2.36 getopt_long F
+GLIBC_2.36 getopt_long_only F
+GLIBC_2.36 getpagesize F
+GLIBC_2.36 getpass F
+GLIBC_2.36 getpeername F
+GLIBC_2.36 getpgid F
+GLIBC_2.36 getpgrp F
+GLIBC_2.36 getpid F
+GLIBC_2.36 getppid F
+GLIBC_2.36 getpriority F
+GLIBC_2.36 getprotobyname F
+GLIBC_2.36 getprotobyname_r F
+GLIBC_2.36 getprotobynumber F
+GLIBC_2.36 getprotobynumber_r F
+GLIBC_2.36 getprotoent F
+GLIBC_2.36 getprotoent_r F
+GLIBC_2.36 getpt F
+GLIBC_2.36 getpw F
+GLIBC_2.36 getpwent F
+GLIBC_2.36 getpwent_r F
+GLIBC_2.36 getpwnam F
+GLIBC_2.36 getpwnam_r F
+GLIBC_2.36 getpwuid F
+GLIBC_2.36 getpwuid_r F
+GLIBC_2.36 getrandom F
+GLIBC_2.36 getresgid F
+GLIBC_2.36 getresuid F
+GLIBC_2.36 getrlimit F
+GLIBC_2.36 getrlimit64 F
+GLIBC_2.36 getrpcbyname F
+GLIBC_2.36 getrpcbyname_r F
+GLIBC_2.36 getrpcbynumber F
+GLIBC_2.36 getrpcbynumber_r F
+GLIBC_2.36 getrpcent F
+GLIBC_2.36 getrpcent_r F
+GLIBC_2.36 getrusage F
+GLIBC_2.36 gets F
+GLIBC_2.36 getservbyname F
+GLIBC_2.36 getservbyname_r F
+GLIBC_2.36 getservbyport F
+GLIBC_2.36 getservbyport_r F
+GLIBC_2.36 getservent F
+GLIBC_2.36 getservent_r F
+GLIBC_2.36 getsgent F
+GLIBC_2.36 getsgent_r F
+GLIBC_2.36 getsgnam F
+GLIBC_2.36 getsgnam_r F
+GLIBC_2.36 getsid F
+GLIBC_2.36 getsockname F
+GLIBC_2.36 getsockopt F
+GLIBC_2.36 getsourcefilter F
+GLIBC_2.36 getspent F
+GLIBC_2.36 getspent_r F
+GLIBC_2.36 getspnam F
+GLIBC_2.36 getspnam_r F
+GLIBC_2.36 getsubopt F
+GLIBC_2.36 gettext F
+GLIBC_2.36 gettid F
+GLIBC_2.36 gettimeofday F
+GLIBC_2.36 getttyent F
+GLIBC_2.36 getttynam F
+GLIBC_2.36 getuid F
+GLIBC_2.36 getusershell F
+GLIBC_2.36 getutent F
+GLIBC_2.36 getutent_r F
+GLIBC_2.36 getutid F
+GLIBC_2.36 getutid_r F
+GLIBC_2.36 getutline F
+GLIBC_2.36 getutline_r F
+GLIBC_2.36 getutmp F
+GLIBC_2.36 getutmpx F
+GLIBC_2.36 getutxent F
+GLIBC_2.36 getutxid F
+GLIBC_2.36 getutxline F
+GLIBC_2.36 getw F
+GLIBC_2.36 getwc F
+GLIBC_2.36 getwc_unlocked F
+GLIBC_2.36 getwchar F
+GLIBC_2.36 getwchar_unlocked F
+GLIBC_2.36 getwd F
+GLIBC_2.36 getxattr F
+GLIBC_2.36 glob F
+GLIBC_2.36 glob64 F
+GLIBC_2.36 glob_pattern_p F
+GLIBC_2.36 globfree F
+GLIBC_2.36 globfree64 F
+GLIBC_2.36 gmtime F
+GLIBC_2.36 gmtime_r F
+GLIBC_2.36 gnu_dev_major F
+GLIBC_2.36 gnu_dev_makedev F
+GLIBC_2.36 gnu_dev_minor F
+GLIBC_2.36 gnu_get_libc_release F
+GLIBC_2.36 gnu_get_libc_version F
+GLIBC_2.36 grantpt F
+GLIBC_2.36 group_member F
+GLIBC_2.36 gsignal F
+GLIBC_2.36 gtty F
+GLIBC_2.36 h_errlist D 0x28
+GLIBC_2.36 h_nerr D 0x4
+GLIBC_2.36 hasmntopt F
+GLIBC_2.36 hcreate F
+GLIBC_2.36 hcreate_r F
+GLIBC_2.36 hdestroy F
+GLIBC_2.36 hdestroy_r F
+GLIBC_2.36 herror F
+GLIBC_2.36 hsearch F
+GLIBC_2.36 hsearch_r F
+GLIBC_2.36 hstrerror F
+GLIBC_2.36 htonl F
+GLIBC_2.36 htons F
+GLIBC_2.36 iconv F
+GLIBC_2.36 iconv_close F
+GLIBC_2.36 iconv_open F
+GLIBC_2.36 if_freenameindex F
+GLIBC_2.36 if_indextoname F
+GLIBC_2.36 if_nameindex F
+GLIBC_2.36 if_nametoindex F
+GLIBC_2.36 imaxabs F
+GLIBC_2.36 imaxdiv F
+GLIBC_2.36 in6addr_any D 0x10
+GLIBC_2.36 in6addr_loopback D 0x10
+GLIBC_2.36 index F
+GLIBC_2.36 inet6_opt_append F
+GLIBC_2.36 inet6_opt_find F
+GLIBC_2.36 inet6_opt_finish F
+GLIBC_2.36 inet6_opt_get_val F
+GLIBC_2.36 inet6_opt_init F
+GLIBC_2.36 inet6_opt_next F
+GLIBC_2.36 inet6_opt_set_val F
+GLIBC_2.36 inet6_option_alloc F
+GLIBC_2.36 inet6_option_append F
+GLIBC_2.36 inet6_option_find F
+GLIBC_2.36 inet6_option_init F
+GLIBC_2.36 inet6_option_next F
+GLIBC_2.36 inet6_option_space F
+GLIBC_2.36 inet6_rth_add F
+GLIBC_2.36 inet6_rth_getaddr F
+GLIBC_2.36 inet6_rth_init F
+GLIBC_2.36 inet6_rth_reverse F
+GLIBC_2.36 inet6_rth_segments F
+GLIBC_2.36 inet6_rth_space F
+GLIBC_2.36 inet_addr F
+GLIBC_2.36 inet_aton F
+GLIBC_2.36 inet_lnaof F
+GLIBC_2.36 inet_makeaddr F
+GLIBC_2.36 inet_netof F
+GLIBC_2.36 inet_network F
+GLIBC_2.36 inet_nsap_addr F
+GLIBC_2.36 inet_nsap_ntoa F
+GLIBC_2.36 inet_ntoa F
+GLIBC_2.36 inet_ntop F
+GLIBC_2.36 inet_pton F
+GLIBC_2.36 init_module F
+GLIBC_2.36 initgroups F
+GLIBC_2.36 initstate F
+GLIBC_2.36 initstate_r F
+GLIBC_2.36 innetgr F
+GLIBC_2.36 inotify_add_watch F
+GLIBC_2.36 inotify_init F
+GLIBC_2.36 inotify_init1 F
+GLIBC_2.36 inotify_rm_watch F
+GLIBC_2.36 insque F
+GLIBC_2.36 ioctl F
+GLIBC_2.36 iruserok F
+GLIBC_2.36 iruserok_af F
+GLIBC_2.36 isalnum F
+GLIBC_2.36 isalnum_l F
+GLIBC_2.36 isalpha F
+GLIBC_2.36 isalpha_l F
+GLIBC_2.36 isascii F
+GLIBC_2.36 isatty F
+GLIBC_2.36 isblank F
+GLIBC_2.36 isblank_l F
+GLIBC_2.36 iscntrl F
+GLIBC_2.36 iscntrl_l F
+GLIBC_2.36 isctype F
+GLIBC_2.36 isdigit F
+GLIBC_2.36 isdigit_l F
+GLIBC_2.36 isfdtype F
+GLIBC_2.36 isgraph F
+GLIBC_2.36 isgraph_l F
+GLIBC_2.36 isinf F
+GLIBC_2.36 isinff F
+GLIBC_2.36 isinfl F
+GLIBC_2.36 islower F
+GLIBC_2.36 islower_l F
+GLIBC_2.36 isnan F
+GLIBC_2.36 isnanf F
+GLIBC_2.36 isnanl F
+GLIBC_2.36 isprint F
+GLIBC_2.36 isprint_l F
+GLIBC_2.36 ispunct F
+GLIBC_2.36 ispunct_l F
+GLIBC_2.36 isspace F
+GLIBC_2.36 isspace_l F
+GLIBC_2.36 isupper F
+GLIBC_2.36 isupper_l F
+GLIBC_2.36 iswalnum F
+GLIBC_2.36 iswalnum_l F
+GLIBC_2.36 iswalpha F
+GLIBC_2.36 iswalpha_l F
+GLIBC_2.36 iswblank F
+GLIBC_2.36 iswblank_l F
+GLIBC_2.36 iswcntrl F
+GLIBC_2.36 iswcntrl_l F
+GLIBC_2.36 iswctype F
+GLIBC_2.36 iswctype_l F
+GLIBC_2.36 iswdigit F
+GLIBC_2.36 iswdigit_l F
+GLIBC_2.36 iswgraph F
+GLIBC_2.36 iswgraph_l F
+GLIBC_2.36 iswlower F
+GLIBC_2.36 iswlower_l F
+GLIBC_2.36 iswprint F
+GLIBC_2.36 iswprint_l F
+GLIBC_2.36 iswpunct F
+GLIBC_2.36 iswpunct_l F
+GLIBC_2.36 iswspace F
+GLIBC_2.36 iswspace_l F
+GLIBC_2.36 iswupper F
+GLIBC_2.36 iswupper_l F
+GLIBC_2.36 iswxdigit F
+GLIBC_2.36 iswxdigit_l F
+GLIBC_2.36 isxdigit F
+GLIBC_2.36 isxdigit_l F
+GLIBC_2.36 jrand48 F
+GLIBC_2.36 jrand48_r F
+GLIBC_2.36 kill F
+GLIBC_2.36 killpg F
+GLIBC_2.36 klogctl F
+GLIBC_2.36 l64a F
+GLIBC_2.36 labs F
+GLIBC_2.36 lchmod F
+GLIBC_2.36 lchown F
+GLIBC_2.36 lckpwdf F
+GLIBC_2.36 lcong48 F
+GLIBC_2.36 lcong48_r F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 ldiv F
+GLIBC_2.36 lfind F
+GLIBC_2.36 lgetxattr F
+GLIBC_2.36 link F
+GLIBC_2.36 linkat F
+GLIBC_2.36 lio_listio F
+GLIBC_2.36 lio_listio64 F
+GLIBC_2.36 listen F
+GLIBC_2.36 listxattr F
+GLIBC_2.36 llabs F
+GLIBC_2.36 lldiv F
+GLIBC_2.36 llistxattr F
+GLIBC_2.36 localeconv F
+GLIBC_2.36 localtime F
+GLIBC_2.36 localtime_r F
+GLIBC_2.36 lockf F
+GLIBC_2.36 lockf64 F
+GLIBC_2.36 login F
+GLIBC_2.36 login_tty F
+GLIBC_2.36 logout F
+GLIBC_2.36 logwtmp F
+GLIBC_2.36 longjmp F
+GLIBC_2.36 lrand48 F
+GLIBC_2.36 lrand48_r F
+GLIBC_2.36 lremovexattr F
+GLIBC_2.36 lsearch F
+GLIBC_2.36 lseek F
+GLIBC_2.36 lseek64 F
+GLIBC_2.36 lsetxattr F
+GLIBC_2.36 lstat F
+GLIBC_2.36 lstat64 F
+GLIBC_2.36 lutimes F
+GLIBC_2.36 madvise F
+GLIBC_2.36 makecontext F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mblen F
+GLIBC_2.36 mbrlen F
+GLIBC_2.36 mbrtoc16 F
+GLIBC_2.36 mbrtoc32 F
+GLIBC_2.36 mbrtowc F
+GLIBC_2.36 mbsinit F
+GLIBC_2.36 mbsnrtowcs F
+GLIBC_2.36 mbsrtowcs F
+GLIBC_2.36 mbstowcs F
+GLIBC_2.36 mbtowc F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 memccpy F
+GLIBC_2.36 memchr F
+GLIBC_2.36 memcmp F
+GLIBC_2.36 memcpy F
+GLIBC_2.36 memfd_create F
+GLIBC_2.36 memfrob F
+GLIBC_2.36 memmem F
+GLIBC_2.36 memmove F
+GLIBC_2.36 mempcpy F
+GLIBC_2.36 memrchr F
+GLIBC_2.36 memset F
+GLIBC_2.36 mincore F
+GLIBC_2.36 mkdir F
+GLIBC_2.36 mkdirat F
+GLIBC_2.36 mkdtemp F
+GLIBC_2.36 mkfifo F
+GLIBC_2.36 mkfifoat F
+GLIBC_2.36 mknod F
+GLIBC_2.36 mknodat F
+GLIBC_2.36 mkostemp F
+GLIBC_2.36 mkostemp64 F
+GLIBC_2.36 mkostemps F
+GLIBC_2.36 mkostemps64 F
+GLIBC_2.36 mkstemp F
+GLIBC_2.36 mkstemp64 F
+GLIBC_2.36 mkstemps F
+GLIBC_2.36 mkstemps64 F
+GLIBC_2.36 mktemp F
+GLIBC_2.36 mktime F
+GLIBC_2.36 mlock F
+GLIBC_2.36 mlock2 F
+GLIBC_2.36 mlockall F
+GLIBC_2.36 mmap F
+GLIBC_2.36 mmap64 F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modfl F
+GLIBC_2.36 moncontrol F
+GLIBC_2.36 monstartup F
+GLIBC_2.36 mount F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mprotect F
+GLIBC_2.36 mq_close F
+GLIBC_2.36 mq_getattr F
+GLIBC_2.36 mq_notify F
+GLIBC_2.36 mq_open F
+GLIBC_2.36 mq_receive F
+GLIBC_2.36 mq_send F
+GLIBC_2.36 mq_setattr F
+GLIBC_2.36 mq_timedreceive F
+GLIBC_2.36 mq_timedsend F
+GLIBC_2.36 mq_unlink F
+GLIBC_2.36 mrand48 F
+GLIBC_2.36 mrand48_r F
+GLIBC_2.36 mremap F
+GLIBC_2.36 msgctl F
+GLIBC_2.36 msgget F
+GLIBC_2.36 msgrcv F
+GLIBC_2.36 msgsnd F
+GLIBC_2.36 msync F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 mtx_destroy F
+GLIBC_2.36 mtx_init F
+GLIBC_2.36 mtx_lock F
+GLIBC_2.36 mtx_timedlock F
+GLIBC_2.36 mtx_trylock F
+GLIBC_2.36 mtx_unlock F
+GLIBC_2.36 munlock F
+GLIBC_2.36 munlockall F
+GLIBC_2.36 munmap F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 name_to_handle_at F
+GLIBC_2.36 nanosleep F
+GLIBC_2.36 newlocale F
+GLIBC_2.36 nftw F
+GLIBC_2.36 nftw64 F
+GLIBC_2.36 ngettext F
+GLIBC_2.36 nice F
+GLIBC_2.36 nl_langinfo F
+GLIBC_2.36 nl_langinfo_l F
+GLIBC_2.36 nrand48 F
+GLIBC_2.36 nrand48_r F
+GLIBC_2.36 ns_name_compress F
+GLIBC_2.36 ns_name_ntop F
+GLIBC_2.36 ns_name_pack F
+GLIBC_2.36 ns_name_pton F
+GLIBC_2.36 ns_name_skip F
+GLIBC_2.36 ns_name_uncompress F
+GLIBC_2.36 ns_name_unpack F
+GLIBC_2.36 ntohl F
+GLIBC_2.36 ntohs F
+GLIBC_2.36 ntp_adjtime F
+GLIBC_2.36 ntp_gettime F
+GLIBC_2.36 ntp_gettimex F
+GLIBC_2.36 obstack_alloc_failed_handler D 0x8
+GLIBC_2.36 obstack_exit_failure D 0x4
+GLIBC_2.36 obstack_free F
+GLIBC_2.36 obstack_printf F
+GLIBC_2.36 obstack_vprintf F
+GLIBC_2.36 on_exit F
+GLIBC_2.36 open F
+GLIBC_2.36 open64 F
+GLIBC_2.36 open_by_handle_at F
+GLIBC_2.36 open_memstream F
+GLIBC_2.36 open_wmemstream F
+GLIBC_2.36 openat F
+GLIBC_2.36 openat64 F
+GLIBC_2.36 opendir F
+GLIBC_2.36 openlog F
+GLIBC_2.36 openpty F
+GLIBC_2.36 optarg D 0x8
+GLIBC_2.36 opterr D 0x4
+GLIBC_2.36 optind D 0x4
+GLIBC_2.36 optopt D 0x4
+GLIBC_2.36 parse_printf_format F
+GLIBC_2.36 pathconf F
+GLIBC_2.36 pause F
+GLIBC_2.36 pclose F
+GLIBC_2.36 perror F
+GLIBC_2.36 personality F
+GLIBC_2.36 pipe F
+GLIBC_2.36 pipe2 F
+GLIBC_2.36 pivot_root F
+GLIBC_2.36 pkey_alloc F
+GLIBC_2.36 pkey_free F
+GLIBC_2.36 pkey_get F
+GLIBC_2.36 pkey_mprotect F
+GLIBC_2.36 pkey_set F
+GLIBC_2.36 poll F
+GLIBC_2.36 popen F
+GLIBC_2.36 posix_fadvise F
+GLIBC_2.36 posix_fadvise64 F
+GLIBC_2.36 posix_fallocate F
+GLIBC_2.36 posix_fallocate64 F
+GLIBC_2.36 posix_madvise F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 posix_openpt F
+GLIBC_2.36 posix_spawn F
+GLIBC_2.36 posix_spawn_file_actions_addchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addclose F
+GLIBC_2.36 posix_spawn_file_actions_addclosefrom_np F
+GLIBC_2.36 posix_spawn_file_actions_adddup2 F
+GLIBC_2.36 posix_spawn_file_actions_addfchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addopen F
+GLIBC_2.36 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 posix_spawn_file_actions_destroy F
+GLIBC_2.36 posix_spawn_file_actions_init F
+GLIBC_2.36 posix_spawnattr_destroy F
+GLIBC_2.36 posix_spawnattr_getflags F
+GLIBC_2.36 posix_spawnattr_getpgroup F
+GLIBC_2.36 posix_spawnattr_getschedparam F
+GLIBC_2.36 posix_spawnattr_getschedpolicy F
+GLIBC_2.36 posix_spawnattr_getsigdefault F
+GLIBC_2.36 posix_spawnattr_getsigmask F
+GLIBC_2.36 posix_spawnattr_init F
+GLIBC_2.36 posix_spawnattr_setflags F
+GLIBC_2.36 posix_spawnattr_setpgroup F
+GLIBC_2.36 posix_spawnattr_setschedparam F
+GLIBC_2.36 posix_spawnattr_setschedpolicy F
+GLIBC_2.36 posix_spawnattr_setsigdefault F
+GLIBC_2.36 posix_spawnattr_setsigmask F
+GLIBC_2.36 posix_spawnp F
+GLIBC_2.36 ppoll F
+GLIBC_2.36 prctl F
+GLIBC_2.36 pread F
+GLIBC_2.36 pread64 F
+GLIBC_2.36 preadv F
+GLIBC_2.36 preadv2 F
+GLIBC_2.36 preadv64 F
+GLIBC_2.36 preadv64v2 F
+GLIBC_2.36 printf F
+GLIBC_2.36 printf_size F
+GLIBC_2.36 printf_size_info F
+GLIBC_2.36 prlimit F
+GLIBC_2.36 prlimit64 F
+GLIBC_2.36 process_vm_readv F
+GLIBC_2.36 process_vm_writev F
+GLIBC_2.36 profil F
+GLIBC_2.36 program_invocation_name D 0x8
+GLIBC_2.36 program_invocation_short_name D 0x8
+GLIBC_2.36 pselect F
+GLIBC_2.36 psiginfo F
+GLIBC_2.36 psignal F
+GLIBC_2.36 pthread_attr_destroy F
+GLIBC_2.36 pthread_attr_getaffinity_np F
+GLIBC_2.36 pthread_attr_getdetachstate F
+GLIBC_2.36 pthread_attr_getguardsize F
+GLIBC_2.36 pthread_attr_getinheritsched F
+GLIBC_2.36 pthread_attr_getschedparam F
+GLIBC_2.36 pthread_attr_getschedpolicy F
+GLIBC_2.36 pthread_attr_getscope F
+GLIBC_2.36 pthread_attr_getsigmask_np F
+GLIBC_2.36 pthread_attr_getstack F
+GLIBC_2.36 pthread_attr_getstackaddr F
+GLIBC_2.36 pthread_attr_getstacksize F
+GLIBC_2.36 pthread_attr_init F
+GLIBC_2.36 pthread_attr_setaffinity_np F
+GLIBC_2.36 pthread_attr_setdetachstate F
+GLIBC_2.36 pthread_attr_setguardsize F
+GLIBC_2.36 pthread_attr_setinheritsched F
+GLIBC_2.36 pthread_attr_setschedparam F
+GLIBC_2.36 pthread_attr_setschedpolicy F
+GLIBC_2.36 pthread_attr_setscope F
+GLIBC_2.36 pthread_attr_setsigmask_np F
+GLIBC_2.36 pthread_attr_setstack F
+GLIBC_2.36 pthread_attr_setstackaddr F
+GLIBC_2.36 pthread_attr_setstacksize F
+GLIBC_2.36 pthread_barrier_destroy F
+GLIBC_2.36 pthread_barrier_init F
+GLIBC_2.36 pthread_barrier_wait F
+GLIBC_2.36 pthread_barrierattr_destroy F
+GLIBC_2.36 pthread_barrierattr_getpshared F
+GLIBC_2.36 pthread_barrierattr_init F
+GLIBC_2.36 pthread_barrierattr_setpshared F
+GLIBC_2.36 pthread_cancel F
+GLIBC_2.36 pthread_clockjoin_np F
+GLIBC_2.36 pthread_cond_broadcast F
+GLIBC_2.36 pthread_cond_clockwait F
+GLIBC_2.36 pthread_cond_destroy F
+GLIBC_2.36 pthread_cond_init F
+GLIBC_2.36 pthread_cond_signal F
+GLIBC_2.36 pthread_cond_timedwait F
+GLIBC_2.36 pthread_cond_wait F
+GLIBC_2.36 pthread_condattr_destroy F
+GLIBC_2.36 pthread_condattr_getclock F
+GLIBC_2.36 pthread_condattr_getpshared F
+GLIBC_2.36 pthread_condattr_init F
+GLIBC_2.36 pthread_condattr_setclock F
+GLIBC_2.36 pthread_condattr_setpshared F
+GLIBC_2.36 pthread_create F
+GLIBC_2.36 pthread_detach F
+GLIBC_2.36 pthread_equal F
+GLIBC_2.36 pthread_exit F
+GLIBC_2.36 pthread_getaffinity_np F
+GLIBC_2.36 pthread_getattr_default_np F
+GLIBC_2.36 pthread_getattr_np F
+GLIBC_2.36 pthread_getconcurrency F
+GLIBC_2.36 pthread_getcpuclockid F
+GLIBC_2.36 pthread_getname_np F
+GLIBC_2.36 pthread_getschedparam F
+GLIBC_2.36 pthread_getspecific F
+GLIBC_2.36 pthread_join F
+GLIBC_2.36 pthread_key_create F
+GLIBC_2.36 pthread_key_delete F
+GLIBC_2.36 pthread_kill F
+GLIBC_2.36 pthread_mutex_clocklock F
+GLIBC_2.36 pthread_mutex_consistent F
+GLIBC_2.36 pthread_mutex_destroy F
+GLIBC_2.36 pthread_mutex_getprioceiling F
+GLIBC_2.36 pthread_mutex_init F
+GLIBC_2.36 pthread_mutex_lock F
+GLIBC_2.36 pthread_mutex_setprioceiling F
+GLIBC_2.36 pthread_mutex_timedlock F
+GLIBC_2.36 pthread_mutex_trylock F
+GLIBC_2.36 pthread_mutex_unlock F
+GLIBC_2.36 pthread_mutexattr_destroy F
+GLIBC_2.36 pthread_mutexattr_getprioceiling F
+GLIBC_2.36 pthread_mutexattr_getprotocol F
+GLIBC_2.36 pthread_mutexattr_getpshared F
+GLIBC_2.36 pthread_mutexattr_getrobust F
+GLIBC_2.36 pthread_mutexattr_gettype F
+GLIBC_2.36 pthread_mutexattr_init F
+GLIBC_2.36 pthread_mutexattr_setprioceiling F
+GLIBC_2.36 pthread_mutexattr_setprotocol F
+GLIBC_2.36 pthread_mutexattr_setpshared F
+GLIBC_2.36 pthread_mutexattr_setrobust F
+GLIBC_2.36 pthread_mutexattr_settype F
+GLIBC_2.36 pthread_once F
+GLIBC_2.36 pthread_rwlock_clockrdlock F
+GLIBC_2.36 pthread_rwlock_clockwrlock F
+GLIBC_2.36 pthread_rwlock_destroy F
+GLIBC_2.36 pthread_rwlock_init F
+GLIBC_2.36 pthread_rwlock_rdlock F
+GLIBC_2.36 pthread_rwlock_timedrdlock F
+GLIBC_2.36 pthread_rwlock_timedwrlock F
+GLIBC_2.36 pthread_rwlock_tryrdlock F
+GLIBC_2.36 pthread_rwlock_trywrlock F
+GLIBC_2.36 pthread_rwlock_unlock F
+GLIBC_2.36 pthread_rwlock_wrlock F
+GLIBC_2.36 pthread_rwlockattr_destroy F
+GLIBC_2.36 pthread_rwlockattr_getkind_np F
+GLIBC_2.36 pthread_rwlockattr_getpshared F
+GLIBC_2.36 pthread_rwlockattr_init F
+GLIBC_2.36 pthread_rwlockattr_setkind_np F
+GLIBC_2.36 pthread_rwlockattr_setpshared F
+GLIBC_2.36 pthread_self F
+GLIBC_2.36 pthread_setaffinity_np F
+GLIBC_2.36 pthread_setattr_default_np F
+GLIBC_2.36 pthread_setcancelstate F
+GLIBC_2.36 pthread_setcanceltype F
+GLIBC_2.36 pthread_setconcurrency F
+GLIBC_2.36 pthread_setname_np F
+GLIBC_2.36 pthread_setschedparam F
+GLIBC_2.36 pthread_setschedprio F
+GLIBC_2.36 pthread_setspecific F
+GLIBC_2.36 pthread_sigmask F
+GLIBC_2.36 pthread_sigqueue F
+GLIBC_2.36 pthread_spin_destroy F
+GLIBC_2.36 pthread_spin_init F
+GLIBC_2.36 pthread_spin_lock F
+GLIBC_2.36 pthread_spin_trylock F
+GLIBC_2.36 pthread_spin_unlock F
+GLIBC_2.36 pthread_testcancel F
+GLIBC_2.36 pthread_timedjoin_np F
+GLIBC_2.36 pthread_tryjoin_np F
+GLIBC_2.36 ptrace F
+GLIBC_2.36 ptsname F
+GLIBC_2.36 ptsname_r F
+GLIBC_2.36 putc F
+GLIBC_2.36 putc_unlocked F
+GLIBC_2.36 putchar F
+GLIBC_2.36 putchar_unlocked F
+GLIBC_2.36 putenv F
+GLIBC_2.36 putgrent F
+GLIBC_2.36 putpwent F
+GLIBC_2.36 puts F
+GLIBC_2.36 putsgent F
+GLIBC_2.36 putspent F
+GLIBC_2.36 pututline F
+GLIBC_2.36 pututxline F
+GLIBC_2.36 putw F
+GLIBC_2.36 putwc F
+GLIBC_2.36 putwc_unlocked F
+GLIBC_2.36 putwchar F
+GLIBC_2.36 putwchar_unlocked F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 pwrite F
+GLIBC_2.36 pwrite64 F
+GLIBC_2.36 pwritev F
+GLIBC_2.36 pwritev2 F
+GLIBC_2.36 pwritev64 F
+GLIBC_2.36 pwritev64v2 F
+GLIBC_2.36 qecvt F
+GLIBC_2.36 qecvt_r F
+GLIBC_2.36 qfcvt F
+GLIBC_2.36 qfcvt_r F
+GLIBC_2.36 qgcvt F
+GLIBC_2.36 qsort F
+GLIBC_2.36 qsort_r F
+GLIBC_2.36 quick_exit F
+GLIBC_2.36 quotactl F
+GLIBC_2.36 raise F
+GLIBC_2.36 rand F
+GLIBC_2.36 rand_r F
+GLIBC_2.36 random F
+GLIBC_2.36 random_r F
+GLIBC_2.36 rawmemchr F
+GLIBC_2.36 rcmd F
+GLIBC_2.36 rcmd_af F
+GLIBC_2.36 re_comp F
+GLIBC_2.36 re_compile_fastmap F
+GLIBC_2.36 re_compile_pattern F
+GLIBC_2.36 re_exec F
+GLIBC_2.36 re_match F
+GLIBC_2.36 re_match_2 F
+GLIBC_2.36 re_search F
+GLIBC_2.36 re_search_2 F
+GLIBC_2.36 re_set_registers F
+GLIBC_2.36 re_set_syntax F
+GLIBC_2.36 re_syntax_options D 0x8
+GLIBC_2.36 read F
+GLIBC_2.36 readahead F
+GLIBC_2.36 readdir F
+GLIBC_2.36 readdir64 F
+GLIBC_2.36 readdir64_r F
+GLIBC_2.36 readdir_r F
+GLIBC_2.36 readlink F
+GLIBC_2.36 readlinkat F
+GLIBC_2.36 readv F
+GLIBC_2.36 realloc F
+GLIBC_2.36 reallocarray F
+GLIBC_2.36 realpath F
+GLIBC_2.36 reboot F
+GLIBC_2.36 recv F
+GLIBC_2.36 recvfrom F
+GLIBC_2.36 recvmmsg F
+GLIBC_2.36 recvmsg F
+GLIBC_2.36 regcomp F
+GLIBC_2.36 regerror F
+GLIBC_2.36 regexec F
+GLIBC_2.36 regfree F
+GLIBC_2.36 register_printf_function F
+GLIBC_2.36 register_printf_modifier F
+GLIBC_2.36 register_printf_specifier F
+GLIBC_2.36 register_printf_type F
+GLIBC_2.36 remap_file_pages F
+GLIBC_2.36 remove F
+GLIBC_2.36 removexattr F
+GLIBC_2.36 remque F
+GLIBC_2.36 rename F
+GLIBC_2.36 renameat F
+GLIBC_2.36 renameat2 F
+GLIBC_2.36 res_dnok F
+GLIBC_2.36 res_hnok F
+GLIBC_2.36 res_mailok F
+GLIBC_2.36 res_mkquery F
+GLIBC_2.36 res_nmkquery F
+GLIBC_2.36 res_nquery F
+GLIBC_2.36 res_nquerydomain F
+GLIBC_2.36 res_nsearch F
+GLIBC_2.36 res_nsend F
+GLIBC_2.36 res_ownok F
+GLIBC_2.36 res_query F
+GLIBC_2.36 res_querydomain F
+GLIBC_2.36 res_search F
+GLIBC_2.36 res_send F
+GLIBC_2.36 revoke F
+GLIBC_2.36 rewind F
+GLIBC_2.36 rewinddir F
+GLIBC_2.36 rexec F
+GLIBC_2.36 rexec_af F
+GLIBC_2.36 rexecoptions D 0x4
+GLIBC_2.36 rindex F
+GLIBC_2.36 rmdir F
+GLIBC_2.36 rpmatch F
+GLIBC_2.36 rresvport F
+GLIBC_2.36 rresvport_af F
+GLIBC_2.36 ruserok F
+GLIBC_2.36 ruserok_af F
+GLIBC_2.36 ruserpass F
+GLIBC_2.36 sbrk F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 scandir F
+GLIBC_2.36 scandir64 F
+GLIBC_2.36 scandirat F
+GLIBC_2.36 scandirat64 F
+GLIBC_2.36 scanf F
+GLIBC_2.36 sched_get_priority_max F
+GLIBC_2.36 sched_get_priority_min F
+GLIBC_2.36 sched_getaffinity F
+GLIBC_2.36 sched_getcpu F
+GLIBC_2.36 sched_getparam F
+GLIBC_2.36 sched_getscheduler F
+GLIBC_2.36 sched_rr_get_interval F
+GLIBC_2.36 sched_setaffinity F
+GLIBC_2.36 sched_setparam F
+GLIBC_2.36 sched_setscheduler F
+GLIBC_2.36 sched_yield F
+GLIBC_2.36 secure_getenv F
+GLIBC_2.36 seed48 F
+GLIBC_2.36 seed48_r F
+GLIBC_2.36 seekdir F
+GLIBC_2.36 select F
+GLIBC_2.36 sem_clockwait F
+GLIBC_2.36 sem_close F
+GLIBC_2.36 sem_destroy F
+GLIBC_2.36 sem_getvalue F
+GLIBC_2.36 sem_init F
+GLIBC_2.36 sem_open F
+GLIBC_2.36 sem_post F
+GLIBC_2.36 sem_timedwait F
+GLIBC_2.36 sem_trywait F
+GLIBC_2.36 sem_unlink F
+GLIBC_2.36 sem_wait F
+GLIBC_2.36 semctl F
+GLIBC_2.36 semget F
+GLIBC_2.36 semop F
+GLIBC_2.36 semtimedop F
+GLIBC_2.36 send F
+GLIBC_2.36 sendfile F
+GLIBC_2.36 sendfile64 F
+GLIBC_2.36 sendmmsg F
+GLIBC_2.36 sendmsg F
+GLIBC_2.36 sendto F
+GLIBC_2.36 setaliasent F
+GLIBC_2.36 setbuf F
+GLIBC_2.36 setbuffer F
+GLIBC_2.36 setcontext F
+GLIBC_2.36 setdomainname F
+GLIBC_2.36 setegid F
+GLIBC_2.36 setenv F
+GLIBC_2.36 seteuid F
+GLIBC_2.36 setfsent F
+GLIBC_2.36 setfsgid F
+GLIBC_2.36 setfsuid F
+GLIBC_2.36 setgid F
+GLIBC_2.36 setgrent F
+GLIBC_2.36 setgroups F
+GLIBC_2.36 sethostent F
+GLIBC_2.36 sethostid F
+GLIBC_2.36 sethostname F
+GLIBC_2.36 setipv4sourcefilter F
+GLIBC_2.36 setitimer F
+GLIBC_2.36 setjmp F
+GLIBC_2.36 setlinebuf F
+GLIBC_2.36 setlocale F
+GLIBC_2.36 setlogin F
+GLIBC_2.36 setlogmask F
+GLIBC_2.36 setmntent F
+GLIBC_2.36 setnetent F
+GLIBC_2.36 setnetgrent F
+GLIBC_2.36 setns F
+GLIBC_2.36 setpgid F
+GLIBC_2.36 setpgrp F
+GLIBC_2.36 setpriority F
+GLIBC_2.36 setprotoent F
+GLIBC_2.36 setpwent F
+GLIBC_2.36 setregid F
+GLIBC_2.36 setresgid F
+GLIBC_2.36 setresuid F
+GLIBC_2.36 setreuid F
+GLIBC_2.36 setrlimit F
+GLIBC_2.36 setrlimit64 F
+GLIBC_2.36 setrpcent F
+GLIBC_2.36 setservent F
+GLIBC_2.36 setsgent F
+GLIBC_2.36 setsid F
+GLIBC_2.36 setsockopt F
+GLIBC_2.36 setsourcefilter F
+GLIBC_2.36 setspent F
+GLIBC_2.36 setstate F
+GLIBC_2.36 setstate_r F
+GLIBC_2.36 settimeofday F
+GLIBC_2.36 setttyent F
+GLIBC_2.36 setuid F
+GLIBC_2.36 setusershell F
+GLIBC_2.36 setutent F
+GLIBC_2.36 setutxent F
+GLIBC_2.36 setvbuf F
+GLIBC_2.36 setxattr F
+GLIBC_2.36 sgetsgent F
+GLIBC_2.36 sgetsgent_r F
+GLIBC_2.36 sgetspent F
+GLIBC_2.36 sgetspent_r F
+GLIBC_2.36 shm_open F
+GLIBC_2.36 shm_unlink F
+GLIBC_2.36 shmat F
+GLIBC_2.36 shmctl F
+GLIBC_2.36 shmdt F
+GLIBC_2.36 shmget F
+GLIBC_2.36 shutdown F
+GLIBC_2.36 sigabbrev_np F
+GLIBC_2.36 sigaction F
+GLIBC_2.36 sigaddset F
+GLIBC_2.36 sigaltstack F
+GLIBC_2.36 sigandset F
+GLIBC_2.36 sigblock F
+GLIBC_2.36 sigdelset F
+GLIBC_2.36 sigdescr_np F
+GLIBC_2.36 sigemptyset F
+GLIBC_2.36 sigfillset F
+GLIBC_2.36 siggetmask F
+GLIBC_2.36 sighold F
+GLIBC_2.36 sigignore F
+GLIBC_2.36 siginterrupt F
+GLIBC_2.36 sigisemptyset F
+GLIBC_2.36 sigismember F
+GLIBC_2.36 siglongjmp F
+GLIBC_2.36 signal F
+GLIBC_2.36 signalfd F
+GLIBC_2.36 sigorset F
+GLIBC_2.36 sigpause F
+GLIBC_2.36 sigpending F
+GLIBC_2.36 sigprocmask F
+GLIBC_2.36 sigqueue F
+GLIBC_2.36 sigrelse F
+GLIBC_2.36 sigreturn F
+GLIBC_2.36 sigset F
+GLIBC_2.36 sigsetmask F
+GLIBC_2.36 sigstack F
+GLIBC_2.36 sigsuspend F
+GLIBC_2.36 sigtimedwait F
+GLIBC_2.36 sigwait F
+GLIBC_2.36 sigwaitinfo F
+GLIBC_2.36 sleep F
+GLIBC_2.36 snprintf F
+GLIBC_2.36 sockatmark F
+GLIBC_2.36 socket F
+GLIBC_2.36 socketpair F
+GLIBC_2.36 splice F
+GLIBC_2.36 sprintf F
+GLIBC_2.36 sprofil F
+GLIBC_2.36 srand F
+GLIBC_2.36 srand48 F
+GLIBC_2.36 srand48_r F
+GLIBC_2.36 srandom F
+GLIBC_2.36 srandom_r F
+GLIBC_2.36 sscanf F
+GLIBC_2.36 ssignal F
+GLIBC_2.36 stat F
+GLIBC_2.36 stat64 F
+GLIBC_2.36 statfs F
+GLIBC_2.36 statfs64 F
+GLIBC_2.36 statvfs F
+GLIBC_2.36 statvfs64 F
+GLIBC_2.36 statx F
+GLIBC_2.36 stderr D 0x8
+GLIBC_2.36 stdin D 0x8
+GLIBC_2.36 stdout D 0x8
+GLIBC_2.36 stpcpy F
+GLIBC_2.36 stpncpy F
+GLIBC_2.36 strcasecmp F
+GLIBC_2.36 strcasecmp_l F
+GLIBC_2.36 strcasestr F
+GLIBC_2.36 strcat F
+GLIBC_2.36 strchr F
+GLIBC_2.36 strchrnul F
+GLIBC_2.36 strcmp F
+GLIBC_2.36 strcoll F
+GLIBC_2.36 strcoll_l F
+GLIBC_2.36 strcpy F
+GLIBC_2.36 strcspn F
+GLIBC_2.36 strdup F
+GLIBC_2.36 strerror F
+GLIBC_2.36 strerror_l F
+GLIBC_2.36 strerror_r F
+GLIBC_2.36 strerrordesc_np F
+GLIBC_2.36 strerrorname_np F
+GLIBC_2.36 strfmon F
+GLIBC_2.36 strfmon_l F
+GLIBC_2.36 strfromd F
+GLIBC_2.36 strfromf F
+GLIBC_2.36 strfromf128 F
+GLIBC_2.36 strfromf32 F
+GLIBC_2.36 strfromf32x F
+GLIBC_2.36 strfromf64 F
+GLIBC_2.36 strfromf64x F
+GLIBC_2.36 strfroml F
+GLIBC_2.36 strfry F
+GLIBC_2.36 strftime F
+GLIBC_2.36 strftime_l F
+GLIBC_2.36 strlen F
+GLIBC_2.36 strncasecmp F
+GLIBC_2.36 strncasecmp_l F
+GLIBC_2.36 strncat F
+GLIBC_2.36 strncmp F
+GLIBC_2.36 strncpy F
+GLIBC_2.36 strndup F
+GLIBC_2.36 strnlen F
+GLIBC_2.36 strpbrk F
+GLIBC_2.36 strptime F
+GLIBC_2.36 strptime_l F
+GLIBC_2.36 strrchr F
+GLIBC_2.36 strsep F
+GLIBC_2.36 strsignal F
+GLIBC_2.36 strspn F
+GLIBC_2.36 strstr F
+GLIBC_2.36 strtod F
+GLIBC_2.36 strtod_l F
+GLIBC_2.36 strtof F
+GLIBC_2.36 strtof128 F
+GLIBC_2.36 strtof128_l F
+GLIBC_2.36 strtof32 F
+GLIBC_2.36 strtof32_l F
+GLIBC_2.36 strtof32x F
+GLIBC_2.36 strtof32x_l F
+GLIBC_2.36 strtof64 F
+GLIBC_2.36 strtof64_l F
+GLIBC_2.36 strtof64x F
+GLIBC_2.36 strtof64x_l F
+GLIBC_2.36 strtof_l F
+GLIBC_2.36 strtoimax F
+GLIBC_2.36 strtok F
+GLIBC_2.36 strtok_r F
+GLIBC_2.36 strtol F
+GLIBC_2.36 strtol_l F
+GLIBC_2.36 strtold F
+GLIBC_2.36 strtold_l F
+GLIBC_2.36 strtoll F
+GLIBC_2.36 strtoll_l F
+GLIBC_2.36 strtoq F
+GLIBC_2.36 strtoul F
+GLIBC_2.36 strtoul_l F
+GLIBC_2.36 strtoull F
+GLIBC_2.36 strtoull_l F
+GLIBC_2.36 strtoumax F
+GLIBC_2.36 strtouq F
+GLIBC_2.36 strverscmp F
+GLIBC_2.36 strxfrm F
+GLIBC_2.36 strxfrm_l F
+GLIBC_2.36 stty F
+GLIBC_2.36 swab F
+GLIBC_2.36 swapcontext F
+GLIBC_2.36 swapoff F
+GLIBC_2.36 swapon F
+GLIBC_2.36 swprintf F
+GLIBC_2.36 swscanf F
+GLIBC_2.36 symlink F
+GLIBC_2.36 symlinkat F
+GLIBC_2.36 sync F
+GLIBC_2.36 sync_file_range F
+GLIBC_2.36 syncfs F
+GLIBC_2.36 syscall F
+GLIBC_2.36 sysconf F
+GLIBC_2.36 sysinfo F
+GLIBC_2.36 syslog F
+GLIBC_2.36 system F
+GLIBC_2.36 sysv_signal F
+GLIBC_2.36 tcdrain F
+GLIBC_2.36 tcflow F
+GLIBC_2.36 tcflush F
+GLIBC_2.36 tcgetattr F
+GLIBC_2.36 tcgetpgrp F
+GLIBC_2.36 tcgetsid F
+GLIBC_2.36 tcsendbreak F
+GLIBC_2.36 tcsetattr F
+GLIBC_2.36 tcsetpgrp F
+GLIBC_2.36 tdelete F
+GLIBC_2.36 tdestroy F
+GLIBC_2.36 tee F
+GLIBC_2.36 telldir F
+GLIBC_2.36 tempnam F
+GLIBC_2.36 textdomain F
+GLIBC_2.36 tfind F
+GLIBC_2.36 tgkill F
+GLIBC_2.36 thrd_create F
+GLIBC_2.36 thrd_current F
+GLIBC_2.36 thrd_detach F
+GLIBC_2.36 thrd_equal F
+GLIBC_2.36 thrd_exit F
+GLIBC_2.36 thrd_join F
+GLIBC_2.36 thrd_sleep F
+GLIBC_2.36 thrd_yield F
+GLIBC_2.36 time F
+GLIBC_2.36 timegm F
+GLIBC_2.36 timelocal F
+GLIBC_2.36 timer_create F
+GLIBC_2.36 timer_delete F
+GLIBC_2.36 timer_getoverrun F
+GLIBC_2.36 timer_gettime F
+GLIBC_2.36 timer_settime F
+GLIBC_2.36 timerfd_create F
+GLIBC_2.36 timerfd_gettime F
+GLIBC_2.36 timerfd_settime F
+GLIBC_2.36 times F
+GLIBC_2.36 timespec_get F
+GLIBC_2.36 timespec_getres F
+GLIBC_2.36 timezone D 0x8
+GLIBC_2.36 tmpfile F
+GLIBC_2.36 tmpfile64 F
+GLIBC_2.36 tmpnam F
+GLIBC_2.36 tmpnam_r F
+GLIBC_2.36 toascii F
+GLIBC_2.36 tolower F
+GLIBC_2.36 tolower_l F
+GLIBC_2.36 toupper F
+GLIBC_2.36 toupper_l F
+GLIBC_2.36 towctrans F
+GLIBC_2.36 towctrans_l F
+GLIBC_2.36 towlower F
+GLIBC_2.36 towlower_l F
+GLIBC_2.36 towupper F
+GLIBC_2.36 towupper_l F
+GLIBC_2.36 truncate F
+GLIBC_2.36 truncate64 F
+GLIBC_2.36 tsearch F
+GLIBC_2.36 tss_create F
+GLIBC_2.36 tss_delete F
+GLIBC_2.36 tss_get F
+GLIBC_2.36 tss_set F
+GLIBC_2.36 ttyname F
+GLIBC_2.36 ttyname_r F
+GLIBC_2.36 ttyslot F
+GLIBC_2.36 twalk F
+GLIBC_2.36 twalk_r F
+GLIBC_2.36 tzname D 0x10
+GLIBC_2.36 tzset F
+GLIBC_2.36 ualarm F
+GLIBC_2.36 ulckpwdf F
+GLIBC_2.36 ulimit F
+GLIBC_2.36 umask F
+GLIBC_2.36 umount F
+GLIBC_2.36 umount2 F
+GLIBC_2.36 uname F
+GLIBC_2.36 ungetc F
+GLIBC_2.36 ungetwc F
+GLIBC_2.36 unlink F
+GLIBC_2.36 unlinkat F
+GLIBC_2.36 unlockpt F
+GLIBC_2.36 unsetenv F
+GLIBC_2.36 unshare F
+GLIBC_2.36 updwtmp F
+GLIBC_2.36 updwtmpx F
+GLIBC_2.36 uselocale F
+GLIBC_2.36 usleep F
+GLIBC_2.36 utime F
+GLIBC_2.36 utimensat F
+GLIBC_2.36 utimes F
+GLIBC_2.36 utmpname F
+GLIBC_2.36 utmpxname F
+GLIBC_2.36 valloc F
+GLIBC_2.36 vasprintf F
+GLIBC_2.36 vdprintf F
+GLIBC_2.36 verr F
+GLIBC_2.36 verrx F
+GLIBC_2.36 versionsort F
+GLIBC_2.36 versionsort64 F
+GLIBC_2.36 vfork F
+GLIBC_2.36 vfprintf F
+GLIBC_2.36 vfscanf F
+GLIBC_2.36 vfwprintf F
+GLIBC_2.36 vfwscanf F
+GLIBC_2.36 vhangup F
+GLIBC_2.36 vlimit F
+GLIBC_2.36 vmsplice F
+GLIBC_2.36 vprintf F
+GLIBC_2.36 vscanf F
+GLIBC_2.36 vsnprintf F
+GLIBC_2.36 vsprintf F
+GLIBC_2.36 vsscanf F
+GLIBC_2.36 vswprintf F
+GLIBC_2.36 vswscanf F
+GLIBC_2.36 vsyslog F
+GLIBC_2.36 vwarn F
+GLIBC_2.36 vwarnx F
+GLIBC_2.36 vwprintf F
+GLIBC_2.36 vwscanf F
+GLIBC_2.36 wait F
+GLIBC_2.36 wait3 F
+GLIBC_2.36 wait4 F
+GLIBC_2.36 waitid F
+GLIBC_2.36 waitpid F
+GLIBC_2.36 warn F
+GLIBC_2.36 warnx F
+GLIBC_2.36 wcpcpy F
+GLIBC_2.36 wcpncpy F
+GLIBC_2.36 wcrtomb F
+GLIBC_2.36 wcscasecmp F
+GLIBC_2.36 wcscasecmp_l F
+GLIBC_2.36 wcscat F
+GLIBC_2.36 wcschr F
+GLIBC_2.36 wcschrnul F
+GLIBC_2.36 wcscmp F
+GLIBC_2.36 wcscoll F
+GLIBC_2.36 wcscoll_l F
+GLIBC_2.36 wcscpy F
+GLIBC_2.36 wcscspn F
+GLIBC_2.36 wcsdup F
+GLIBC_2.36 wcsftime F
+GLIBC_2.36 wcsftime_l F
+GLIBC_2.36 wcslen F
+GLIBC_2.36 wcsncasecmp F
+GLIBC_2.36 wcsncasecmp_l F
+GLIBC_2.36 wcsncat F
+GLIBC_2.36 wcsncmp F
+GLIBC_2.36 wcsncpy F
+GLIBC_2.36 wcsnlen F
+GLIBC_2.36 wcsnrtombs F
+GLIBC_2.36 wcspbrk F
+GLIBC_2.36 wcsrchr F
+GLIBC_2.36 wcsrtombs F
+GLIBC_2.36 wcsspn F
+GLIBC_2.36 wcsstr F
+GLIBC_2.36 wcstod F
+GLIBC_2.36 wcstod_l F
+GLIBC_2.36 wcstof F
+GLIBC_2.36 wcstof128 F
+GLIBC_2.36 wcstof128_l F
+GLIBC_2.36 wcstof32 F
+GLIBC_2.36 wcstof32_l F
+GLIBC_2.36 wcstof32x F
+GLIBC_2.36 wcstof32x_l F
+GLIBC_2.36 wcstof64 F
+GLIBC_2.36 wcstof64_l F
+GLIBC_2.36 wcstof64x F
+GLIBC_2.36 wcstof64x_l F
+GLIBC_2.36 wcstof_l F
+GLIBC_2.36 wcstoimax F
+GLIBC_2.36 wcstok F
+GLIBC_2.36 wcstol F
+GLIBC_2.36 wcstol_l F
+GLIBC_2.36 wcstold F
+GLIBC_2.36 wcstold_l F
+GLIBC_2.36 wcstoll F
+GLIBC_2.36 wcstoll_l F
+GLIBC_2.36 wcstombs F
+GLIBC_2.36 wcstoq F
+GLIBC_2.36 wcstoul F
+GLIBC_2.36 wcstoul_l F
+GLIBC_2.36 wcstoull F
+GLIBC_2.36 wcstoull_l F
+GLIBC_2.36 wcstoumax F
+GLIBC_2.36 wcstouq F
+GLIBC_2.36 wcswcs F
+GLIBC_2.36 wcswidth F
+GLIBC_2.36 wcsxfrm F
+GLIBC_2.36 wcsxfrm_l F
+GLIBC_2.36 wctob F
+GLIBC_2.36 wctomb F
+GLIBC_2.36 wctrans F
+GLIBC_2.36 wctrans_l F
+GLIBC_2.36 wctype F
+GLIBC_2.36 wctype_l F
+GLIBC_2.36 wcwidth F
+GLIBC_2.36 wmemchr F
+GLIBC_2.36 wmemcmp F
+GLIBC_2.36 wmemcpy F
+GLIBC_2.36 wmemmove F
+GLIBC_2.36 wmempcpy F
+GLIBC_2.36 wmemset F
+GLIBC_2.36 wordexp F
+GLIBC_2.36 wordfree F
+GLIBC_2.36 wprintf F
+GLIBC_2.36 write F
+GLIBC_2.36 writev F
+GLIBC_2.36 wscanf F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
new file mode 100644
index 0000000000..6ddfd162b3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
@@ -0,0 +1,26 @@
+GLIBC_2.36 __free_hook D 0x8
+GLIBC_2.36 __malloc_hook D 0x8
+GLIBC_2.36 __memalign_hook D 0x8
+GLIBC_2.36 __realloc_hook D 0x8
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 calloc F
+GLIBC_2.36 free F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 realloc F
+GLIBC_2.36 valloc F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
new file mode 100644
index 0000000000..4d4332dab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.36 crypt F
+GLIBC_2.36 crypt_r F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
new file mode 100644
index 0000000000..6ddb86edef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
@@ -0,0 +1,1031 @@
+GLIBC_2.36 __clog10 F
+GLIBC_2.36 __clog10f F
+GLIBC_2.36 __clog10l F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __fpclassify F
+GLIBC_2.36 __fpclassifyf F
+GLIBC_2.36 __fpclassifyl F
+GLIBC_2.36 __iseqsig F
+GLIBC_2.36 __iseqsigf F
+GLIBC_2.36 __iseqsigl F
+GLIBC_2.36 __issignaling F
+GLIBC_2.36 __issignalingf F
+GLIBC_2.36 __issignalingl F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __signgam D 0x4
+GLIBC_2.36 __sqrtl_finite F
+GLIBC_2.36 acos F
+GLIBC_2.36 acosf F
+GLIBC_2.36 acosf128 F
+GLIBC_2.36 acosf32 F
+GLIBC_2.36 acosf32x F
+GLIBC_2.36 acosf64 F
+GLIBC_2.36 acosf64x F
+GLIBC_2.36 acosh F
+GLIBC_2.36 acoshf F
+GLIBC_2.36 acoshf128 F
+GLIBC_2.36 acoshf32 F
+GLIBC_2.36 acoshf32x F
+GLIBC_2.36 acoshf64 F
+GLIBC_2.36 acoshf64x F
+GLIBC_2.36 acoshl F
+GLIBC_2.36 acosl F
+GLIBC_2.36 asin F
+GLIBC_2.36 asinf F
+GLIBC_2.36 asinf128 F
+GLIBC_2.36 asinf32 F
+GLIBC_2.36 asinf32x F
+GLIBC_2.36 asinf64 F
+GLIBC_2.36 asinf64x F
+GLIBC_2.36 asinh F
+GLIBC_2.36 asinhf F
+GLIBC_2.36 asinhf128 F
+GLIBC_2.36 asinhf32 F
+GLIBC_2.36 asinhf32x F
+GLIBC_2.36 asinhf64 F
+GLIBC_2.36 asinhf64x F
+GLIBC_2.36 asinhl F
+GLIBC_2.36 asinl F
+GLIBC_2.36 atan F
+GLIBC_2.36 atan2 F
+GLIBC_2.36 atan2f F
+GLIBC_2.36 atan2f128 F
+GLIBC_2.36 atan2f32 F
+GLIBC_2.36 atan2f32x F
+GLIBC_2.36 atan2f64 F
+GLIBC_2.36 atan2f64x F
+GLIBC_2.36 atan2l F
+GLIBC_2.36 atanf F
+GLIBC_2.36 atanf128 F
+GLIBC_2.36 atanf32 F
+GLIBC_2.36 atanf32x F
+GLIBC_2.36 atanf64 F
+GLIBC_2.36 atanf64x F
+GLIBC_2.36 atanh F
+GLIBC_2.36 atanhf F
+GLIBC_2.36 atanhf128 F
+GLIBC_2.36 atanhf32 F
+GLIBC_2.36 atanhf32x F
+GLIBC_2.36 atanhf64 F
+GLIBC_2.36 atanhf64x F
+GLIBC_2.36 atanhl F
+GLIBC_2.36 atanl F
+GLIBC_2.36 cabs F
+GLIBC_2.36 cabsf F
+GLIBC_2.36 cabsf128 F
+GLIBC_2.36 cabsf32 F
+GLIBC_2.36 cabsf32x F
+GLIBC_2.36 cabsf64 F
+GLIBC_2.36 cabsf64x F
+GLIBC_2.36 cabsl F
+GLIBC_2.36 cacos F
+GLIBC_2.36 cacosf F
+GLIBC_2.36 cacosf128 F
+GLIBC_2.36 cacosf32 F
+GLIBC_2.36 cacosf32x F
+GLIBC_2.36 cacosf64 F
+GLIBC_2.36 cacosf64x F
+GLIBC_2.36 cacosh F
+GLIBC_2.36 cacoshf F
+GLIBC_2.36 cacoshf128 F
+GLIBC_2.36 cacoshf32 F
+GLIBC_2.36 cacoshf32x F
+GLIBC_2.36 cacoshf64 F
+GLIBC_2.36 cacoshf64x F
+GLIBC_2.36 cacoshl F
+GLIBC_2.36 cacosl F
+GLIBC_2.36 canonicalize F
+GLIBC_2.36 canonicalizef F
+GLIBC_2.36 canonicalizef128 F
+GLIBC_2.36 canonicalizef32 F
+GLIBC_2.36 canonicalizef32x F
+GLIBC_2.36 canonicalizef64 F
+GLIBC_2.36 canonicalizef64x F
+GLIBC_2.36 canonicalizel F
+GLIBC_2.36 carg F
+GLIBC_2.36 cargf F
+GLIBC_2.36 cargf128 F
+GLIBC_2.36 cargf32 F
+GLIBC_2.36 cargf32x F
+GLIBC_2.36 cargf64 F
+GLIBC_2.36 cargf64x F
+GLIBC_2.36 cargl F
+GLIBC_2.36 casin F
+GLIBC_2.36 casinf F
+GLIBC_2.36 casinf128 F
+GLIBC_2.36 casinf32 F
+GLIBC_2.36 casinf32x F
+GLIBC_2.36 casinf64 F
+GLIBC_2.36 casinf64x F
+GLIBC_2.36 casinh F
+GLIBC_2.36 casinhf F
+GLIBC_2.36 casinhf128 F
+GLIBC_2.36 casinhf32 F
+GLIBC_2.36 casinhf32x F
+GLIBC_2.36 casinhf64 F
+GLIBC_2.36 casinhf64x F
+GLIBC_2.36 casinhl F
+GLIBC_2.36 casinl F
+GLIBC_2.36 catan F
+GLIBC_2.36 catanf F
+GLIBC_2.36 catanf128 F
+GLIBC_2.36 catanf32 F
+GLIBC_2.36 catanf32x F
+GLIBC_2.36 catanf64 F
+GLIBC_2.36 catanf64x F
+GLIBC_2.36 catanh F
+GLIBC_2.36 catanhf F
+GLIBC_2.36 catanhf128 F
+GLIBC_2.36 catanhf32 F
+GLIBC_2.36 catanhf32x F
+GLIBC_2.36 catanhf64 F
+GLIBC_2.36 catanhf64x F
+GLIBC_2.36 catanhl F
+GLIBC_2.36 catanl F
+GLIBC_2.36 cbrt F
+GLIBC_2.36 cbrtf F
+GLIBC_2.36 cbrtf128 F
+GLIBC_2.36 cbrtf32 F
+GLIBC_2.36 cbrtf32x F
+GLIBC_2.36 cbrtf64 F
+GLIBC_2.36 cbrtf64x F
+GLIBC_2.36 cbrtl F
+GLIBC_2.36 ccos F
+GLIBC_2.36 ccosf F
+GLIBC_2.36 ccosf128 F
+GLIBC_2.36 ccosf32 F
+GLIBC_2.36 ccosf32x F
+GLIBC_2.36 ccosf64 F
+GLIBC_2.36 ccosf64x F
+GLIBC_2.36 ccosh F
+GLIBC_2.36 ccoshf F
+GLIBC_2.36 ccoshf128 F
+GLIBC_2.36 ccoshf32 F
+GLIBC_2.36 ccoshf32x F
+GLIBC_2.36 ccoshf64 F
+GLIBC_2.36 ccoshf64x F
+GLIBC_2.36 ccoshl F
+GLIBC_2.36 ccosl F
+GLIBC_2.36 ceil F
+GLIBC_2.36 ceilf F
+GLIBC_2.36 ceilf128 F
+GLIBC_2.36 ceilf32 F
+GLIBC_2.36 ceilf32x F
+GLIBC_2.36 ceilf64 F
+GLIBC_2.36 ceilf64x F
+GLIBC_2.36 ceill F
+GLIBC_2.36 cexp F
+GLIBC_2.36 cexpf F
+GLIBC_2.36 cexpf128 F
+GLIBC_2.36 cexpf32 F
+GLIBC_2.36 cexpf32x F
+GLIBC_2.36 cexpf64 F
+GLIBC_2.36 cexpf64x F
+GLIBC_2.36 cexpl F
+GLIBC_2.36 cimag F
+GLIBC_2.36 cimagf F
+GLIBC_2.36 cimagf128 F
+GLIBC_2.36 cimagf32 F
+GLIBC_2.36 cimagf32x F
+GLIBC_2.36 cimagf64 F
+GLIBC_2.36 cimagf64x F
+GLIBC_2.36 cimagl F
+GLIBC_2.36 clog F
+GLIBC_2.36 clog10 F
+GLIBC_2.36 clog10f F
+GLIBC_2.36 clog10f128 F
+GLIBC_2.36 clog10f32 F
+GLIBC_2.36 clog10f32x F
+GLIBC_2.36 clog10f64 F
+GLIBC_2.36 clog10f64x F
+GLIBC_2.36 clog10l F
+GLIBC_2.36 clogf F
+GLIBC_2.36 clogf128 F
+GLIBC_2.36 clogf32 F
+GLIBC_2.36 clogf32x F
+GLIBC_2.36 clogf64 F
+GLIBC_2.36 clogf64x F
+GLIBC_2.36 clogl F
+GLIBC_2.36 conj F
+GLIBC_2.36 conjf F
+GLIBC_2.36 conjf128 F
+GLIBC_2.36 conjf32 F
+GLIBC_2.36 conjf32x F
+GLIBC_2.36 conjf64 F
+GLIBC_2.36 conjf64x F
+GLIBC_2.36 conjl F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignf128 F
+GLIBC_2.36 copysignf32 F
+GLIBC_2.36 copysignf32x F
+GLIBC_2.36 copysignf64 F
+GLIBC_2.36 copysignf64x F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 cos F
+GLIBC_2.36 cosf F
+GLIBC_2.36 cosf128 F
+GLIBC_2.36 cosf32 F
+GLIBC_2.36 cosf32x F
+GLIBC_2.36 cosf64 F
+GLIBC_2.36 cosf64x F
+GLIBC_2.36 cosh F
+GLIBC_2.36 coshf F
+GLIBC_2.36 coshf128 F
+GLIBC_2.36 coshf32 F
+GLIBC_2.36 coshf32x F
+GLIBC_2.36 coshf64 F
+GLIBC_2.36 coshf64x F
+GLIBC_2.36 coshl F
+GLIBC_2.36 cosl F
+GLIBC_2.36 cpow F
+GLIBC_2.36 cpowf F
+GLIBC_2.36 cpowf128 F
+GLIBC_2.36 cpowf32 F
+GLIBC_2.36 cpowf32x F
+GLIBC_2.36 cpowf64 F
+GLIBC_2.36 cpowf64x F
+GLIBC_2.36 cpowl F
+GLIBC_2.36 cproj F
+GLIBC_2.36 cprojf F
+GLIBC_2.36 cprojf128 F
+GLIBC_2.36 cprojf32 F
+GLIBC_2.36 cprojf32x F
+GLIBC_2.36 cprojf64 F
+GLIBC_2.36 cprojf64x F
+GLIBC_2.36 cprojl F
+GLIBC_2.36 creal F
+GLIBC_2.36 crealf F
+GLIBC_2.36 crealf128 F
+GLIBC_2.36 crealf32 F
+GLIBC_2.36 crealf32x F
+GLIBC_2.36 crealf64 F
+GLIBC_2.36 crealf64x F
+GLIBC_2.36 creall F
+GLIBC_2.36 csin F
+GLIBC_2.36 csinf F
+GLIBC_2.36 csinf128 F
+GLIBC_2.36 csinf32 F
+GLIBC_2.36 csinf32x F
+GLIBC_2.36 csinf64 F
+GLIBC_2.36 csinf64x F
+GLIBC_2.36 csinh F
+GLIBC_2.36 csinhf F
+GLIBC_2.36 csinhf128 F
+GLIBC_2.36 csinhf32 F
+GLIBC_2.36 csinhf32x F
+GLIBC_2.36 csinhf64 F
+GLIBC_2.36 csinhf64x F
+GLIBC_2.36 csinhl F
+GLIBC_2.36 csinl F
+GLIBC_2.36 csqrt F
+GLIBC_2.36 csqrtf F
+GLIBC_2.36 csqrtf128 F
+GLIBC_2.36 csqrtf32 F
+GLIBC_2.36 csqrtf32x F
+GLIBC_2.36 csqrtf64 F
+GLIBC_2.36 csqrtf64x F
+GLIBC_2.36 csqrtl F
+GLIBC_2.36 ctan F
+GLIBC_2.36 ctanf F
+GLIBC_2.36 ctanf128 F
+GLIBC_2.36 ctanf32 F
+GLIBC_2.36 ctanf32x F
+GLIBC_2.36 ctanf64 F
+GLIBC_2.36 ctanf64x F
+GLIBC_2.36 ctanh F
+GLIBC_2.36 ctanhf F
+GLIBC_2.36 ctanhf128 F
+GLIBC_2.36 ctanhf32 F
+GLIBC_2.36 ctanhf32x F
+GLIBC_2.36 ctanhf64 F
+GLIBC_2.36 ctanhf64x F
+GLIBC_2.36 ctanhl F
+GLIBC_2.36 ctanl F
+GLIBC_2.36 daddl F
+GLIBC_2.36 ddivl F
+GLIBC_2.36 dfmal F
+GLIBC_2.36 dmull F
+GLIBC_2.36 drem F
+GLIBC_2.36 dremf F
+GLIBC_2.36 dreml F
+GLIBC_2.36 dsqrtl F
+GLIBC_2.36 dsubl F
+GLIBC_2.36 erf F
+GLIBC_2.36 erfc F
+GLIBC_2.36 erfcf F
+GLIBC_2.36 erfcf128 F
+GLIBC_2.36 erfcf32 F
+GLIBC_2.36 erfcf32x F
+GLIBC_2.36 erfcf64 F
+GLIBC_2.36 erfcf64x F
+GLIBC_2.36 erfcl F
+GLIBC_2.36 erff F
+GLIBC_2.36 erff128 F
+GLIBC_2.36 erff32 F
+GLIBC_2.36 erff32x F
+GLIBC_2.36 erff64 F
+GLIBC_2.36 erff64x F
+GLIBC_2.36 erfl F
+GLIBC_2.36 exp F
+GLIBC_2.36 exp10 F
+GLIBC_2.36 exp10f F
+GLIBC_2.36 exp10f128 F
+GLIBC_2.36 exp10f32 F
+GLIBC_2.36 exp10f32x F
+GLIBC_2.36 exp10f64 F
+GLIBC_2.36 exp10f64x F
+GLIBC_2.36 exp10l F
+GLIBC_2.36 exp2 F
+GLIBC_2.36 exp2f F
+GLIBC_2.36 exp2f128 F
+GLIBC_2.36 exp2f32 F
+GLIBC_2.36 exp2f32x F
+GLIBC_2.36 exp2f64 F
+GLIBC_2.36 exp2f64x F
+GLIBC_2.36 exp2l F
+GLIBC_2.36 expf F
+GLIBC_2.36 expf128 F
+GLIBC_2.36 expf32 F
+GLIBC_2.36 expf32x F
+GLIBC_2.36 expf64 F
+GLIBC_2.36 expf64x F
+GLIBC_2.36 expl F
+GLIBC_2.36 expm1 F
+GLIBC_2.36 expm1f F
+GLIBC_2.36 expm1f128 F
+GLIBC_2.36 expm1f32 F
+GLIBC_2.36 expm1f32x F
+GLIBC_2.36 expm1f64 F
+GLIBC_2.36 expm1f64x F
+GLIBC_2.36 expm1l F
+GLIBC_2.36 f32addf128 F
+GLIBC_2.36 f32addf32x F
+GLIBC_2.36 f32addf64 F
+GLIBC_2.36 f32addf64x F
+GLIBC_2.36 f32divf128 F
+GLIBC_2.36 f32divf32x F
+GLIBC_2.36 f32divf64 F
+GLIBC_2.36 f32divf64x F
+GLIBC_2.36 f32fmaf128 F
+GLIBC_2.36 f32fmaf32x F
+GLIBC_2.36 f32fmaf64 F
+GLIBC_2.36 f32fmaf64x F
+GLIBC_2.36 f32mulf128 F
+GLIBC_2.36 f32mulf32x F
+GLIBC_2.36 f32mulf64 F
+GLIBC_2.36 f32mulf64x F
+GLIBC_2.36 f32sqrtf128 F
+GLIBC_2.36 f32sqrtf32x F
+GLIBC_2.36 f32sqrtf64 F
+GLIBC_2.36 f32sqrtf64x F
+GLIBC_2.36 f32subf128 F
+GLIBC_2.36 f32subf32x F
+GLIBC_2.36 f32subf64 F
+GLIBC_2.36 f32subf64x F
+GLIBC_2.36 f32xaddf128 F
+GLIBC_2.36 f32xaddf64 F
+GLIBC_2.36 f32xaddf64x F
+GLIBC_2.36 f32xdivf128 F
+GLIBC_2.36 f32xdivf64 F
+GLIBC_2.36 f32xdivf64x F
+GLIBC_2.36 f32xfmaf128 F
+GLIBC_2.36 f32xfmaf64 F
+GLIBC_2.36 f32xfmaf64x F
+GLIBC_2.36 f32xmulf128 F
+GLIBC_2.36 f32xmulf64 F
+GLIBC_2.36 f32xmulf64x F
+GLIBC_2.36 f32xsqrtf128 F
+GLIBC_2.36 f32xsqrtf64 F
+GLIBC_2.36 f32xsqrtf64x F
+GLIBC_2.36 f32xsubf128 F
+GLIBC_2.36 f32xsubf64 F
+GLIBC_2.36 f32xsubf64x F
+GLIBC_2.36 f64addf128 F
+GLIBC_2.36 f64addf64x F
+GLIBC_2.36 f64divf128 F
+GLIBC_2.36 f64divf64x F
+GLIBC_2.36 f64fmaf128 F
+GLIBC_2.36 f64fmaf64x F
+GLIBC_2.36 f64mulf128 F
+GLIBC_2.36 f64mulf64x F
+GLIBC_2.36 f64sqrtf128 F
+GLIBC_2.36 f64sqrtf64x F
+GLIBC_2.36 f64subf128 F
+GLIBC_2.36 f64subf64x F
+GLIBC_2.36 f64xaddf128 F
+GLIBC_2.36 f64xdivf128 F
+GLIBC_2.36 f64xfmaf128 F
+GLIBC_2.36 f64xmulf128 F
+GLIBC_2.36 f64xsqrtf128 F
+GLIBC_2.36 f64xsubf128 F
+GLIBC_2.36 fabs F
+GLIBC_2.36 fabsf F
+GLIBC_2.36 fabsf128 F
+GLIBC_2.36 fabsf32 F
+GLIBC_2.36 fabsf32x F
+GLIBC_2.36 fabsf64 F
+GLIBC_2.36 fabsf64x F
+GLIBC_2.36 fabsl F
+GLIBC_2.36 fadd F
+GLIBC_2.36 faddl F
+GLIBC_2.36 fdim F
+GLIBC_2.36 fdimf F
+GLIBC_2.36 fdimf128 F
+GLIBC_2.36 fdimf32 F
+GLIBC_2.36 fdimf32x F
+GLIBC_2.36 fdimf64 F
+GLIBC_2.36 fdimf64x F
+GLIBC_2.36 fdiml F
+GLIBC_2.36 fdiv F
+GLIBC_2.36 fdivl F
+GLIBC_2.36 feclearexcept F
+GLIBC_2.36 fedisableexcept F
+GLIBC_2.36 feenableexcept F
+GLIBC_2.36 fegetenv F
+GLIBC_2.36 fegetexcept F
+GLIBC_2.36 fegetexceptflag F
+GLIBC_2.36 fegetmode F
+GLIBC_2.36 fegetround F
+GLIBC_2.36 feholdexcept F
+GLIBC_2.36 feraiseexcept F
+GLIBC_2.36 fesetenv F
+GLIBC_2.36 fesetexcept F
+GLIBC_2.36 fesetexceptflag F
+GLIBC_2.36 fesetmode F
+GLIBC_2.36 fesetround F
+GLIBC_2.36 fetestexcept F
+GLIBC_2.36 fetestexceptflag F
+GLIBC_2.36 feupdateenv F
+GLIBC_2.36 ffma F
+GLIBC_2.36 ffmal F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 floor F
+GLIBC_2.36 floorf F
+GLIBC_2.36 floorf128 F
+GLIBC_2.36 floorf32 F
+GLIBC_2.36 floorf32x F
+GLIBC_2.36 floorf64 F
+GLIBC_2.36 floorf64x F
+GLIBC_2.36 floorl F
+GLIBC_2.36 fma F
+GLIBC_2.36 fmaf F
+GLIBC_2.36 fmaf128 F
+GLIBC_2.36 fmaf32 F
+GLIBC_2.36 fmaf32x F
+GLIBC_2.36 fmaf64 F
+GLIBC_2.36 fmaf64x F
+GLIBC_2.36 fmal F
+GLIBC_2.36 fmax F
+GLIBC_2.36 fmaxf F
+GLIBC_2.36 fmaxf128 F
+GLIBC_2.36 fmaxf32 F
+GLIBC_2.36 fmaxf32x F
+GLIBC_2.36 fmaxf64 F
+GLIBC_2.36 fmaxf64x F
+GLIBC_2.36 fmaximum F
+GLIBC_2.36 fmaximum_mag F
+GLIBC_2.36 fmaximum_mag_num F
+GLIBC_2.36 fmaximum_mag_numf F
+GLIBC_2.36 fmaximum_mag_numf128 F
+GLIBC_2.36 fmaximum_mag_numf32 F
+GLIBC_2.36 fmaximum_mag_numf32x F
+GLIBC_2.36 fmaximum_mag_numf64 F
+GLIBC_2.36 fmaximum_mag_numf64x F
+GLIBC_2.36 fmaximum_mag_numl F
+GLIBC_2.36 fmaximum_magf F
+GLIBC_2.36 fmaximum_magf128 F
+GLIBC_2.36 fmaximum_magf32 F
+GLIBC_2.36 fmaximum_magf32x F
+GLIBC_2.36 fmaximum_magf64 F
+GLIBC_2.36 fmaximum_magf64x F
+GLIBC_2.36 fmaximum_magl F
+GLIBC_2.36 fmaximum_num F
+GLIBC_2.36 fmaximum_numf F
+GLIBC_2.36 fmaximum_numf128 F
+GLIBC_2.36 fmaximum_numf32 F
+GLIBC_2.36 fmaximum_numf32x F
+GLIBC_2.36 fmaximum_numf64 F
+GLIBC_2.36 fmaximum_numf64x F
+GLIBC_2.36 fmaximum_numl F
+GLIBC_2.36 fmaximumf F
+GLIBC_2.36 fmaximumf128 F
+GLIBC_2.36 fmaximumf32 F
+GLIBC_2.36 fmaximumf32x F
+GLIBC_2.36 fmaximumf64 F
+GLIBC_2.36 fmaximumf64x F
+GLIBC_2.36 fmaximuml F
+GLIBC_2.36 fmaxl F
+GLIBC_2.36 fmaxmag F
+GLIBC_2.36 fmaxmagf F
+GLIBC_2.36 fmaxmagf128 F
+GLIBC_2.36 fmaxmagf32 F
+GLIBC_2.36 fmaxmagf32x F
+GLIBC_2.36 fmaxmagf64 F
+GLIBC_2.36 fmaxmagf64x F
+GLIBC_2.36 fmaxmagl F
+GLIBC_2.36 fmin F
+GLIBC_2.36 fminf F
+GLIBC_2.36 fminf128 F
+GLIBC_2.36 fminf32 F
+GLIBC_2.36 fminf32x F
+GLIBC_2.36 fminf64 F
+GLIBC_2.36 fminf64x F
+GLIBC_2.36 fminimum F
+GLIBC_2.36 fminimum_mag F
+GLIBC_2.36 fminimum_mag_num F
+GLIBC_2.36 fminimum_mag_numf F
+GLIBC_2.36 fminimum_mag_numf128 F
+GLIBC_2.36 fminimum_mag_numf32 F
+GLIBC_2.36 fminimum_mag_numf32x F
+GLIBC_2.36 fminimum_mag_numf64 F
+GLIBC_2.36 fminimum_mag_numf64x F
+GLIBC_2.36 fminimum_mag_numl F
+GLIBC_2.36 fminimum_magf F
+GLIBC_2.36 fminimum_magf128 F
+GLIBC_2.36 fminimum_magf32 F
+GLIBC_2.36 fminimum_magf32x F
+GLIBC_2.36 fminimum_magf64 F
+GLIBC_2.36 fminimum_magf64x F
+GLIBC_2.36 fminimum_magl F
+GLIBC_2.36 fminimum_num F
+GLIBC_2.36 fminimum_numf F
+GLIBC_2.36 fminimum_numf128 F
+GLIBC_2.36 fminimum_numf32 F
+GLIBC_2.36 fminimum_numf32x F
+GLIBC_2.36 fminimum_numf64 F
+GLIBC_2.36 fminimum_numf64x F
+GLIBC_2.36 fminimum_numl F
+GLIBC_2.36 fminimumf F
+GLIBC_2.36 fminimumf128 F
+GLIBC_2.36 fminimumf32 F
+GLIBC_2.36 fminimumf32x F
+GLIBC_2.36 fminimumf64 F
+GLIBC_2.36 fminimumf64x F
+GLIBC_2.36 fminimuml F
+GLIBC_2.36 fminl F
+GLIBC_2.36 fminmag F
+GLIBC_2.36 fminmagf F
+GLIBC_2.36 fminmagf128 F
+GLIBC_2.36 fminmagf32 F
+GLIBC_2.36 fminmagf32x F
+GLIBC_2.36 fminmagf64 F
+GLIBC_2.36 fminmagf64x F
+GLIBC_2.36 fminmagl F
+GLIBC_2.36 fmod F
+GLIBC_2.36 fmodf F
+GLIBC_2.36 fmodf128 F
+GLIBC_2.36 fmodf32 F
+GLIBC_2.36 fmodf32x F
+GLIBC_2.36 fmodf64 F
+GLIBC_2.36 fmodf64x F
+GLIBC_2.36 fmodl F
+GLIBC_2.36 fmul F
+GLIBC_2.36 fmull F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpf128 F
+GLIBC_2.36 frexpf32 F
+GLIBC_2.36 frexpf32x F
+GLIBC_2.36 frexpf64 F
+GLIBC_2.36 frexpf64x F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fromfp F
+GLIBC_2.36 fromfpf F
+GLIBC_2.36 fromfpf128 F
+GLIBC_2.36 fromfpf32 F
+GLIBC_2.36 fromfpf32x F
+GLIBC_2.36 fromfpf64 F
+GLIBC_2.36 fromfpf64x F
+GLIBC_2.36 fromfpl F
+GLIBC_2.36 fromfpx F
+GLIBC_2.36 fromfpxf F
+GLIBC_2.36 fromfpxf128 F
+GLIBC_2.36 fromfpxf32 F
+GLIBC_2.36 fromfpxf32x F
+GLIBC_2.36 fromfpxf64 F
+GLIBC_2.36 fromfpxf64x F
+GLIBC_2.36 fromfpxl F
+GLIBC_2.36 fsqrt F
+GLIBC_2.36 fsqrtl F
+GLIBC_2.36 fsub F
+GLIBC_2.36 fsubl F
+GLIBC_2.36 gamma F
+GLIBC_2.36 gammaf F
+GLIBC_2.36 gammal F
+GLIBC_2.36 getpayload F
+GLIBC_2.36 getpayloadf F
+GLIBC_2.36 getpayloadf128 F
+GLIBC_2.36 getpayloadf32 F
+GLIBC_2.36 getpayloadf32x F
+GLIBC_2.36 getpayloadf64 F
+GLIBC_2.36 getpayloadf64x F
+GLIBC_2.36 getpayloadl F
+GLIBC_2.36 hypot F
+GLIBC_2.36 hypotf F
+GLIBC_2.36 hypotf128 F
+GLIBC_2.36 hypotf32 F
+GLIBC_2.36 hypotf32x F
+GLIBC_2.36 hypotf64 F
+GLIBC_2.36 hypotf64x F
+GLIBC_2.36 hypotl F
+GLIBC_2.36 ilogb F
+GLIBC_2.36 ilogbf F
+GLIBC_2.36 ilogbf128 F
+GLIBC_2.36 ilogbf32 F
+GLIBC_2.36 ilogbf32x F
+GLIBC_2.36 ilogbf64 F
+GLIBC_2.36 ilogbf64x F
+GLIBC_2.36 ilogbl F
+GLIBC_2.36 j0 F
+GLIBC_2.36 j0f F
+GLIBC_2.36 j0f128 F
+GLIBC_2.36 j0f32 F
+GLIBC_2.36 j0f32x F
+GLIBC_2.36 j0f64 F
+GLIBC_2.36 j0f64x F
+GLIBC_2.36 j0l F
+GLIBC_2.36 j1 F
+GLIBC_2.36 j1f F
+GLIBC_2.36 j1f128 F
+GLIBC_2.36 j1f32 F
+GLIBC_2.36 j1f32x F
+GLIBC_2.36 j1f64 F
+GLIBC_2.36 j1f64x F
+GLIBC_2.36 j1l F
+GLIBC_2.36 jn F
+GLIBC_2.36 jnf F
+GLIBC_2.36 jnf128 F
+GLIBC_2.36 jnf32 F
+GLIBC_2.36 jnf32x F
+GLIBC_2.36 jnf64 F
+GLIBC_2.36 jnf64x F
+GLIBC_2.36 jnl F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpf128 F
+GLIBC_2.36 ldexpf32 F
+GLIBC_2.36 ldexpf32x F
+GLIBC_2.36 ldexpf64 F
+GLIBC_2.36 ldexpf64x F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 lgamma F
+GLIBC_2.36 lgamma_r F
+GLIBC_2.36 lgammaf F
+GLIBC_2.36 lgammaf128 F
+GLIBC_2.36 lgammaf128_r F
+GLIBC_2.36 lgammaf32 F
+GLIBC_2.36 lgammaf32_r F
+GLIBC_2.36 lgammaf32x F
+GLIBC_2.36 lgammaf32x_r F
+GLIBC_2.36 lgammaf64 F
+GLIBC_2.36 lgammaf64_r F
+GLIBC_2.36 lgammaf64x F
+GLIBC_2.36 lgammaf64x_r F
+GLIBC_2.36 lgammaf_r F
+GLIBC_2.36 lgammal F
+GLIBC_2.36 lgammal_r F
+GLIBC_2.36 llogb F
+GLIBC_2.36 llogbf F
+GLIBC_2.36 llogbf128 F
+GLIBC_2.36 llogbf32 F
+GLIBC_2.36 llogbf32x F
+GLIBC_2.36 llogbf64 F
+GLIBC_2.36 llogbf64x F
+GLIBC_2.36 llogbl F
+GLIBC_2.36 llrint F
+GLIBC_2.36 llrintf F
+GLIBC_2.36 llrintf128 F
+GLIBC_2.36 llrintf32 F
+GLIBC_2.36 llrintf32x F
+GLIBC_2.36 llrintf64 F
+GLIBC_2.36 llrintf64x F
+GLIBC_2.36 llrintl F
+GLIBC_2.36 llround F
+GLIBC_2.36 llroundf F
+GLIBC_2.36 llroundf128 F
+GLIBC_2.36 llroundf32 F
+GLIBC_2.36 llroundf32x F
+GLIBC_2.36 llroundf64 F
+GLIBC_2.36 llroundf64x F
+GLIBC_2.36 llroundl F
+GLIBC_2.36 log F
+GLIBC_2.36 log10 F
+GLIBC_2.36 log10f F
+GLIBC_2.36 log10f128 F
+GLIBC_2.36 log10f32 F
+GLIBC_2.36 log10f32x F
+GLIBC_2.36 log10f64 F
+GLIBC_2.36 log10f64x F
+GLIBC_2.36 log10l F
+GLIBC_2.36 log1p F
+GLIBC_2.36 log1pf F
+GLIBC_2.36 log1pf128 F
+GLIBC_2.36 log1pf32 F
+GLIBC_2.36 log1pf32x F
+GLIBC_2.36 log1pf64 F
+GLIBC_2.36 log1pf64x F
+GLIBC_2.36 log1pl F
+GLIBC_2.36 log2 F
+GLIBC_2.36 log2f F
+GLIBC_2.36 log2f128 F
+GLIBC_2.36 log2f32 F
+GLIBC_2.36 log2f32x F
+GLIBC_2.36 log2f64 F
+GLIBC_2.36 log2f64x F
+GLIBC_2.36 log2l F
+GLIBC_2.36 logb F
+GLIBC_2.36 logbf F
+GLIBC_2.36 logbf128 F
+GLIBC_2.36 logbf32 F
+GLIBC_2.36 logbf32x F
+GLIBC_2.36 logbf64 F
+GLIBC_2.36 logbf64x F
+GLIBC_2.36 logbl F
+GLIBC_2.36 logf F
+GLIBC_2.36 logf128 F
+GLIBC_2.36 logf32 F
+GLIBC_2.36 logf32x F
+GLIBC_2.36 logf64 F
+GLIBC_2.36 logf64x F
+GLIBC_2.36 logl F
+GLIBC_2.36 lrint F
+GLIBC_2.36 lrintf F
+GLIBC_2.36 lrintf128 F
+GLIBC_2.36 lrintf32 F
+GLIBC_2.36 lrintf32x F
+GLIBC_2.36 lrintf64 F
+GLIBC_2.36 lrintf64x F
+GLIBC_2.36 lrintl F
+GLIBC_2.36 lround F
+GLIBC_2.36 lroundf F
+GLIBC_2.36 lroundf128 F
+GLIBC_2.36 lroundf32 F
+GLIBC_2.36 lroundf32x F
+GLIBC_2.36 lroundf64 F
+GLIBC_2.36 lroundf64x F
+GLIBC_2.36 lroundl F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modff128 F
+GLIBC_2.36 modff32 F
+GLIBC_2.36 modff32x F
+GLIBC_2.36 modff64 F
+GLIBC_2.36 modff64x F
+GLIBC_2.36 modfl F
+GLIBC_2.36 nan F
+GLIBC_2.36 nanf F
+GLIBC_2.36 nanf128 F
+GLIBC_2.36 nanf32 F
+GLIBC_2.36 nanf32x F
+GLIBC_2.36 nanf64 F
+GLIBC_2.36 nanf64x F
+GLIBC_2.36 nanl F
+GLIBC_2.36 nearbyint F
+GLIBC_2.36 nearbyintf F
+GLIBC_2.36 nearbyintf128 F
+GLIBC_2.36 nearbyintf32 F
+GLIBC_2.36 nearbyintf32x F
+GLIBC_2.36 nearbyintf64 F
+GLIBC_2.36 nearbyintf64x F
+GLIBC_2.36 nearbyintl F
+GLIBC_2.36 nextafter F
+GLIBC_2.36 nextafterf F
+GLIBC_2.36 nextafterf128 F
+GLIBC_2.36 nextafterf32 F
+GLIBC_2.36 nextafterf32x F
+GLIBC_2.36 nextafterf64 F
+GLIBC_2.36 nextafterf64x F
+GLIBC_2.36 nextafterl F
+GLIBC_2.36 nextdown F
+GLIBC_2.36 nextdownf F
+GLIBC_2.36 nextdownf128 F
+GLIBC_2.36 nextdownf32 F
+GLIBC_2.36 nextdownf32x F
+GLIBC_2.36 nextdownf64 F
+GLIBC_2.36 nextdownf64x F
+GLIBC_2.36 nextdownl F
+GLIBC_2.36 nexttoward F
+GLIBC_2.36 nexttowardf F
+GLIBC_2.36 nexttowardl F
+GLIBC_2.36 nextup F
+GLIBC_2.36 nextupf F
+GLIBC_2.36 nextupf128 F
+GLIBC_2.36 nextupf32 F
+GLIBC_2.36 nextupf32x F
+GLIBC_2.36 nextupf64 F
+GLIBC_2.36 nextupf64x F
+GLIBC_2.36 nextupl F
+GLIBC_2.36 pow F
+GLIBC_2.36 powf F
+GLIBC_2.36 powf128 F
+GLIBC_2.36 powf32 F
+GLIBC_2.36 powf32x F
+GLIBC_2.36 powf64 F
+GLIBC_2.36 powf64x F
+GLIBC_2.36 powl F
+GLIBC_2.36 remainder F
+GLIBC_2.36 remainderf F
+GLIBC_2.36 remainderf128 F
+GLIBC_2.36 remainderf32 F
+GLIBC_2.36 remainderf32x F
+GLIBC_2.36 remainderf64 F
+GLIBC_2.36 remainderf64x F
+GLIBC_2.36 remainderl F
+GLIBC_2.36 remquo F
+GLIBC_2.36 remquof F
+GLIBC_2.36 remquof128 F
+GLIBC_2.36 remquof32 F
+GLIBC_2.36 remquof32x F
+GLIBC_2.36 remquof64 F
+GLIBC_2.36 remquof64x F
+GLIBC_2.36 remquol F
+GLIBC_2.36 rint F
+GLIBC_2.36 rintf F
+GLIBC_2.36 rintf128 F
+GLIBC_2.36 rintf32 F
+GLIBC_2.36 rintf32x F
+GLIBC_2.36 rintf64 F
+GLIBC_2.36 rintf64x F
+GLIBC_2.36 rintl F
+GLIBC_2.36 round F
+GLIBC_2.36 roundeven F
+GLIBC_2.36 roundevenf F
+GLIBC_2.36 roundevenf128 F
+GLIBC_2.36 roundevenf32 F
+GLIBC_2.36 roundevenf32x F
+GLIBC_2.36 roundevenf64 F
+GLIBC_2.36 roundevenf64x F
+GLIBC_2.36 roundevenl F
+GLIBC_2.36 roundf F
+GLIBC_2.36 roundf128 F
+GLIBC_2.36 roundf32 F
+GLIBC_2.36 roundf32x F
+GLIBC_2.36 roundf64 F
+GLIBC_2.36 roundf64x F
+GLIBC_2.36 roundl F
+GLIBC_2.36 scalb F
+GLIBC_2.36 scalbf F
+GLIBC_2.36 scalbl F
+GLIBC_2.36 scalbln F
+GLIBC_2.36 scalblnf F
+GLIBC_2.36 scalblnf128 F
+GLIBC_2.36 scalblnf32 F
+GLIBC_2.36 scalblnf32x F
+GLIBC_2.36 scalblnf64 F
+GLIBC_2.36 scalblnf64x F
+GLIBC_2.36 scalblnl F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnf128 F
+GLIBC_2.36 scalbnf32 F
+GLIBC_2.36 scalbnf32x F
+GLIBC_2.36 scalbnf64 F
+GLIBC_2.36 scalbnf64x F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 setpayload F
+GLIBC_2.36 setpayloadf F
+GLIBC_2.36 setpayloadf128 F
+GLIBC_2.36 setpayloadf32 F
+GLIBC_2.36 setpayloadf32x F
+GLIBC_2.36 setpayloadf64 F
+GLIBC_2.36 setpayloadf64x F
+GLIBC_2.36 setpayloadl F
+GLIBC_2.36 setpayloadsig F
+GLIBC_2.36 setpayloadsigf F
+GLIBC_2.36 setpayloadsigf128 F
+GLIBC_2.36 setpayloadsigf32 F
+GLIBC_2.36 setpayloadsigf32x F
+GLIBC_2.36 setpayloadsigf64 F
+GLIBC_2.36 setpayloadsigf64x F
+GLIBC_2.36 setpayloadsigl F
+GLIBC_2.36 signgam D 0x4
+GLIBC_2.36 significand F
+GLIBC_2.36 significandf F
+GLIBC_2.36 significandl F
+GLIBC_2.36 sin F
+GLIBC_2.36 sincos F
+GLIBC_2.36 sincosf F
+GLIBC_2.36 sincosf128 F
+GLIBC_2.36 sincosf32 F
+GLIBC_2.36 sincosf32x F
+GLIBC_2.36 sincosf64 F
+GLIBC_2.36 sincosf64x F
+GLIBC_2.36 sincosl F
+GLIBC_2.36 sinf F
+GLIBC_2.36 sinf128 F
+GLIBC_2.36 sinf32 F
+GLIBC_2.36 sinf32x F
+GLIBC_2.36 sinf64 F
+GLIBC_2.36 sinf64x F
+GLIBC_2.36 sinh F
+GLIBC_2.36 sinhf F
+GLIBC_2.36 sinhf128 F
+GLIBC_2.36 sinhf32 F
+GLIBC_2.36 sinhf32x F
+GLIBC_2.36 sinhf64 F
+GLIBC_2.36 sinhf64x F
+GLIBC_2.36 sinhl F
+GLIBC_2.36 sinl F
+GLIBC_2.36 sqrt F
+GLIBC_2.36 sqrtf F
+GLIBC_2.36 sqrtf128 F
+GLIBC_2.36 sqrtf32 F
+GLIBC_2.36 sqrtf32x F
+GLIBC_2.36 sqrtf64 F
+GLIBC_2.36 sqrtf64x F
+GLIBC_2.36 sqrtl F
+GLIBC_2.36 tan F
+GLIBC_2.36 tanf F
+GLIBC_2.36 tanf128 F
+GLIBC_2.36 tanf32 F
+GLIBC_2.36 tanf32x F
+GLIBC_2.36 tanf64 F
+GLIBC_2.36 tanf64x F
+GLIBC_2.36 tanh F
+GLIBC_2.36 tanhf F
+GLIBC_2.36 tanhf128 F
+GLIBC_2.36 tanhf32 F
+GLIBC_2.36 tanhf32x F
+GLIBC_2.36 tanhf64 F
+GLIBC_2.36 tanhf64x F
+GLIBC_2.36 tanhl F
+GLIBC_2.36 tanl F
+GLIBC_2.36 tgamma F
+GLIBC_2.36 tgammaf F
+GLIBC_2.36 tgammaf128 F
+GLIBC_2.36 tgammaf32 F
+GLIBC_2.36 tgammaf32x F
+GLIBC_2.36 tgammaf64 F
+GLIBC_2.36 tgammaf64x F
+GLIBC_2.36 tgammal F
+GLIBC_2.36 totalorder F
+GLIBC_2.36 totalorderf F
+GLIBC_2.36 totalorderf128 F
+GLIBC_2.36 totalorderf32 F
+GLIBC_2.36 totalorderf32x F
+GLIBC_2.36 totalorderf64 F
+GLIBC_2.36 totalorderf64x F
+GLIBC_2.36 totalorderl F
+GLIBC_2.36 totalordermag F
+GLIBC_2.36 totalordermagf F
+GLIBC_2.36 totalordermagf128 F
+GLIBC_2.36 totalordermagf32 F
+GLIBC_2.36 totalordermagf32x F
+GLIBC_2.36 totalordermagf64 F
+GLIBC_2.36 totalordermagf64x F
+GLIBC_2.36 totalordermagl F
+GLIBC_2.36 trunc F
+GLIBC_2.36 truncf F
+GLIBC_2.36 truncf128 F
+GLIBC_2.36 truncf32 F
+GLIBC_2.36 truncf32x F
+GLIBC_2.36 truncf64 F
+GLIBC_2.36 truncf64x F
+GLIBC_2.36 truncl F
+GLIBC_2.36 ufromfp F
+GLIBC_2.36 ufromfpf F
+GLIBC_2.36 ufromfpf128 F
+GLIBC_2.36 ufromfpf32 F
+GLIBC_2.36 ufromfpf32x F
+GLIBC_2.36 ufromfpf64 F
+GLIBC_2.36 ufromfpf64x F
+GLIBC_2.36 ufromfpl F
+GLIBC_2.36 ufromfpx F
+GLIBC_2.36 ufromfpxf F
+GLIBC_2.36 ufromfpxf128 F
+GLIBC_2.36 ufromfpxf32 F
+GLIBC_2.36 ufromfpxf32x F
+GLIBC_2.36 ufromfpxf64 F
+GLIBC_2.36 ufromfpxf64x F
+GLIBC_2.36 ufromfpxl F
+GLIBC_2.36 y0 F
+GLIBC_2.36 y0f F
+GLIBC_2.36 y0f128 F
+GLIBC_2.36 y0f32 F
+GLIBC_2.36 y0f32x F
+GLIBC_2.36 y0f64 F
+GLIBC_2.36 y0f64x F
+GLIBC_2.36 y0l F
+GLIBC_2.36 y1 F
+GLIBC_2.36 y1f F
+GLIBC_2.36 y1f128 F
+GLIBC_2.36 y1f32 F
+GLIBC_2.36 y1f32x F
+GLIBC_2.36 y1f64 F
+GLIBC_2.36 y1f64x F
+GLIBC_2.36 y1l F
+GLIBC_2.36 yn F
+GLIBC_2.36 ynf F
+GLIBC_2.36 ynf128 F
+GLIBC_2.36 ynf32 F
+GLIBC_2.36 ynf32x F
+GLIBC_2.36 ynf64 F
+GLIBC_2.36 ynf64x F
+GLIBC_2.36 ynl F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
new file mode 100644
index 0000000000..c30f54c0bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
@@ -0,0 +1,55 @@
+GLIBC_2.36 __b64_ntop F
+GLIBC_2.36 __b64_pton F
+GLIBC_2.36 __dn_count_labels F
+GLIBC_2.36 __fp_nquery F
+GLIBC_2.36 __fp_query F
+GLIBC_2.36 __fp_resstat F
+GLIBC_2.36 __hostalias F
+GLIBC_2.36 __loc_aton F
+GLIBC_2.36 __loc_ntoa F
+GLIBC_2.36 __p_cdname F
+GLIBC_2.36 __p_cdnname F
+GLIBC_2.36 __p_class F
+GLIBC_2.36 __p_class_syms D 0xa8
+GLIBC_2.36 __p_fqname F
+GLIBC_2.36 __p_fqnname F
+GLIBC_2.36 __p_option F
+GLIBC_2.36 __p_query F
+GLIBC_2.36 __p_rcode F
+GLIBC_2.36 __p_time F
+GLIBC_2.36 __p_type F
+GLIBC_2.36 __p_type_syms D 0x450
+GLIBC_2.36 __putlong F
+GLIBC_2.36 __putshort F
+GLIBC_2.36 __res_close F
+GLIBC_2.36 __res_hostalias F
+GLIBC_2.36 __res_isourserver F
+GLIBC_2.36 __res_nameinquery F
+GLIBC_2.36 __res_queriesmatch F
+GLIBC_2.36 __sym_ntop F
+GLIBC_2.36 __sym_ntos F
+GLIBC_2.36 __sym_ston F
+GLIBC_2.36 _getlong F
+GLIBC_2.36 _getshort F
+GLIBC_2.36 inet_net_ntop F
+GLIBC_2.36 inet_net_pton F
+GLIBC_2.36 inet_neta F
+GLIBC_2.36 ns_datetosecs F
+GLIBC_2.36 ns_format_ttl F
+GLIBC_2.36 ns_get16 F
+GLIBC_2.36 ns_get32 F
+GLIBC_2.36 ns_initparse F
+GLIBC_2.36 ns_makecanon F
+GLIBC_2.36 ns_msg_getflag F
+GLIBC_2.36 ns_name_ntol F
+GLIBC_2.36 ns_name_rollback F
+GLIBC_2.36 ns_parse_ttl F
+GLIBC_2.36 ns_parserr F
+GLIBC_2.36 ns_put16 F
+GLIBC_2.36 ns_put32 F
+GLIBC_2.36 ns_samedomain F
+GLIBC_2.36 ns_samename F
+GLIBC_2.36 ns_skiprr F
+GLIBC_2.36 ns_sprintrr F
+GLIBC_2.36 ns_sprintrrf F
+GLIBC_2.36 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
new file mode 100644
index 0000000000..8658803d38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
@@ -0,0 +1,40 @@
+GLIBC_2.36 td_init F
+GLIBC_2.36 td_log F
+GLIBC_2.36 td_symbol_list F
+GLIBC_2.36 td_ta_clear_event F
+GLIBC_2.36 td_ta_delete F
+GLIBC_2.36 td_ta_enable_stats F
+GLIBC_2.36 td_ta_event_addr F
+GLIBC_2.36 td_ta_event_getmsg F
+GLIBC_2.36 td_ta_get_nthreads F
+GLIBC_2.36 td_ta_get_ph F
+GLIBC_2.36 td_ta_get_stats F
+GLIBC_2.36 td_ta_map_id2thr F
+GLIBC_2.36 td_ta_map_lwp2thr F
+GLIBC_2.36 td_ta_new F
+GLIBC_2.36 td_ta_reset_stats F
+GLIBC_2.36 td_ta_set_event F
+GLIBC_2.36 td_ta_setconcurrency F
+GLIBC_2.36 td_ta_thr_iter F
+GLIBC_2.36 td_ta_tsd_iter F
+GLIBC_2.36 td_thr_clear_event F
+GLIBC_2.36 td_thr_dbresume F
+GLIBC_2.36 td_thr_dbsuspend F
+GLIBC_2.36 td_thr_event_enable F
+GLIBC_2.36 td_thr_event_getmsg F
+GLIBC_2.36 td_thr_get_info F
+GLIBC_2.36 td_thr_getfpregs F
+GLIBC_2.36 td_thr_getgregs F
+GLIBC_2.36 td_thr_getxregs F
+GLIBC_2.36 td_thr_getxregsize F
+GLIBC_2.36 td_thr_set_event F
+GLIBC_2.36 td_thr_setfpregs F
+GLIBC_2.36 td_thr_setgregs F
+GLIBC_2.36 td_thr_setprio F
+GLIBC_2.36 td_thr_setsigpending F
+GLIBC_2.36 td_thr_setxregs F
+GLIBC_2.36 td_thr_sigsetmask F
+GLIBC_2.36 td_thr_tls_get_addr F
+GLIBC_2.36 td_thr_tlsbase F
+GLIBC_2.36 td_thr_tsd F
+GLIBC_2.36 td_thr_validate F
-- 
2.31.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2022-05-29 13:10 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09  2:29 [PATCH v4 00/13] GLIBC LoongArch PATCHES caiyinyu
2022-05-09  2:29 ` [PATCH v4 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
2022-05-09  2:29 ` [PATCH v4 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
2022-05-09  2:30 ` [PATCH v4 03/13] LoongArch: Add relocations and ELF flags to elf.h and scripts/glibcelf.py caiyinyu
2022-05-09  2:30 ` [PATCH v4 04/13] LoongArch: ABI Implementation caiyinyu
2022-05-09  7:56   ` Fangrui Song
2022-05-24  9:49     ` 回复: " caiyinyu
2022-05-24 19:55       ` Fangrui Song
2022-05-09  8:20   ` Fangrui Song
2022-05-09 11:33     ` Adhemerval Zanella
2022-05-09 12:39   ` Adhemerval Zanella
2022-05-09 12:46     ` Florian Weimer
2022-05-29 13:10   ` Adhemerval Zanella
2022-05-09  2:30 ` [PATCH v4 05/13] LoongArch: Thread-Local Storage Support caiyinyu
2022-05-09  2:30 ` [PATCH v4 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
2022-05-09  2:30 ` [PATCH v4 07/13] LoongArch: Atomic and Locking Routines caiyinyu
2022-05-09  2:30 ` [PATCH v4 08/13] LoongArch: Linux Syscall Interface caiyinyu
2022-05-09  2:30 ` [PATCH v4 09/13] LoongArch: Linux ABI caiyinyu
2022-05-09  2:30 ` [PATCH v4 10/13] LoongArch: Add ABI Lists caiyinyu
  -- strict thread matches above, loose matches on Subject: below --
2022-05-09  2:25 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
2022-05-09  2:26 ` [PATCH v4 10/13] LoongArch: Add ABI Lists caiyinyu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).