Bug 1573872

Summary: ld should allow "lea foo@GOT, %ecx"
Product: Red Hat Enterprise Linux 7 Reporter: Deepu K S <dkochuka>
Component: binutilsAssignee: Nick Clifton <nickc>
Status: CLOSED ERRATA QA Contact: Miloš Prchlík <mprchlik>
Severity: medium Docs Contact:
Priority: high    
Version: 7.6CC: alanm, dkochuka, fweimer, jcastran, jwright, law, mcermak, mprchlik, ohudlick, rmullett
Target Milestone: rcKeywords: ZStream
Target Release: ---   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: binutils-2.27-31.base.el7 Doc Type: Bug Fix
Doc Text:
Cause: The BFD based linker was being needlessly restrictive in its handling of a special form of the x86 LEA instruction when building a shared library. Consequence: The linker would reject valid code with an error message about an unsupported address mode. Fix: Patch the linker so that it can handle the addressing mode. Result: The linker no longers complains, but instead accepts and links the input file.
Story Points: ---
Clone Of:
: 1582602 (view as bug list) Environment:
Last Closed: 2018-10-30 07:50:06 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1582602    

Description Deepu K S 2018-05-02 12:18:45 UTC
Description of problem:
$ cat x.S 
	.text
	.globl	bar
	.type	bar, @function
bar:
	call	__x86.get_pc_thunk.ax
	addl	$_GLOBAL_OFFSET_TABLE_, %eax
	lea	foo@GOT, %ecx
	mov	(%eax,%ecx,1), %eax
	ret
	.section	.text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
	.globl	__x86.get_pc_thunk.ax
	.hidden	__x86.get_pc_thunk.ax
	.type	__x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
	movl	(%esp), %eax
	ret
	.section	.note.GNU-stack,"",@progbits

# gcc -B./ -m32 -c -o x.o x.S
# ld -melf_i386 -shared -o libx.so x.o
ld: x.o: direct GOT relocation R_386_GOT32 against `foo' without base register can not be used when making a shared object
ld: final link failed: Bad value

Version-Release number of selected component (if applicable):
Red Hat Enterprise Linux 7.5
binutils-2.27-27.base.el7.x86_64

How reproducible:
Always

Steps to Reproduce:
1. Reproducer program provided in bug description.
2.
3.

Actual results:
ld: x.o: direct GOT relocation R_386_GOT32 against `foo' without base register can not be used when making a shared object
ld: final link failed: Bad value


Expected results:
No linker failures.

Additional info:

Comment 2 Nick Clifton 2018-05-02 14:57:36 UTC
This is PR 21168:

  https://sourceware.org/bugzilla/show_bug.cgi?id=21168

Patch on its way....

Comment 3 Nick Clifton 2018-05-02 15:21:12 UTC
Fixed in binutils-2.27-31.base.el7.

Comment 7 Nick Clifton 2018-06-21 12:13:16 UTC
*** Bug 1593421 has been marked as a duplicate of this bug. ***

Comment 8 Miloš Prchlík 2018-07-26 07:01:18 UTC
Verified for build binutils-2.27-34.base.el7 by manually running /tools/binutils/Regression/bz1573872-ld-should-allow-lea-foo-GOT-ecx test using the provided reproducer.

Comment 10 errata-xmlrpc 2018-10-30 07:50:06 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2018:3032