bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug gold/21285] New: R_386_GOT32 for baseless case looks implemented in


From: georgerim at gmail dot com
Subject: [Bug gold/21285] New: R_386_GOT32 for baseless case looks implemented incorrectly.
Date: Wed, 22 Mar 2017 11:23:57 +0000

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

            Bug ID: 21285
           Summary: R_386_GOT32 for baseless case looks implemented
                    incorrectly.
           Product: binutils
           Version: 2.29 (HEAD)
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: gold
          Assignee: ccoutant at gmail dot com
          Reporter: georgerim at gmail dot com
                CC: ian at airs dot com
  Target Milestone: ---

Created attachment 9926
  --> https://sourceware.org/bugzilla/attachment.cgi?id=9926&action=edit
got32-i386.s.tmp.o

According to ABI, R_386_GOT32
(https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-draft.pdf) can be
calculated as G + A without base register when position-independent code is
disabled.

Imagine next asm code:
.text
.globl bar
.type bar, @function
 bar:

.globl foo
.type foo, @function
 foo:

_start:
  movl address@hidden, %eax
  movl address@hidden, %ebx
  movl address@hidden(%eax), %eax
  movl address@hidden(%ebx), %eax

I used llvm-mc -relax-relocations=false to compile it into got32-i386.s.tmp.o
(attached), its disassembly is:
Disassembly of section .text:
00000000 <bar>:
   0:   a1 00 00 00 00          mov    0x0,%eax
   5:   8b 1d 00 00 00 00       mov    0x0,%ebx
   b:   8b 80 00 00 00 00       mov    0x0(%eax),%eax
  11:   8b 83 00 00 00 00       mov    0x0(%ebx),%eax
Relocation section '.rel.text' at offset 0x8c contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000001  00000203 R_386_GOT32       00000000   bar
00000007  00000303 R_386_GOT32       00000000   foo
0000000d  00000203 R_386_GOT32       00000000   bar
00000013  00000303 R_386_GOT32       00000000   foo

Notice that "mov 0x0,%eax" case is encoded using a1 and not 8b xx. Gold
implementation determines baseless case using following check:
baseless = (view[-1] & 0xc7) == 0x5;
(https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gold/i386.cc;h=0b447ef0d68f3ea8965091502d5a1302d69d1b32;hb=HEAD#l2895)

That works incorrectly with "a1 00 00 00 00", gold uses 0xa1 opcode in this
check, assuming it is ModRM byte, when it is not. And result calculation seems
to be broken:
 08048094 <bar>:
 8048094:       a1 fc ff ff ff          mov    0xfffffffc,%eax
 8048099:       8d 1d 94 80 04 08       lea    0x8048094,%ebx
 804809f:       8d 80 a0 e0 ff ff       lea    -0x1f60(%eax),%eax
 80480a5:       8d 83 a0 e0 ff ff       lea    -0x1f60(%ebx),%eax

0xfffffffc is offset in GOT, calculated using "G + A - GOT", when it should be
value calculated using "G + A" I think.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]