[PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic

Uros Bizjak ubizjak@gmail.com
Fri May 13 17:22:00 GMT 2016


On Fri, May 13, 2016 at 7:20 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, May 13, 2016 at 9:51 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>> On Fri, May 13, 2016 at 9:07 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>>> On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>
>>>>>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure
>>>>>> with -mcmodel -fpic, where:
>>>>>>
>>>>>> /tmp/ccfpoxHY.o: In function `bar':
>>>>>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32
>>>>>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o
>>>>>> collect2: error: ld returned 1 exit status
>>>>>> compiler exited with status 1
>>>>>>
>>>>>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit
>>>>>> region, data is unlimited. Based on these assumptions, code should be
>>>>>> accessed via R_X86_64_GOT64.
>>>>>>
>>>>>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for
>>>>>> CM_MEDIUM_PIC.
>>>>>>
>>>>>> 2016-05-12  Uros Bizjak  <ubizjak@gmail.com>
>>>>>>
>>>>>>     PR target/61599
>>>>>>     * config/i386/i386.c (legitimize_pic_address): Do not use
>>>>>>     UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model.
>>>>>>
>>>>>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with
>>>>>> -mcmodel=medium -fpic.
>>>>>>
>>>>>> Jakub, H.J., do you have any comments on the patch?
>>>>>
>>>>>
>>>>> I prefer this patch.
>>
>>> Yes, your patch is more precise.
>>
>> OTOH, are we sure there is no linker bug here? We have:
>>
>> $ objdump -dr pr61599-1a.o
>>
>> pr61599-1a.o:     file format elf64-x86-64
>>
>>
>> Disassembly of section .text:
>>
>> 0000000000000000 <main>:
>>    0:   55                      push   %rbp
>>    1:   48 89 e5                mov    %rsp,%rbp
>>    4:   48 8d 05 00 00 00 00    lea    0x0(%rip),%rax        # b <main+0xb>
>>                         7: R_X86_64_GOTPC32     _GLOBAL_OFFSET_TABLE_-0x4
>>    b:   b8 00 00 00 00          mov    $0x0,%eax
>>   10:   e8 00 00 00 00          callq  15 <main+0x15>
>>                         11: R_X86_64_PLT32      bar-0x4
>>   15:   89 c2                   mov    %eax,%edx
>>   17:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # 1e <main+0x1e>
>>                         1a: R_X86_64_GOTPCREL   c-0x4
>>   1e:   0f b6 80 e1 00 00 00    movzbl 0xe1(%rax),%eax
>>   25:   0f be c0                movsbl %al,%eax
>>   28:   01 d0                   add    %edx,%eax
>>   2a:   5d                      pop    %rbp
>>   2b:   c3                      retq
>>
>> $ objdump -dr pr61599-2a.o
>>
>> pr61599-2a.o:     file format elf64-x86-64
>>
>>
>> Disassembly of section .text:
>>
>> 0000000000000000 <bar>:
>>    0:   55                      push   %rbp
>>    1:   48 89 e5                mov    %rsp,%rbp
>>    4:   48 8d 05 00 00 00 00    lea    0x0(%rip),%rax        # b <bar+0xb>
>>                         7: R_X86_64_GOTPC32     _GLOBAL_OFFSET_TABLE_-0x4
>>    b:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # 12 <bar+0x12>
>>                         e: R_X86_64_GOTPCREL    a-0x4
>>   12:   0f b6 40 02             movzbl 0x2(%rax),%eax
>>   16:   0f be d0                movsbl %al,%edx
>>   19:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # 20 <bar+0x20>
>>                         1c: R_X86_64_GOTPCREL   b-0x4
>>   20:   0f b6 40 10             movzbl 0x10(%rax),%eax
>>   24:   0f be c0                movsbl %al,%eax
>>   27:   01 c2                   add    %eax,%edx
>>   29:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # 30 <bar+0x30>
>>                         2c: R_X86_64_GOTPCREL   c-0x4
>>   30:   0f b6 80 00 01 00 00    movzbl 0x100(%rax),%eax
>>   37:   0f be c0                movsbl %al,%eax
>>   3a:   01 d0                   add    %edx,%eax
>>   3c:   5d                      pop    %rbp
>>   3d:   c3                      retq
>>
>> $ gcc pr61599-2a.o pr61599-1a.o
>> pr61599-2a.o: In function `bar':
>> pr61599-2a.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32
>> against symbol `a' defined in LARGE_COMMON section in pr61599-1a.o
>> collect2: error: ld returned 1 exit status
>>
>> There is no R_X86_64_PC32 in pr61599-2a.o, only X86_64_GOTPCREL, which
>> according to assumptions, would reach all entries in the GOT table.
>
> I opened:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=20093

I  also reported

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

Thanks,
Uros.



More information about the Gcc-patches mailing list