Bug 18695 - [x86-64] Missing relocation overflow check
Summary: [x86-64] Missing relocation overflow check
Status: NEW
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: 2.27
: P2 normal
Target Milestone: ---
Assignee: Cary Coutant
URL:
Keywords:
: 15460 (view as bug list)
Depends on:
Blocks:
 
Reported: 2015-07-20 14:56 UTC by H.J. Lu
Modified: 2016-05-16 15:19 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
Patch to fix broken x32 overflow checks (899 bytes, patch)
2016-02-07 06:40 UTC, Cary Coutant
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description H.J. Lu 2015-07-20 14:56:10 UTC
Bits<N>::has_overflow(x) in reloc.h isn't suitable for x86-64
relocation overflow check.  has_overflow_xxx in power.cc should
be used for relocation overflow check:

[hjl@gnu-6 gold-1]$ cat x.S
	.data
#if 1
	.space 0x8ff00000
#else
	.space 0x70000000
#endif
	.hidden foo
	.globl	foo
foo:
	.byte 20
local:
	.byte 20
	.text
	.globl	bar
	.type	bar, @function
bar:
	lea	foo(%rip), %rax
	lea	local(%rip), %rax
	.size	bar, .-bar
[hjl@gnu-6 gold-1]$ make LD=ld.bfd
gcc    -c -o x.o x.S
ld.bfd -z max-page-size=0x200000 -shared -o x.so x.o
x.o: In function `bar':
(.text+0x3): relocation truncated to fit: R_X86_64_PC32 against symbol `foo' defined in .data section in x.o
x.o: In function `bar':
(.text+0xa): relocation truncated to fit: R_X86_64_PC32 against `.data'
Makefile:25: recipe for target 'x.so' failed
make: *** [x.so] Error 1
[hjl@gnu-6 gold-1]$ make
./ld -z max-page-size=0x200000 -shared -o x.so x.o
objdump -dw x.so

x.so:     file format elf64-x86-64


Disassembly of section .text:

00000000000001e0 <bar>:
 1e0:	48 8d 05 b9 00 10 90 	lea    -0x6fefff47(%rip),%rax        # ffffffff901002a0 <__bss_start+0xfffffffefffffffe>
 1e7:	48 8d 05 b3 00 10 90 	lea    -0x6fefff4d(%rip),%rax        # ffffffff901002a1 <__bss_start+0xfffffffeffffffff>
[hjl@gnu-6 gold-1]$
Comment 1 H.J. Lu 2016-02-03 15:38:18 UTC
A simpler testcase:

[hjl@gnu-6 pr18591]$ cat x.S
	.hidden foo
	.comm pad,0x80000000,8
	.comm foo,8,8
	.text
	.globl	bar
	.type	bar, @function
bar:
	movq	foo@GOTPCREL(%rip), %rax
[hjl@gnu-6 pr18591]$ make LD=ld.gold
gcc    -c -o x.o x.S
ld.gold -z max-page-size=0x200000 -shared -o x.so x.o
objdump -dw x.so

x.so:     file format elf64-x86-64


Disassembly of section .text:

0000000000000204 <bar>:
 204:	48 8d 05 dd 00 20 80 	lea    -0x7fdfff23(%rip),%rax        # ffffffff802002e8 <_end+0xfffffffefffffff8>
[hjl@gnu-6 pr18591]$
Comment 2 H.J. Lu 2016-02-03 15:42:08 UTC
All relocations with 8-bit, 16-bit and 32-bit fields need to check for
overflow.
Comment 3 H.J. Lu 2016-02-03 20:10:13 UTC
On users/hjl/gold branch, I got

[hjl@gnu-6 pr18695]$ cat x.S
	.hidden foo
	.comm pad,0x8ff00000,8
	.comm foo,8,8
	.text
	.globl	bar
	.type	bar, @function
bar:
	lea	foo(%rip), %rax
[hjl@gnu-6 pr18695]$ make
gcc    -c -o x.o x.S
./ld -z max-page-size=0x200000 -shared -o x.so x.o
x.o(.text+0x3): error: relocation type 2 overflow
Makefile:25: recipe for target 'x.so' failed
make: *** [x.so] Error 1
[hjl@gnu-6 pr18695]$ 

instead of

