aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-x86-64.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-01-15 11:06:33 -0800
committerH.J. Lu <hjl.tools@gmail.com>2015-01-15 11:08:59 -0800
commit6333bc0dd6e92dd5a76ba0a6890e08db2a6f7a29 (patch)
treee63abc4928496451a64b4eac09e5a780ddb716b8 /bfd/elf64-x86-64.c
parentd221e7efd61fc80f6fbf862b7e32927835575329 (diff)
downloadgdb-6333bc0dd6e92dd5a76ba0a6890e08db2a6f7a29.zip
gdb-6333bc0dd6e92dd5a76ba0a6890e08db2a6f7a29.tar.gz
gdb-6333bc0dd6e92dd5a76ba0a6890e08db2a6f7a29.tar.bz2
Don't complain about -fPIC for undefined symbol
When building executable, undefined symbol is a fatal error. We don't complain about -fPIC if the symbol is undefined. bfd/ PR ld/17847 * elf64-x86-64.c (elf_x86_64_relocate_section): Don't complain about -fPIC if the symbol is undefined when building executable. ld/testsuite/ PR ld/17847 * ld-x86-64/pie1.d: New file. * ld-x86-64/pie1.s: Likwise. * ld-x86-64/x86-64.exp: Run pie1.
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r--bfd/elf64-x86-64.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 6b7d3c9..bf7d386 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -4063,10 +4063,14 @@ elf_x86_64_relocate_section (bfd *output_bfd,
case R_X86_64_PC16:
case R_X86_64_PC32:
case R_X86_64_PC32_BND:
+ /* Don't complain about -fPIC if the symbol is undefined when
+ building executable. */
if (info->shared
&& (input_section->flags & SEC_ALLOC) != 0
&& (input_section->flags & SEC_READONLY) != 0
- && h != NULL)
+ && h != NULL
+ && !(info->executable
+ && h->root.type == bfd_link_hash_undefined))
{
bfd_boolean fail = FALSE;
bfd_boolean branch
@@ -4140,11 +4144,14 @@ direct:
break;
/* Don't copy a pc-relative relocation into the output file
- if the symbol needs copy reloc. */
+ if the symbol needs copy reloc or the symbol is undefined
+ when building executable. */
if ((info->shared
&& !(info->executable
&& h != NULL
- && (h->needs_copy || eh->needs_copy)
+ && (h->needs_copy
+ || eh->needs_copy
+ || h->root.type == bfd_link_hash_undefined)
&& IS_X86_64_PCREL_TYPE (r_type))
&& (h == NULL
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT