bfd_size_type size;
   bfd *input_bfd;
 
+  if (info->strip == strip_all
+      && !info->emitrelocations
+      && !bfd_link_relocatable (info))
+    return true;
+
   htab = elf32_arm_hash_table (info);
   if (htab == NULL)
     return false;
 
 
   /* If backend needs to output some local symbols not present in the hash
      table, do it now.  */
-  if (bed->elf_backend_output_arch_local_syms
-      && (info->strip != strip_all || emit_relocs))
+  if (bed->elf_backend_output_arch_local_syms)
     {
       if (! ((*bed->elf_backend_output_arch_local_syms)
             (abfd, info, &flinfo, elf_link_output_symstrtab)))
 
   output_arch_syminfo osi;
   struct elf_aarch64_link_hash_table *htab;
 
+  if (info->strip == strip_all
+      && !info->emitrelocations
+      && !bfd_link_relocatable (info))
+    return true;
+
   htab = elf_aarch64_hash_table (info);
 
   osi.finfo = finfo;
 
     ] \
 ]
 
+# Run-time tests which require working ifunc attribute support.
+if { [check_ifunc_attribute_available] } {
+    run_ld_link_exec_tests [list \
+       [list \
+           "Run pr29797" \
+           "-s" \
+           "" \
+           { pr29797.c } \
+           "pr29797" \
+           "pass.out" \
+           "-O0" \
+       ] \
+    ]
+}
+
 # Old gcc silently ignores __attribute__ ((aligned())) with too big alignment.
 proc compiler_honours_aligned { } {
     global CC_FOR_TARGET READELF srcdir subdir
 
--- /dev/null
+#include <stdio.h>
+
+static int foo (int x) __attribute__ ((ifunc ("resolve_foo")));
+
+static int foo_impl(int x)
+{
+  return x;
+}
+
+static void *resolve_foo (void)
+{
+  return (void *) foo_impl;
+}
+
+int
+main ()
+{
+  foo (0);
+  puts ("PASS");
+  return 0;
+}