<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/73033>73033</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang 17.0.4 ignores -fPIC in certain cases
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dmiller423
</td>
</tr>
</table>
<pre>
``
clang version 17.0.4
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\dev\llvm\bin``
Target is a simple static library, contents: two functions one __weak_symbol __attribute__((naked)) containing assembly in intel format that calls a static global address in the same file (set by the second function).
The generated objects are not position independent code, using R_X86_64_32S for relocations of the functions containing asm blocks declared as weak.
tested TARGET list `{ x86_64-pc-freebsd12-elf, x86_64-pc-unknown-elf, x86_64-pc-linux-gnu }`
--
reproduction:
``
clang-17.0.4 --target=%TARGET% --sysroot=C:/tc_sysroot/%TARGET%/ -fPIC -fPIE -fasm-blocks -MD -MT syscalls.c.o -MF syscalls.c.o.d -o syscalls.c.o -c syscalls.c
``
objects relocations were tested via readelf and custom tooling, all cases produce:
``> readelf -r syscalls.c.o``
``
Relocation section '.rela.text' at offset 0x120 contains 2 entries:
Offset Info Type Symbol's Value Symbol's Name + Addend
000000000000000f 0000000300000002 R_X86_64_PC32 0000000000000000 .bss - 4
000000000000002f 000000030000000b R_X86_64_32S 0000000000000000 .bss + 0
``
rebuilding the same file/params with a previous version (clang-15.0.7):
``> readelf -r syscalls.c.o``
``
Relocation section '.rela.text' at offset 0x128 contains 2 entries:
Offset Info Type Symbol's Value Symbol's Name + Addend
000000000000000f 0000000300000002 R_X86_64_PC32 0000000000000000 .bss - 4
000000000000002e 0000000300000002 R_X86_64_PC32 0000000000000000 .bss - 4
``
source:
```c
#include <stdint.h>
#include <sys/types.h>
static uint64_t syscall_addr = 0;
int syscalls_init(uint64_t addr) {
syscall_addr = addr;
return 0;
}
__weak_symbol
__attribute__((naked))
ssize_t read(int fd, void* buf, size_t nbytes) {
__asm {
push rbp
mov rbp, rsp
mov eax, 3
mov r10, rcx
call syscall_addr
pop rbp
ret
}
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVk-P4jYU_zTm8pQoOGSAA4cZGKo9bLvaHVW9RU78Au44duTnMEM_feUkQDLMtsdKjVAc_P745_dfEKmDQdyw7Illu5lo_dG6jayV1ugWPJ0VVp437CEJv2THksdSC3OAEzpS1sB8GSfxoqe8CHdAz9JHeF895A-LqCmjN2WkfaOoplM5cB0dCgm1lagDb2NJvfekL4a80BrlTrlA2rL0kWVbiSeWbbU-1SzbFsqM0YxPBkUggFTdaATywqsStCqccGfGtwClNR6Np6Dav1moWlN6ZQ2BNQh5_obiNadzXVgNeS68d6poPeY54yvGV0a8omR8zfi6UyWUUeYAggjrQp9BGVDGo4bKulp48EfhoRRad6h6OAdtC6FBSOmQKIj4IwKJGqFSGoHxFaGH4tzvY2mNvOJkfB1Pbn1EOKBBJzxKsMWfWHoC4RCM9Z1dgxQoI7FBI9F4KK3EYIuWAvTv-R-do_KU_wiowaG2pRhsUnUYbkaa3LmGQtvylUBiqYVDCYIgGHCC0CMFaC-P3395fgGtyEPw3PJpFCGVQyxIznmEugrYbqTWvBr7Zu4JWpn2PTqYFthy9yEWoqhfHTbOyra3XDoQ7wI56gMYosgP0btjPOsBM55BFNGZnLWB0IUj3_syv-zx_ZiZ8T1AVH37su3ezxBVgupoMFT0dQfR1xegM3VBEZexhejrfrIRS4jsB5Zy9P_-Fv374vyxA9_QIQweOCkBIe1QVyCMhLIlb2vw1mplDl12CK2hFIQEvd3wZrTxoenzVVHkJkgnqEbf36-YQkB3K-PL2KEWscd3z_gShAdbVSH0k_c5Ty6xRsABjXcK6YoGAOC3nnf8fDGVnWy8nBuEH102M74k-F3oFmG882tIO8af4FFKNLJXn0yfCoaPdFj5LWu-bVN-O--DYAJxQQQRLD7Tyyv4qLiYpuPn6gLaT0x8ifiiVVqGBJ1UFcb3jXCiJnhT_ggCGocnZVu6VnHGV0M2ZHESL0OR-8-cv_r_Ox_vnP9R8b_ou_c92db9LGUfkkvd4KkypW4lAku35KUyPj6y9PlT8plCsTs3SGOe_rS-m7XK-IdF7i-RkIe-BizdQcLSp7GAMlcmypVRnvHVVTpIhabKlk83L9-p7LguWsGhb50Zn7PcjQ-cdvPL3j_29OFqpP7C3HdxzvgqAK9kKJAnqyTjj1C0XTMa2Exx9khBfAo_z0OPnGxdnqalI7iiuafU9tQR-BYc_YSO4j3Q059Iz5NOuny_pwdzTsz6CTTbjJA59DeWm32vH5fomslNKtfpWsxwM18mSbZeJYv57LjJqmyRZYvFQpZrkVXr5UOBaZbItZCiWpfpTG14wtP5nM95wpPFPE7XuFwXqcByLirO12yRYC2UjsP0F1t3mCmiFjfLNEnTmRYFaupmV867AsY4D2Os2wT-qGgPxBZJmDvopsErr3Gz7cbYofurg7EOaWjeykCJLpSgoSHOWqc3R-8b6icAxvcH5Y9tEZe2Znzfjab9EjXOhlbM-L5DGnKoA_t3AAAA__9HXlDx">