[hjl@gnu-6 pr18695]$ ld.gold -z max-page-size=0x200000 -shared -o x.so x.o
[hjl@gnu-6 pr18695]$
Comment 4 H.J. Lu 2016-02-04 01:35:36 UTC
Overflow check doesn't work x32:

[hjl@gnu-6 pr18695]$ cat x.S
	.hidden foo
	.comm pad,0x8ff00000,8
	.comm foo,8,8
	.text
	.globl	bar
	.type	bar, @function
bar:
	lea	foo(%rip), %rax
[hjl@gnu-6 pr18695]$ make x32.so
gcc -mx32 -g -c -o x32.o x.S
./ld.gold -m elf32_x86_64 -z max-page-size=0x200000 -shared -o x32.so x32.o
[hjl@gnu-6 pr18695]$ ld.bfd  -m elf32_x86_64 -z max-page-size=0x200000 -shared -o x32.so x32.o
x32.o: In function `bar':
/export/home/hjl/bugs/binutils/pr18695/x.S:8:(.text+0x3): relocation truncated to fit: R_X86_64_PC32 against symbol `foo' defined in COMMON section in x32.o
[hjl@gnu-6 pr18695]$
Comment 5 cvs-commit@gcc.gnu.org 2016-02-05 16:29:02 UTC
The master branch has been updated by Cary Coutant <ccoutant@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=44803b5d876fcbbc1c6d9919a1b763679d5c035f

commit 44803b5d876fcbbc1c6d9919a1b763679d5c035f
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Fri Feb 5 08:27:13 2016 -0800

    Overhaul relocation framework to support overflow checking.
    
    gold/
    	PR gold/18695
    	* reloc.h (Relocate_functions::Address): New typedef.
    	(Relocate_functions::Addendtype): New typedef.
    	(Relocate_functions::Overflow_check): New enum type.
    	(Relocate_functions::Reloc_status): New enum type.
    	(Relocate_functions::check_overflow): New function template.
    	(Relocate_functions::rel): Add check parameter; check for overflow.
    	(Relocate_functions::rel_unaligned): Likewise.
    	(Relocate_functions::rela): Likewise.
    	(Relocate_functions::pcrel): Likewise.
    	(Relocate_functions::pcrel_unaligned): Likewise.
    	(Relocate_functions::pcrela): Likewise.
    	(Relocate_functions::rel8): Adjust parameter types.
    	(Relocate_functions::rela8): Likewise.
    	(Relocate_functions::pcrel8): Likewise.
    	(Relocate_functions::pcrela8): Likewise.
    	(Relocate_functions::rel16): Likewise.
    	(Relocate_functions::rela168): Likewise.
    	(Relocate_functions::pcrel16): Likewise.
    	(Relocate_functions::pcrela16): Likewise.
    	(Relocate_functions::rel32): Likewise.
    	(Relocate_functions::rel32_unaligned): Likewise.
    	(Relocate_functions::rela32): Likewise.
    	(Relocate_functions::pcrel32): Likewise.
    	(Relocate_functions::pcrel32_unaligned): Likewise.
    	(Relocate_functions::pcrela32): Likewise.
    	(Relocate_functions::rel8_check): New function.
    	(Relocate_functions::rela8_check): New function.
    	(Relocate_functions::pcrel8_check): New function.
    	(Relocate_functions::pcrela8_check): New function.
    	(Relocate_functions::rel16_check): New function.
    	(Relocate_functions::rela168_check): New function.
    	(Relocate_functions::pcrel16_check): New function.
    	(Relocate_functions::pcrela16_check): New function.
    	(Relocate_functions::rel32_check): New function.
    	(Relocate_functions::rel32_unaligned_check): New function.
    	(Relocate_functions::rela32_check): New function.
    	(Relocate_functions::pcrel32_check): New function.
    	(Relocate_functions::pcrel32_unaligned_check): New function.
    	(Relocate_functions::pcrela32_check): New function.
    	(Bits::has_unsigned_overflow32): New function.
    	(Bits::has_unsigned_overflow): New function.
    	* testsuite/Makefile.am (overflow_unittest): New test.
    	* testsuite/Makefile.in: Regenerate.
    	* testsuite/overflow_unittest.cc: New source file.
Comment 6 cvs-commit@gcc.gnu.org 2016-02-05 17:21:07 UTC
The master branch has been updated by Cary Coutant <ccoutant@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c34c98ed62f7f01fa19b1cfb174df942ee47127d

