From 6333bc0dd6e92dd5a76ba0a6890e08db2a6f7a29 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 15 Jan 2015 11:06:33 -0800 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf64-x86-64.c | 13 ++++++++++--- ld/testsuite/ChangeLog | 7 +++++++ ld/testsuite/ld-x86-64/pie1.d | 9 +++++++++ ld/testsuite/ld-x86-64/pie1.s | 4 ++++ ld/testsuite/ld-x86-64/x86-64.exp | 1 + 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 ld/testsuite/ld-x86-64/pie1.d create mode 100644 ld/testsuite/ld-x86-64/pie1.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8c376e25be2..9558b5c3d39 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-01-15 H.J. Lu + + 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. + 2015-01-15 Nick Clifton PR binutils/17512 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 6b7d3c9a568..bf7d386bd9a 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 diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3ab61c77566..58e5595e1e4 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-01-15 H.J. Lu + + PR ld/17847 + * ld-x86-64/pie1.d: New file. + * ld-x86-64/pie1.s: Likwise. + * ld-x86-64/x86-64.exp: Run pie1. + 2015-01-13 Thomas Preud'homme * ld-aarch64/aarch64-elf.exp: Added relocs-257-symbolic-func test. diff --git a/ld/testsuite/ld-x86-64/pie1.d b/ld/testsuite/ld-x86-64/pie1.d new file mode 100644 index 00000000000..06d2562b804 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pie1.d @@ -0,0 +1,9 @@ +#name: PIE with undefined symbol +#as: --64 +#ld: -pie -melf_x86_64 --noinhibit-exec +#readelf: -s --wide +#warning: \A[^\n]*\.o[^\n]*In function `_start':\n[^\n]*: undefined reference to `foo'\Z + +#... + +[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +UND foo +#pass diff --git a/ld/testsuite/ld-x86-64/pie1.s b/ld/testsuite/ld-x86-64/pie1.s new file mode 100644 index 00000000000..94c59cb056c --- /dev/null +++ b/ld/testsuite/ld-x86-64/pie1.s @@ -0,0 +1,4 @@ + .text + .global _start +_start: + movl foo(%rip), %eax diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 5b49bffe660..bfa89c3ce52 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -228,6 +228,7 @@ run_dump_test "pr12570b" run_dump_test "pr14215" run_dump_test "pr14207" run_dump_test "gotplt1" +run_dump_test "pie1" if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} { return -- 2.30.2