On 10/5/24 01:31, Uros Bizjak wrote:
movq $sym to leaq sym(%rip) which you said ought to be smaller (and in
reality appears to be the same size, 7 bytes) seems like a no-brainer
and can be treated as a code quality issue -- in other words, file bug
reports against gcc and clang.
It is the kernel assembly source that should be converted to
rip-relative form, gcc (and probably clang) have nothing with it.
Sadly, that is not correct; neither gcc nor clang uses lea:
-hpa
gcc version 14.2.1 20240912 (Red Hat 14.2.1-3) (GCC)
hpa@tazenda:/tmp$ cat foo.c
int foobar;
int *where_is_foobar(void)
{
return &foobar;
}
hpa@tazenda:/tmp$ gcc -mcmodel=kernel -O2 -c -o foo.o foo.c
hpa@tazenda:/tmp$ objdump -dr foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <where_is_foobar>:
0: 48 c7 c0 00 00 00 00 mov $0x0,%rax
3: R_X86_64_32S foobar
7: c3 ret
clang version 18.1.8 (Fedora 18.1.8-1.fc40)
hpa@tazenda:/tmp$ clang -mcmodel=kernel -O2 -c -o foo.o foo.c
hpa@tazenda:/tmp$ objdump -dr foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <where_is_foobar>:
0: 48 c7 c0 00 00 00 00 mov $0x0,%rax
3: R_X86_64_32S foobar
7: c3 ret