From 7f784814df7067396e9c00b5cdc0eff9cd5c68de Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Fri, 20 Jan 2017 13:30:32 +0000 Subject: [PATCH] [AArch64] Optimize .gnu.hash table size for executable 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 | 5 +++++ bfd/elfnn-aarch64.c | 17 +++++++++++++++++ ld/ChangeLog | 7 +++++++ ld/testsuite/ld-aarch64/aarch64-elf.exp | 5 +++++ ld/testsuite/ld-aarch64/func-in-so.s | 6 ++++++ ld/testsuite/ld-aarch64/func-sym-hash-opt.d | 6 ++++++ ld/testsuite/ld-aarch64/func-sym-hash-opt.s | 7 +++++++ 7 files changed, 53 insertions(+) create mode 100644 ld/testsuite/ld-aarch64/func-in-so.s create mode 100644 ld/testsuite/ld-aarch64/func-sym-hash-opt.d create mode 100644 ld/testsuite/ld-aarch64/func-sym-hash-opt.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 624af088fb9..f6841efe875 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-01-20 Jiong Wang + + * elfnn-aarch64.c (elf_aarch64_hash_symbol): New function. + (elf_backend_hash_symbol): Define. + 2017-01-18 Maciej W. Rozycki PR ld/20828 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 6ea2d355d41..213cf55f624 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -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" diff --git a/ld/ChangeLog b/ld/ChangeLog index 6e77d001536..c710222ee89 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2017-01-20 Jiong Wang + + * 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 * testsuite/ld-elf/eh-frame-hdr.d: Update expected results. diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 09002678858..f77b169f606 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -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 index 00000000000..608eead99cd --- /dev/null +++ b/ld/testsuite/ld-aarch64/func-in-so.s @@ -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 index 00000000000..8ffeb005907 --- /dev/null +++ b/ld/testsuite/ld-aarch64/func-sym-hash-opt.d @@ -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 index 00000000000..70f8f8e0e81 --- /dev/null +++ b/ld/testsuite/ld-aarch64/func-sym-hash-opt.s @@ -0,0 +1,7 @@ + .text + .align 2 + .global main + .type main, %function +main: + bl dec + ret