Fix placement of forced local symbols in the dynamic symbol table.
authorCary Coutant <ccoutant@gmail.com>
Thu, 22 Dec 2016 22:06:24 +0000 (14:06 -0800)
committerCary Coutant <ccoutant@gmail.com>
Fri, 23 Dec 2016 00:00:06 +0000 (16:00 -0800)
commitc4d5a76223f74930add9014f2a77339eb80b737c
tree0d2d2c9a9883fd35adf73ee40f18ee8c3268e9d3
parent40d7d93ff412f4c34cde3daa04890d5cd2e0d9c9
Fix placement of forced local symbols in the dynamic symbol table.

Gold was not placing forced-local symbols (e.g., hidden visibility)
at the front of the dynamic symbol table, or including them in the
count of local symbols recorded in the .dynsym section's sh_info field.

gold/
* layout.cc (Layout::finalize): Track count of forced-local symbols
in .dynsym.
(Layout::create_symtab_sections): Add local_dynamic_count parameter;
use that instead of sh_info value.
(Layout::create_dynamic_symtab): Add pforced_local_dynamic_count
parameter; pass it to Symtab::set_dynsym_indexes().  Include forced
locals in sh_info value.  Pass index of first real global to
Dynobj::create_gnu_hash_table() and Dynobj::create_elf_hash_table().
* layout.h (Layout::create_symtab_sections): Add local_dynamic_count
parameter.
(Layout::create_dynamic_symtab): Add pforced_local_dynamic_count
parameter.
* symtab.cc (Symbol_table::set_dynsym_indexes): Add pforced_local_count
parameter.  Process forced-local symbols first and return the count.
(Symbol_table::finalize): Update comments.
* symtab.h (Symbol_table::set_dynsym_indexes): Add pforced_local_count
parameter.
(Symbol_table::first_dynamic_global_index_): Update comment.
(Symbol_table::dynamic_count_): Update comment.
* testsuite/Makefile.am (ifuncmod1.sh): New test case.
* testsuite/Makefile.in: Regenerate.
* testsuite/ifuncmod1.sh: New shell script.
gold/ChangeLog
gold/layout.cc
gold/layout.h
gold/symtab.cc
gold/symtab.h
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/ifuncmod1.sh [new file with mode: 0755]