Issue 165124
Summary [clang] x86: Cannot get the correct address to _GLOBAL_OFFSET_TABLE_ from C code when using integrated assembler.
Labels clang
Assignees
Reporter iucoen
    On 32-bit x86 I'm using the following C code to return pointer _GLOBAL_OFFSET_TABLE_
```
void *get_got_ptr(void) {
    extern __attribute__((visibility("hidden"))) char _GLOBAL_OFFSET_TABLE_[];
 return _GLOBAL_OFFSET_TABLE_;
}
```

When compiling this, clang seems to want to generated the correct instructions ([godbolt link](https://godbolt.org/z/x74jKsTMv)):
```
get_got_ptr:
        calll .L0$pb
.L0$pb:
        popl    %eax
.Ltmp0:
        addl $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %eax
        leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%eax), %eax
        retl
```
The ` _GLOBAL_OFFSET_TABLE_@GOTOFF` symbol should resolve to 0 by the linker.

However, the object file produced when using the integrated assembler has the wrong relocation type for `_GLOBAL_OFFSET_TABLE_@GOTOFF` ([godbolt link](https://godbolt.org/z/hq6M31o5z)):
```
get_got_ptr:
 call 5 <get_got_ptr+0x5>
 pop    %eax
 add    $0x3,%eax
    R_386_GOTPC _GLOBAL_OFFSET_TABLE_
 lea    0x2(%eax),%eax
    R_386_GOTPC _GLOBAL_OFFSET_TABLE_
 ret
```
The `lea` instruction should have relocation type `R_386_GOTOFF`, not `R_386_GOTPC`. The output is correct when using `-fno-integrated-as` ([goldbolt link](https://godbolt.org/z/xc19PKrWY)).

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to