+2016-03-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/19807
+       * elf64-x86-64.c (elf_x86_64_relocate_section): Check
+       no_reloc_overflow_check to diable R_X86_64_32/R_X86_64_32S
+       relocation overflow check.
+
 2016-03-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfd-in2.h: Regenerated.
 
          /* Let's help debug shared library creation.  These relocs
             cannot be used in shared libs.  Don't error out for
             sections we don't care about, such as debug sections or
-            non-constant sections.  */
-         if (bfd_link_pic (info)
+            non-constant sections, or when relocation overflow check
+            is disabled.  */
+         if (!info->no_reloc_overflow_check
+             && bfd_link_pic (info)
              && (sec->flags & SEC_ALLOC) != 0
              && (sec->flags & SEC_READONLY) != 0)
            {
                }
              else
                {
-                 /* This symbol is local, or marked to become local.  */
-                 if (r_type == htab->pointer_r_type)
+                 /* This symbol is local, or marked to become local.
+                    When relocation overflow check is disabled, we
+                    convert R_X86_64_32 to dynamic R_X86_64_RELATIVE.  */
+                 if (r_type == htab->pointer_r_type
+                     || (r_type == R_X86_64_32
+                         && info->no_reloc_overflow_check))
                    {
                      relocate = TRUE;
                      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
 
+2016-03-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/19807
+       * bfdlink.h (bfd_link_info): Add no_reloc_overflow_check.
+
 2016-03-08  Cupertino Miranda  <Cupertino.Miranda@synopsys.com>
            Andrew Burgess  <andrew.burgess@embecosm.com>
 
 
   /* TRUE if generation of .interp/PT_INTERP should be suppressed.  */
   unsigned int nointerp: 1;
 
+  /* TRUE if we shouldn't check relocation overflow.  */
+  unsigned int no_reloc_overflow_check: 1;
+
   /* TRUE if generate a 1-byte NOP as suffix for x86 call instruction.  */
   unsigned int call_nop_as_suffix : 1;
 
 
+2016-03-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/19807
+       * Makefile.am (ELF_X86_DEPS): Add
+       $(srcdir)/emulparams/reloc_overflow.sh.
+       * Makefile.in: Regenerated.
+       * NEWS: Mention -z noreloc-overflow.
+       * ld.texinfo: Document -z noreloc-overflow.
+       * emulparams/elf32_x86_64.sh: Source
+       ${srcdir}/emulparams/reloc_overflow.sh.
+       * emulparams/elf_x86_64.sh: Likewise.
+       * emulparams/reloc_overflow.sh: New file.
+       * testsuite/ld-x86-64/pr19807-1.s: New file.
+       * testsuite/ld-x86-64/pr19807-1a.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-1b.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-2.s: Likewise.
+       * testsuite/ld-x86-64/pr19807-2a.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-2b.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-2c.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-2d.d: Likewise.
+       * testsuite/ld-x86-64/pr19807-2e.d: Likewise.
+       * testsuite/ld-x86-64/x86-64.exp: Run PR ld/19807 tests.
+
 2016-03-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/19539
 
 ELF_X86_DEPS = $(ELF_DEPS) $(srcdir)/emulparams/plt_unwind.sh \
               $(srcdir)/emulparams/extern_protected_data.sh \
               $(srcdir)/emulparams/dynamic_undefined_weak.sh \
+              $(srcdir)/emulparams/reloc_overflow.sh \
               $(srcdir)/emulparams/call_nop.sh
 
 @TDIRS@
 
 ELF_X86_DEPS = $(ELF_DEPS) $(srcdir)/emulparams/plt_unwind.sh \
               $(srcdir)/emulparams/extern_protected_data.sh \
               $(srcdir)/emulparams/dynamic_undefined_weak.sh \
+              $(srcdir)/emulparams/reloc_overflow.sh \
               $(srcdir)/emulparams/call_nop.sh
 
 
 
 -*- text -*-
 
+* Support for -z noreloc-overflow in the x86-64 ELF linker to disable
+  relocation overflow check.
+
 * Add -z common/-z nocommon options for ELF targets to control whether to
   convert common symbols to the STT_COMMON type during a relocatable link.
 
 
 . ${srcdir}/emulparams/plt_unwind.sh
 . ${srcdir}/emulparams/extern_protected_data.sh
 . ${srcdir}/emulparams/dynamic_undefined_weak.sh
+. ${srcdir}/emulparams/reloc_overflow.sh
 . ${srcdir}/emulparams/call_nop.sh
 SCRIPT_NAME=elf
 ELFSIZE=32
 
 . ${srcdir}/emulparams/plt_unwind.sh
 . ${srcdir}/emulparams/extern_protected_data.sh
 . ${srcdir}/emulparams/dynamic_undefined_weak.sh
+. ${srcdir}/emulparams/reloc_overflow.sh
 . ${srcdir}/emulparams/call_nop.sh
 SCRIPT_NAME=elf
 ELFSIZE=64
 
--- /dev/null
+PARSE_AND_LIST_OPTIONS_RELOC_OVERFLOW='
+  fprintf (file, _("\
+  -z noreloc-overflow         Disable relocation overflow check\n"));
+'
+PARSE_AND_LIST_ARGS_CASE_Z_RELOC_OVERFLOW='
+      else if (strcmp (optarg, "noreloc-overflow") == 0)
+       link_info.no_reloc_overflow_check = TRUE;
+'
+
+PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_RELOC_OVERFLOW"
+PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_RELOC_OVERFLOW"
 
 dynamic relocations against undefined weak symbols in executable.
 Supported for i386 and x86-64.
 
+@item noreloc-overflow
+Disable relocation overflow check.  This can be used to disable
+relocation overflow check if there will be no dynamic relocation
+overflow at run-time.  Supported for x86_64.
+
 @item call-nop=prefix-addr
 @itemx call-nop=prefix-nop
 @itemx call-nop=suffix-nop
 
--- /dev/null
+       .globl  _start
+       .type   _start, @function
+_start:
+       movq    $foo, %rax
+       .size   _start, .-_start
+       .data
+foo:
+       .quad   0
 
--- /dev/null
+#source: pr19807-1.s
+#as: --64
+#ld: -pie -melf_x86_64 -z noreloc-overflow
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[      ]*[a-f0-9]+:    48 c7 c0 ([0-9a-f]{2} ){4}      mov    \$0x[a-f0-9]+,%rax
+#pass
 
--- /dev/null
+#source: pr19807-1.s
+#as: --x32
+#ld: -pie -melf32_x86_64 -z noreloc-overflow
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[      ]*[a-f0-9]+:    48 c7 c0 ([0-9a-f]{2} ){4}      mov    \$0x[a-f0-9]+,%rax
+#pass
 
--- /dev/null
+       .globl  _start
+       .type   _start, @function
+_start:
+       movl    $foo, %eax
+       .size   _start, .-_start
+       .data
+foo:
+       .quad   0
 
--- /dev/null
+#source: pr19807-2.s
+#as: --64
+#ld: -pie -melf_x86_64
+#error: .*relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
 
--- /dev/null
+#source: pr19807-2.s
+#as: --x32
+#ld: -pie -melf32_x86_64
+#readelf: -r --wide
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
 
--- /dev/null
+#source: pr19807-2.s
+#as: --x32
+#ld: -pie -melf32_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[      ]*[a-f0-9]+:    b8 ([0-9a-f]{2} ){4}            mov    \$0x[a-f0-9]+,%eax
+#pass
 
--- /dev/null
+#source: pr19807-2.s
+#as: --64
+#ld: -pie -melf_x86_64 -z noreloc-overflow
+#readelf: -r --wide
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+    Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
 
--- /dev/null
+#source: pr19807-2.s
+#as: --64
+#ld: -pie -melf_x86_64 -z noreloc-overflow
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[      ]*[a-f0-9]+:    b8 ([0-9a-f]{2} ){4}            mov    \$0x[a-f0-9]+,%eax
+#pass
 
 run_dump_test "largecomm-1f"
 run_dump_test "pr19539a"
 run_dump_test "pr19539b"
+run_dump_test "pr19807-1a"
+run_dump_test "pr19807-1b"
+run_dump_test "pr19807-2a"
+run_dump_test "pr19807-2b"
+run_dump_test "pr19807-2c"
+run_dump_test "pr19807-2d"
+run_dump_test "pr19807-2e"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return