Re: [RFC PATCH 25/28] x86: Use PIE codegen for the core kernel

From: H. Peter Anvin
Date: Sat Oct 05 2024 - 19:38:30 EST


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