commit c34c98ed62f7f01fa19b1cfb174df942ee47127d
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Fri Feb 5 09:19:47 2016 -0800

    Add some relocation overflow checks for x86_64.
    
    2016-02-05  Cary Coutant  <ccoutant@gmail.com>
    	    Andrew Senkevich  <andrew.senkevich@intel.com>
    
    gold/
    	PR gold/18695
    	* x86_64.cc (Target_x86_64::Relocate::relocate): Add overflow
    	checking for R_X86_64_32, R_X86_64_32S, R_X86_64_PC32, and
    	R_X86_64_PLT32.
    	* testsuite/Makefile.am (x86_64_overflow_pc32): New test.
    	* testsuite/x86_64_overflow_pc32.sh: New test script.
    	* testsuite/x86_64_overflow_pc32.s: New source file.
Comment 7 Cary Coutant 2016-02-05 17:41:00 UTC
Leaving this open, as there are still more overflow checks to add.
Comment 8 H.J. Lu 2016-02-07 03:34:43 UTC
X32 overflow check is wrong.  One x32 gold test failure:

`echo g++ -mx32 -fno-lto  -W -Wall    -Werror -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fmerge-constants -g -O2 -fno-use-linker-plugin  -static-libstdc++ -static-libgcc  -o basic_static_pic_test | sed -e 's/-Wp,-D_FORTIFY_SOURCE=[0-9][0-9]*//'` -Bgcctestdir/ -static basic_pic_test.o
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/crti.o(.init+0x11): error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(libc-start.o):function generic_start_main: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(libc-start.o):function generic_start_main: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(exit.o):function __run_exit_handlers: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(libc-cancellation.o):function __libc_enable_asynccancel: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_un_link: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_un_link: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_link_in: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_link_in: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_default_finish: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_default_finish: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all_lockp: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all_lockp: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all_linebuffered: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(genops.o):function _IO_flush_all_linebuffered: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dl-lookup.o):function do_lookup_x: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dl-close.o):function _dl_close_worker.part.0: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dl-close.o):function _dl_close_worker.part.0: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dl-close.o):function _dl_close_worker.part.0: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(setlocale.o):function setlocale: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(finddomain.o):function _nl_find_domain: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(loadmsgcat.o):function _nl_load_domain: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(loadmsgcat.o):function _nl_load_domain: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(loadmsgcat.o):function _nl_unload_domain: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfprintf.o):function _IO_vfprintf_internal: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfprintf.o):function _IO_vfprintf_internal: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfprintf.o):function buffered_vfprintf: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfprintf.o):function buffered_vfprintf: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfscanf.o):function _IO_vfscanf_internal: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(vfscanf.o):function _IO_vfscanf_internal: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dl-fini.o):function _dl_fini: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function _nl_find_msg: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function _nl_find_msg: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function _nl_find_msg: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function _nl_find_msg: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function __dcigettext: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function __dcigettext: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function __dcigettext: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(dcigettext.o):function __dcigettext: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(sdlerror.o):function init: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(sdlerror.o):function __dlerror: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../libx32/libc.a(sdlerror.o):function _dlerror_run: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2.o):function uw_init_context_1: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info.part.4: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info_bases: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info_table_bases: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __deregister_frame_info_bases: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __deregister_frame_info_bases: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function _Unwind_Find_FDE: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function _Unwind_Find_FDE: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function _Unwind_Find_FDE: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info.part.4: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info_bases: error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/libgcc_eh.a(unwind-dw2-fde-dip.o):function __register_frame_info_table_bases: error: relocation overflow
collect2: error: ld returned 1 exit status
Makefile:5240: recipe for target 'basic_static_pic_test' failed
make: *** [basic_static_pic_test] Error 1
[hjl@gnu-tools-1 testsuite]$ 

