[PATCH] D72197: [MC][ELF] Emit a relocation if target is defined in the same section and is non-local

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 6 10:54:02 PST 2020


MaskRay added a comment.

In D72197#1805996 <https://reviews.llvm.org/D72197#1805996>, @jyknight wrote:

> In D72197#1805825 <https://reviews.llvm.org/D72197#1805825>, @jyknight wrote:
>
> > I don't see the behavior you say gnu as has.
>
>
> Oh..the behavior of gnu as is apparently different for `jmp` (and conditional variants thereof), versus `call`. It behaves as you say for `call`. I wonder if it's a bug that it doesn't do so for jmp.
>
> It does cause some odd inconsistencies:
>
>   #include <stddef.h>
>   #include <string.h>
>  
>   __attribute__((noinline)) int memcmp2(const void *s1, const void *s2, size_t n) {
>     return memcmp(s1, s2, n);
>   }
>  
>   int memcmp3(const void *s1, const void *s2, size_t n) {
>     return memcmp2(s1, s2, n);
>   }
>  
>   int memcmp3_plus1(const void *s1, const void *s2, size_t n) {
>     return memcmp2(s1, s2, n) + 1;
>   }
>  
>
>
> Running `gcc -c -o /tmp/test.o /tmp/test.c -O2 && objdump -dr /tmp/test.o`, you can see that a relocation was emitted for the tail-call JMP from memcmp2 to memcmp, and for the CALL from memcmp3_plus1 to memcmp2, but NOT for the tail-call JMP from memcmp3 to memcmp2.
>
>   Disassembly of section .text:
>  
>   0000000000000000 <memcmp2>:
>      0: e9 00 00 00 00        jmpq   5 <memcmp2+0x5>
>      1: R_X86_64_PLT32 memcmp-0x4
>      5: 66 66 2e 0f 1f 84 00  data16 nopw %cs:0x0(%rax,%rax,1)
>      c: 00 00 00 00 
>  
>   0000000000000010 <memcmp3>:
>     10: eb ee                 jmp    0 <memcmp2>
>     12: 66 66 2e 0f 1f 84 00  data16 nopw %cs:0x0(%rax,%rax,1)
>     19: 00 00 00 00 
>     1d: 0f 1f 00              nopl   (%rax)
>  
>   0000000000000020 <memcmp3_plus1>:
>     20: 48 83 ec 08           sub    $0x8,%rsp
>     24: e8 00 00 00 00        callq  29 <memcmp3_plus1+0x9>
>      25: R_X86_64_PLT32 memcmp2-0x4
>     29: 48 83 c4 08           add    $0x8,%rsp
>     2d: 83 c0 01              add    $0x1,%eax
>     30: c3                    retq   
>


Yes, GNU as's behavior can be different for STB_GLOBAL call/jmp. I'll add the test case.

I wanted to mention this but got the description "ELF/relax.s: we emitted 3 relocations while GNU as emits 0." wrong. I'll add `call ` test cases and fix the description. (Our handling of `call var at plt` and `call local at plt` may also be weird. But since `var` and `local` are STB_LOCAL symbols, I'll assume that the compiler should not emit `@plt` in the first place.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72197/new/

https://reviews.llvm.org/D72197





More information about the llvm-commits mailing list