Bug 1573872 - ld should allow "lea foo@GOT, %ecx"
Summary: ld should allow "lea foo@GOT, %ecx"
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Enterprise Linux 7
Classification: Red Hat
Component: binutils
Version: 7.6
Hardware: x86_64
OS: Linux
high
medium
Target Milestone: rc
: ---
Assignee: Nick Clifton
QA Contact: Miloš Prchlík
URL:
Whiteboard:
Keywords: ZStream
: 1593421 (view as bug list)
Depends On:
Blocks: 1582602
TreeView+ depends on / blocked
 
Reported: 2018-05-02 12:18 UTC by Deepu K S
Modified: 2018-10-30 07:51 UTC (History)
10 users (show)

(edit)
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.
Clone Of:
: 1582602 (view as bug list)
(edit)
Last Closed: 2018-10-30 07:50:06 UTC


Attachments (Terms of Use)


External Trackers
Tracker ID Priority Status Summary Last Updated
Red Hat Product Errata RHSA-2018:3032 None None None 2018-10-30 07:51 UTC
Sourceware 21168 None None None 2018-05-02 12:18 UTC
Red Hat Knowledge Base (Solution) 3451312 None None None 2018-05-21 18:07 UTC
Red Hat Knowledge Base (Solution) 3452571 None None None 2018-05-23 14:45 UTC

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


Note You need to log in before you can comment on or make changes to this bug.