Cary, do you want me to fix it?
Comment 9 H.J. Lu 2016-02-07 03:54:41 UTC
(In reply to H.J. Lu from comment #8)
> X32 overflow check is wrong.  One x32 gold test failure:
> 
> Cary, do you want me to fix it?

You can build x32 gold under Ubuntu with

CC="gcc -mx32 -fno-lto " CXX="g++ -mx32 -fno-lto "  /export/gnu/import/git/sources/binutils-gdb/configure \
	 --disable-ld --disable-gdb --disable-sim --disable-readline --disable-libdecnumber \
	x86_64-linux-gnux32 --enable-gold --enable-plugins --enable-threads \
	--prefix=/usr/local \
	--with-local-prefix=/usr/local
Comment 10 Cary Coutant 2016-02-07 06:40:03 UTC
Created attachment 8963 [details]
Patch to fix broken x32 overflow checks

Fix incorrect x32 overflow checking for refs to weak undef symbols.

On x32, a pc-relative reference to an undef weak symbol (value 0)
with a negative addend (typically -4) generates a spurious overflow
error because Symbol_value::value() returns a 32-bit negative number
as an unsigned number, which gets zero-extended before subtracting
the PC value. This patch fixes the problem by special-casing the
negative addend, and adding it to the value after widening it to
64 bits. Symbol_value::value() does not need the addend if it's
negative, since it is only important when processing section
symbols for merge sections, where a positive addend provides the
input section offset of the merged constant.

With this patch, I can build basic_static_pic_test in x32 mode.
HJ, I'd appreciate it if you could give it more testing before I
commit it.

2016-02-06  Cary Coutant  <ccoutant@gmail.com>

gold/
	* x86_64.cc (X86_64_relocate_functions::pcrela32_check): Fix x32
	overflow checking when symbol value + addend < 0.
Comment 11 H.J. Lu 2016-02-07 13:25:03 UTC
(In reply to Cary Coutant from comment #10)
> Created attachment 8963 [details]
> Patch to fix broken x32 overflow checks
> 
> Fix incorrect x32 overflow checking for refs to weak undef symbols.

> With this patch, I can build basic_static_pic_test in x32 mode.
> HJ, I'd appreciate it if you could give it more testing before I
> commit it.
> 
> 2016-02-06  Cary Coutant  <ccoutant@gmail.com>
> 
> gold/
> 	* x86_64.cc (X86_64_relocate_functions::pcrela32_check): Fix x32
> 	overflow checking when symbol value + addend < 0.

Yes, it works.  Can you improve overflow message?

[hjl@gnu-tools-1 pr18695]$ make x
gcc -B./ -mx32 -fno-lto  -o x foo.o main.o
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/crtbegin.o: In function `__do_global_dtors_aux':
crtstuff.c:(.text+0x72): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x84): relocation truncated to fit: R_X86_64_PC32 against `.bss'
main.o: In function `main':
/export/home/hjl/bugs/binutils/pr18695/main.c:8:(.text.startup+0x2): relocation truncated to fit: R_X86_64_PC32 against symbol `foo' defined in COMMON section in foo.o
/export/home/hjl/bugs/binutils/pr18695/main.c:9:(.text.startup+0x22): relocation truncated to fit: R_X86_64_PC32 against symbol `foo' defined in COMMON section in foo.o
collect2: error: ld returned 1 exit status
Makefile:31: recipe for target 'x' failed
make: *** [x] Error 1
[hjl@gnu-tools-1 pr18695]$ make y
gcc -B./ -mx32 -fno-lto  -o y foo.o main.o -fuse-ld=gold
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/crtbegin.o(.text+0x72): error: relocation overflow
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/x32/crtbegin.o(.text+0x84): error: relocation overflow
main.c:8: error: relocation overflow
main.c:9: error: relocation overflow
/usr/libx32/libc_nonshared.a(elf-init.oS):function __libc_csu_init: error: relocation overflow
/usr/libx32/libc_nonshared.a(elf-init.oS):function __libc_csu_init: error: relocation overflow
collect2: error: ld returned 1 exit status
Makefile:34: recipe for target 'y' failed
make: *** [y] Error 1
[hjl@gnu-tools-1 pr18695]$ 

Overflow message from gold contains not much useful messages for users.
Comment 12 cvs-commit@gcc.gnu.org 2016-02-07 18:17:50 UTC
The master branch has been updated by Cary Coutant <ccoutant@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=17ecd016113c77c7fead1725d2d315fe7b42aced

commit 17ecd016113c77c7fead1725d2d315fe7b42aced
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Sun Feb 7 10:17:01 2016 -0800

    Add additional information to relocation overflow errors.
    
    gold/
    	PR gold/18695
    	* x86_64.cc (Target_x86_64::Relocate::relocate): Add additional
    	information to relocation overflow errors.
Comment 13 Cary Coutant 2016-03-27 20:33:52 UTC
*** Bug 15460 has been marked as a duplicate of this bug. ***