x86: Add GENERATE_RELATIVE_RELOC_P

Add GENERATE_RELATIVE_RELOC_P which returns TRUE if dynamic relative
relocation should be generated.

	* elfxx-x86.h (GENERATE_RELATIVE_RELOC_P): New.
	* elf32-i386.c (elf_i386_relocate_section): Use it.
	* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
This commit is contained in:
H.J. Lu 2017-10-06 00:29:16 -07:00
parent 1f92404c50
commit f70656b260
4 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2017-10-06 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-x86.h (GENERATE_RELATIVE_RELOC_P): New.
* elf32-i386.c (elf_i386_relocate_section): Use it.
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
2017-10-06 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-x86.h (RESOLVED_LOCALLY_P): New.

View File

@ -2531,10 +2531,7 @@ r_386_got32:
htab->elf.sgot->contents + off);
h->got.offset |= 1;
if (h->dynindx == -1
&& !h->forced_local
&& h->root.type != bfd_link_hash_undefweak
&& bfd_link_pic (info))
if (GENERATE_RELATIVE_RELOC_P (info, h))
{
/* PR ld/21402: If this symbol isn't dynamic
in PIC, generate R_386_RELATIVE here. */

View File

@ -2797,10 +2797,7 @@ do_ifunc_pointer:
as -1 | 1 still is -1. */
h->got.offset |= 1;
if (h->dynindx == -1
&& !h->forced_local
&& h->root.type != bfd_link_hash_undefweak
&& bfd_link_pic (info))
if (GENERATE_RELATIVE_RELOC_P (info, h))
{
/* If this symbol isn't dynamic in PIC,
generate R_X86_64_RELATIVE here. */

View File

@ -124,6 +124,18 @@
|| (ELF_ST_VISIBILITY ((H)->other) \
&& (H)->root.type == bfd_link_hash_undefweak))
/* TRUE if relative relocation should be generated. GOT reference to
global symbol in PIC will lead to dynamic symbol. It becomes a
problem when "time" or "times" is defined as a variable in an
executable, clashing with functions of the same name in libc. If a
symbol isn't undefined weak symbol, don't make it dynamic in PIC and
generate relative relocation. */
#define GENERATE_RELATIVE_RELOC_P(INFO, H) \
((H)->dynindx == -1 \
&& !(H)->forced_local \
&& (H)->root.type != bfd_link_hash_undefweak \
&& bfd_link_pic (INFO))
/* TRUE if TLS IE->LE transition is OK. */
#define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \
(bfd_link_executable (INFO) \