http://sourceware.org/bugzilla/show_bug.cgi?id=13581

             Bug #: 13581
           Summary: R_X86_64_PC32 against global symbol can't be used for
                    PIC on x32
           Product: binutils
           Version: 2.23 (HEAD)
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
        AssignedTo: unassig...@sourceware.org
        ReportedBy: hjl.to...@gmail.com
    Classification: Unclassified


[hjl@gnu-6 gold-2]$ cat x.c
#include <stdio.h>

int bar;
extern void foo ();

int
main ()
{
  printf ("main: %d\n", bar);
  foo ();
  printf ("main: %d\n", bar);
  bar += 3;
  foo ();
  printf ("main: %d\n", bar);
  return 0;
}
[hjl@gnu-6 gold-2]$ cat y.c
#include <stdio.h>

extern int bar;

void
foo ()
{
  printf ("bar: %d\n", bar);
  bar += 2;
}
[hjl@gnu-6 gold-2]$ make
/usr/gcc-4.6.3-x32/bin/gcc  -mx32 -g  -c y.c
/usr/gcc-4.6.3-x32/bin/gcc  -shared  -mx32 -g  -o y.so y.o
/usr/gcc-4.6.3-x32/bin/gcc  -mx32 -g  -o x x.c y.so -Wl,-rpath,.
./x
main: 0
make: *** [all] Segmentation fault
[hjl@gnu-6 gold-2]$ gdb x
GNU gdb (GDB) 7.3.50.20110914-cvs
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /export/home/hjl/bugs/binutils/x32/gold-2/x...done.
(gdb) r
Starting program: /export/home/hjl/bugs/binutils/x32/gold-2/x 
main: 0

Program received signal SIGSEGV, Segmentation fault.
foo () at y.c:8
8      printf ("bar: %d\n", bar);
(gdb) disass
Dump of assembler code for function foo:
   0xf7dfb454 <+0>:    push   %rbp
   0xf7dfb455 <+1>:    mov    %esp,%ebp
=> 0xf7dfb457 <+3>:    mov    0x88053c3(%rip),%edx        # 0x600820
   0xf7dfb45d <+9>:    mov    $0xf7dfb4d2,%eax
   0xf7dfb462 <+14>:    mov    %eax,%eax
   0xf7dfb464 <+16>:    mov    %edx,%esi
   0xf7dfb466 <+18>:    mov    %rax,%rdi
   0xf7dfb469 <+21>:    mov    $0x0,%eax
   0xf7dfb46e <+26>:    callq  0xf7a8a1f0 <printf>
   0xf7dfb473 <+31>:    mov    0x88053a7(%rip),%eax        # 0x600820
   0xf7dfb479 <+37>:    add    $0x2,%eax
   0xf7dfb47c <+40>:    mov    %eax,0x880539e(%rip)        # 0x600820
   0xf7dfb482 <+46>:    pop    %rbp
   0xf7dfb483 <+47>:    retq   
End of assembler dump.
(gdb) p &bar
$1 = (int *) 0x600820
(gdb) p $rip
$2 = 4158633047
(gdb) p/x $rip
$3 = 0xf7dfb457
(gdb) p/x $rip + 0x88053c3
$4 = 0x10060081a
(gdb) quit
A debugging session is active.

    Inferior 1 [process 10205] will be killed.

Quit anyway? (y or n) y
[hjl@gnu-6 gold-2]$ readelf -r y.o

Relocation section '.rela.text' at offset 0x80c contains 5 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000005  00001002 R_X86_64_PC32     00000000   bar - 4
0000000a  0000050a R_X86_64_32       00000000   .rodata + 0
0000001b  00001102 R_X86_64_PC32     00000000   printf - 4
00000021  00001002 R_X86_64_PC32     00000000   bar - 4
0000002a  00001002 R_X86_64_PC32     00000000   bar - 4

Here 0x88053c3(%rip) overflows 32bit address space.

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

_______________________________________________
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to