select RTC_LIB
        select SYS_SUPPORTS_APM_EMULATION
        select THREAD_INFO_IN_TASK
-       select HAVE_ARCH_VMAP_STACK if MMU && (!LD_IS_LLD || LLD_VERSION >= 140000)
+       select HAVE_ARCH_VMAP_STACK if MMU && ARM_HAS_GROUP_RELOCS
        select TRACE_IRQFLAGS_SUPPORT if !CPU_V7M
        # Above selects are sorted alphabetically; please add new ones
        # according to that.  Thanks.
          Europe.  There is an ARM Linux project with a web page at
          <http://www.arm.linux.org.uk/>.
 
+config ARM_HAS_GROUP_RELOCS
+       def_bool y
+       depends on !LD_IS_LLD || LLD_VERSION >= 140000
+       depends on !COMPILE_TEST
+       help
+         Whether or not to use R_ARM_ALU_PC_Gn or R_ARM_LDR_PC_Gn group
+         relocations, which have been around for a long time, but were not
+         supported in LLD until version 14. The combined range is -/+ 256 MiB,
+         which is usually sufficient, but not for allyesconfig, so we disable
+         this feature when doing compile testing.
+
 config ARM_HAS_SG_CHAIN
        bool
 
 
 
        .macro          __ldst_va, op, reg, tmp, sym, cond
 #if __LINUX_ARM_ARCH__ >= 7 || \
-    (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) || \
-    (defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000)
+    !defined(CONFIG_ARM_HAS_GROUP_RELOCS) || \
+    (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
        mov_l           \tmp, \sym, \cond
        \op\cond        \reg, [\tmp]
 #else
         */
        .macro          ldr_this_cpu, rd:req, sym:req, t1:req, t2:req
 #if __LINUX_ARM_ARCH__ >= 7 || \
-    (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) || \
-    (defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000)
+    !defined(CONFIG_ARM_HAS_GROUP_RELOCS) || \
+    (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
        this_cpu_offset \t1
        mov_l           \t2, \sym
        ldr             \rd, [\t1, \t2]
 
 #ifdef CONFIG_CPU_V6
            "1:                                                 \n\t"
            "   .subsection 1                                   \n\t"
-#if !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) && \
-    !(defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000)
+#if defined(CONFIG_ARM_HAS_GROUP_RELOCS) && \
+    !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
            "2: " LOAD_SYM_ARMV6(%0, __current) "               \n\t"
            "   b       1b                                      \n\t"
 #else
 #endif
            : "=r"(cur));
 #elif __LINUX_ARM_ARCH__>= 7 || \
-      (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) || \
-      (defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000)
+      !defined(CONFIG_ARM_HAS_GROUP_RELOCS) || \
+      (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
        cur = __current;
 #else
        asm(LOAD_SYM_ARMV6(%0, __current) : "=r"(cur));
 
 #ifdef CONFIG_CPU_V6
            "1:                                                 \n\t"
            "   .subsection 1                                   \n\t"
-#if !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) && \
-    !(defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000)
+#if defined(CONFIG_ARM_HAS_GROUP_RELOCS) && \
+    !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
            "2: " LOAD_SYM_ARMV6(%0, __per_cpu_offset) "        \n\t"
            "   b       1b                                      \n\t"
 #else
 
                strstarts(name, ".ARM.exidx.exit");
 }
 
+#ifdef CONFIG_ARM_HAS_GROUP_RELOCS
 /*
  * This implements the partitioning algorithm for group relocations as
  * documented in the ARM AArch32 ELF psABI (IHI 0044).
        } while (group--);
        return shift;
 }
+#endif
 
 int
 apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
                unsigned long loc;
                Elf32_Sym *sym;
                const char *symname;
+#ifdef CONFIG_ARM_HAS_GROUP_RELOCS
                u32 shift, group = 1;
+#endif
                s32 offset;
                u32 tmp;
 #ifdef CONFIG_THUMB2_KERNEL
                        *(u32 *)loc = __opcode_to_mem_arm(tmp);
                        break;
 
+#ifdef CONFIG_ARM_HAS_GROUP_RELOCS
                case R_ARM_ALU_PC_G0_NC:
                        group = 0;
                        fallthrough;
                        }
                        *(u32 *)loc = __opcode_to_mem_arm((tmp & ~0xfff) | offset);
                        break;
-
+#endif
 #ifdef CONFIG_THUMB2_KERNEL
                case R_ARM_THM_CALL:
                case R_ARM_THM_JUMP24: