[AArch64] Optimize .gnu.hash table size for executable
authorJiong Wang <jiong.wang@arm.com>
Fri, 20 Jan 2017 13:30:32 +0000 (13:30 +0000)
committerJiong Wang <jiong.wang@arm.com>
Fri, 20 Jan 2017 13:30:32 +0000 (13:30 +0000)
bfd/
* elfnn-aarch64.c (elf_aarch64_hash_symbol): New function.
(elf_backend_hash_symbol): Define.

ld/
* testsuite/ld-aarch64/aarch64-elf.exp (aarch64elflinktests): New tests.
* testsuite/ld-aarch64/func-in-so.s: New test source file.
* testsuite/ld-aarch64/func-sym-hash-opt.s: Likewise.
* testsuite/ld-aarch64/func-sym-hash-opt.d: New expected test result.

bfd/ChangeLog
bfd/elfnn-aarch64.c
ld/ChangeLog
ld/testsuite/ld-aarch64/aarch64-elf.exp
ld/testsuite/ld-aarch64/func-in-so.s [new file with mode: 0644]
ld/testsuite/ld-aarch64/func-sym-hash-opt.d [new file with mode: 0644]
ld/testsuite/ld-aarch64/func-sym-hash-opt.s [new file with mode: 0644]

index 624af088fb9f3afce99196925ca279de82a196e7..f6841efe87583eac296cb61f0a7ffce61665de45 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-20  Jiong Wang <jiong.wang@arm.com>
+
+       * elfnn-aarch64.c (elf_aarch64_hash_symbol): New function.
+       (elf_backend_hash_symbol): Define.
+
 2017-01-18  Maciej W. Rozycki  <macro@imgtec.com>
 
        PR ld/20828
index 6ea2d355d412ec5cbbfa7aba3f1cc72926ebee5e..213cf55f624ea5499f7a16354bb829fd3f18bb89 100644 (file)
@@ -2708,6 +2708,22 @@ elfNN_aarch64_stub_name (const asection *input_section,
   return stub_name;
 }
 
+/* Return TRUE if symbol H should be hashed in the `.gnu.hash' section.  For
+   executable PLT slots where the executable never takes the address of those
+   functions, the function symbols are not added to the hash table.  */
+
+static bfd_boolean
+elf_aarch64_hash_symbol (struct elf_link_hash_entry *h)
+{
+  if (h->plt.offset != (bfd_vma) -1
+      && !h->def_regular
+      && !h->pointer_equality_needed)
+    return FALSE;
+
+  return _bfd_elf_hash_symbol (h);
+}
+
+
 /* Look up an entry in the stub hash.  Stub entries are cached because
    creating the stub name takes a bit of time.  */
 
@@ -9412,6 +9428,7 @@ const struct elf_size_info elfNN_aarch64_size_info =
 #define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
 #define elf_backend_default_execstack  0
 #define elf_backend_extern_protected_data 1
+#define elf_backend_hash_symbol elf_aarch64_hash_symbol
 
 #undef  elf_backend_obj_attrs_section
 #define elf_backend_obj_attrs_section          ".ARM.attributes"
index 6e77d0015363685a92355d75910dda6d03c16dba..c710222ee89a75147f3c583d841796fdbc2ac85e 100644 (file)
@@ -1,3 +1,10 @@
+2017-01-20  Jiong Wang  <jiong.wang@arm.com>
+
+       * testsuite/ld-aarch64/aarch64-elf.exp (aarch64elflinktests): New tests.
+       * testsuite/ld-aarch64/func-in-so.s: New test source file.
+       * testsuite/ld-aarch64/func-sym-hash-opt.s: Likewise.
+       * testsuite/ld-aarch64/func-sym-hash-opt.d: New expected test result.
+
 2017-01-20  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * testsuite/ld-elf/eh-frame-hdr.d: Update expected results.
index 09002678858ce8cb3efda37c93015da8220497f3..f77b169f606d73c6901cfea326da2b6b2909705a 100644 (file)
@@ -323,6 +323,11 @@ set aarch64elflinktests {
     {} "copy-reloc-so.so"}
   {"ld-aarch64/exe with copy relocation" "-e0 tmpdir/copy-reloc-so.so" "" ""
     {copy-reloc-exe.s} {{objdump -R copy-reloc.d}} "copy-reloc"}
+  {"ld-aarch64/so with global func" "-shared" "" "" {func-in-so.s}
+    {} "func-in-so.so"}
+  {"ld-aarch64/func sym hash opt for exe"
+   "-e0 --hash-style=gnu tmpdir/func-in-so.so" "" ""
+    {func-sym-hash-opt.s} {{readelf --dyn-sym func-sym-hash-opt.d}} "hash-opt"}
 }
 
 run_ld_link_tests $aarch64elflinktests
diff --git a/ld/testsuite/ld-aarch64/func-in-so.s b/ld/testsuite/ld-aarch64/func-in-so.s
new file mode 100644 (file)
index 0000000..608eead
--- /dev/null
@@ -0,0 +1,6 @@
+       .text
+       .align  2
+       .global dec
+       .type   dec, %function
+dec:
+       ret
diff --git a/ld/testsuite/ld-aarch64/func-sym-hash-opt.d b/ld/testsuite/ld-aarch64/func-sym-hash-opt.d
new file mode 100644 (file)
index 0000000..8ffeb00
--- /dev/null
@@ -0,0 +1,6 @@
+
+Symbol table '.dynsym' contains .* entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND dec
+#...
diff --git a/ld/testsuite/ld-aarch64/func-sym-hash-opt.s b/ld/testsuite/ld-aarch64/func-sym-hash-opt.s
new file mode 100644 (file)
index 0000000..70f8f8e
--- /dev/null
@@ -0,0 +1,7 @@
+       .text
+       .align  2
+       .global main
+       .type   main, %function
+main:
+       bl      dec
+       ret