diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index f58ced30ac3..59dfd03d089 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -3315,10 +3315,17 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 	 script.  Also for R_*_SOP_PUSH_ABSOLUTE and PCREL to specify const.  */
       if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
 	{
-	  defined_local = false;
-	  resolved_local = false;
-	  resolved_dynly = false;
-	  resolved_to_const = true;
+	  /* Allows ABS symbols defined in the linker script to be referenced
+	     by pc relative relocations.  */
+	  if (h != NULL && (h)->root.ldscript_def)
+	    ;
+	  else
+	    {
+	      defined_local = false;
+	      resolved_local = false;
+	      resolved_dynly = false;
+	      resolved_to_const = true;
+	    }
 	}
 
       /* The ifunc reference generate plt.  */
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index d80014d9563..4328f6e941e 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -184,5 +184,8 @@ if [istarget "loongarch64-*-*"] {
   run_dump_test "ie-le-relax"
   run_dump_test "tlsdesc_abs"
   run_dump_test "tlsdesc_extreme"
+  run_dump_test "provide_abs"
+  run_dump_test "provide_noabs"
+
 }
 
diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.d b/ld/testsuite/ld-loongarch-elf/provide_abs.d
new file mode 100644
index 00000000000..1514fb18b01
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_abs.d
@@ -0,0 +1,12 @@
+#source: provide_sym.s
+#as:
+#ld: -T provide_abs.ld
+#objdump: -d
+
+.*: +file format .*
+
+#...
+   0:	58001085 	beq         	\$a0, \$a1, 16	# 10 <fun1>
+   4:	40000c80 	beqz        	\$a0, 12	# 10 <fun1>
+   8:	54000800 	bl          	8	# 10 <fun1>
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.ld b/ld/testsuite/ld-loongarch-elf/provide_abs.ld
new file mode 100644
index 00000000000..473476cdc65
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_abs.ld
@@ -0,0 +1 @@
+PROVIDE(fun1 = 0x10);
diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.d b/ld/testsuite/ld-loongarch-elf/provide_noabs.d
new file mode 100644
index 00000000000..7d6bc4d1baf
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.d
@@ -0,0 +1,13 @@
+#source: provide_sym.s
+#as:
+#ld: -T provide_noabs.ld
+#objdump: -d
+
+.*: +file format .*
+
+
+#...
+   0:	58001085 	beq         	\$a0, \$a1, 16	# 10 <fun1>
+   4:	40000c80 	beqz        	\$a0, 12	# 10 <fun1>
+   8:	54000800 	bl          	8	# 10 <fun1>
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.ld b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld
new file mode 100644
index 00000000000..0154c6f3a29
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld
@@ -0,0 +1,7 @@
+SECTIONS
+{
+  .text :
+  {
+    PROVIDE(fun1 = 0x10);
+  }
+}
diff --git a/ld/testsuite/ld-loongarch-elf/provide_sym.s b/ld/testsuite/ld-loongarch-elf/provide_sym.s
new file mode 100644
index 00000000000..6610894edbe
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_sym.s
@@ -0,0 +1,7 @@
+	.text
+	.globl	main
+	.type	main, @function
+main:
+	beq	$a0,$a1,%b16(fun1)
+	beqz	$a0,%b21(fun1)
+	bl	%b26(fun1)
