<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60116>60116</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Unexpected relocation type R_X86_64_REX_GOTPCRELX when customized stack protector is enabled with -fno-PIE
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          bysui
      </td>
    </tr>
</table>

<pre>
    GCC version: 9.3.0
CLANG version: 15.0.7

Hello.

I'm trying to pick the commit in [https://lwn.net/ml/linux-kernel/20211113124035.9180-2-brgerst@gmail.com/](url) , which uses
`-mstack-protector-guard-reg=gs -mstack-protector-guard-symbol=__stack_chk_guard` to implement per-cpu variable for the stack protector instead of fixed location.

But kernel built with LLVM=1 failed due to unexpected relocation type `R_X86_64_REX_GOTPCRELX` for `__stack_chk_guard`.
Although, it would be optimized by linker later. However, for GCC, it generates relocation type R_X86_64_PC32 directly.

So I write a test case as following:
```C
#include <err.h>

extern int ttyname_r(int, char *, int);

int test(void)
{
        char name[10];

        if (ttyname_r(0, name, 10))
            err(1, "capsicum");

        return 0;
}
``` 

For gcc, it generates `R_X86_64_PC32`.
```shell
gcc -O2 -fstack-protector-strong -mcmodel=kernel -fno-PIE -mstack-protector-guard-reg=gs -mstack-protector-guard-symbol=__stack_chk_guard -c test.c -o test.o

objdump -r test.o

test.o:     file format elf64-x86-64

RELOCATION RECORDS FOR [.text]:
OFFSET           TYPE VALUE
000000000000000f R_X86_64_PC32 __stack_chk_guard-0x0000000000000004
0000000000000020 R_X86_64_PLT32 ttyname_r-0x0000000000000004
0000000000000031 R_X86_64_PC32 __stack_chk_guard-0x0000000000000004
0000000000000041 R_X86_64_32S .rodata.str1.1
000000000000004d R_X86_64_PLT32 err-0x0000000000000004
0000000000000052 R_X86_64_PLT32 __stack_chk_fail-0x0000000000000004


RELOCATION RECORDS FOR [.eh_frame]:
OFFSET           TYPE              VALUE
0000000000000020 R_X86_64_PC32     .text
```

For clang, it generates `R_X86_64_REX_GOTPCRELX`.
```shell
gcc -O2 -fstack-protector-strong -mcmodel=kernel -fno-PIE -mstack-protector-guard-reg=gs -mstack-protector-guard-symbol=__stack_chk_guard -c test.c -o test.o

objdump -r test.o

test.o:     file format elf64-x86-64

RELOCATION RECORDS FOR [.text]:
OFFSET           TYPE VALUE
0000000000000008 R_X86_64_REX_GOTPCRELX __stack_chk_guard-0x0000000000000004
0000000000000022 R_X86_64_PLT32 ttyname_r-0x0000000000000004
0000000000000045 R_X86_64_32S .rodata.str1.1
000000000000004c R_X86_64_PLT32 err-0x0000000000000004
0000000000000051 R_X86_64_PLT32 __stack_chk_fail-0x0000000000000004


RELOCATION RECORDS FOR [.eh_frame]:
OFFSET           TYPE              VALUE
0000000000000020 R_X86_64_PC32     .text
```

Why clang doesn't generates relocation type `R_X86_64_PC32` directly with `-fno-PIE` ?

Thanks.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV1tv2zgT_TX0y0ACRfmmBz84vqQB8jVBkvbrPhkUNZbYUKRBUrG9v35ByU1sJ-m228W-7BJBEmk4R2cuRxpy52SpESdkcEEG8x5vfGXsJN-7RvZyU-wnl7MZPKF10miSTiGL05gSOid0Oruefrw8tiWDmMajztj9_oBKmfj4zhVhoxq83UtdgjewkeIRfIUgTF1LD1IDGVxU3m8cSaeELQlbqq2ONXrClrUKl1I3u-gRrcZwyShLkiRJE9an6SDOkjGNWJTbEq3zpE_LmksVC1MHsMGcsHFjFWEZEDaDbSVFBY1DdyA5pFHtPBeP0cYaj8IbG5UNt0VksSTpvHTw3ga3r3OjSDpfrdoNK1E9rloTGdIQq6w3CmvUHjZoI7Fp4IlbyXOFsDa2zULrCM_IILXzyAswa1jLHRagjOBeGn2S1IvGQ5cPyBupPGylr-D6-vP_SDpPYM2lwgKKBgOLRuNug8JjARa_wYHfbxDIkN6tvoyHq2F_dbf4srq8ebid3S2uv4QAAkUypG8FdyAzVb4yTVmFxEoPW9OoAnIEs_Gylr9jAfkelNSPaEFxjzaGD2aLT2iDR8C_nM0OziVqtNyje0XymeHtLGVQSIvCq_1JPu4NXMHWSo_AwaPzILhD4A7WRimzlboMzfWt4t3P7HDNUqmFagoEks7Q2rgi6eIYHXcerQapPXi_17zGlSVsLLUP3EXFLRA2beMItzKSXhy7t37oPGHjJyOLsKGzjp63ZS1IQCaDi4SGrj3FIDSTayBsfEyAhke2TmwGCQ3Az9g0AwBAG_YlwU4YE3zjpGhqwthrlnBYFn1jNdAX82h-ljg49lsaC6UQr6p43FqhcC9d84zjKlSqu1cKAdENg2h9LjXnrdElRLWoTYFBbYfGj9baRLdXi3fl-Qv6hUi0JYsFRKb7zxwHbfKvRVNvILJvGA930i6la9mpveYeUK2H_Wg3HkbD_rHH3eL6ZjZ9uLr5CHeL2c3d_B6WN3fhvRh73Pm2HQ5bb5bL-8UDvKyH324X8Hl6_enQsvR0rc_k8yrUiO7OXPpvATF6BHT9kLIXKfwgQpr8TVT6R0Apu4fYmoJ7Hjtvkzh506M4J4_2R2kP2LnvMe_wpn0X6AdLjNVqbVvp_1mZT9a7NT8pVUh0WF0jnervXMZCcV1-V8jn34j_FP3PK3oMb5fjr0v7VYf_rLT7g59WpPgFRSb_CkX-v9p3ioTCoNOEjb43JL3xuX0elbrpMEy6B4G13_B0efy0h4rrRxf3iklaZGnGezhJhqM-TdN0mPWqSX-ciXWa5COW5Pmo6DPeZzhiGacFG7As68kJoyylSTKmWTKkWVwMMs5Smq9xIPhokJI-xXYyV-qpjo0te9K5BidDmiTDnuI5KteeShjTuIXWGCaVwbxnJ8EnypvSkT5V0nn3guKlVzj59P6Q-45cthVqEI3zphtVX03iDlCHWb3o8vcteb3GqsnpeaWUvmryw5EjEDv8Ce-nryjCQaYNxxG2bMP9IwAA___FcOUL">