-fpatchable-function-entry: leverage multi-byte NOP on x86

Fangrui Song i@maskray.me
Mon Jan 6 08:15:00 GMT 2020


On 2020-01-04, Fangrui Song wrote:
>-fpatchable-function-entry is used by Linux kernel arm64/parisc. The
>feature works for x86, but does not leverage multi-byte NOP.
>
>% cat a.c
>int foo() { return 0; }
>% gcc -fpatchable-function-entry=5,0 -c a.c
>% objdump -d a.o
>...
>0000000000000000 <foo>:
>   0:   90                      nop
>   1:   90                      nop
>   2:   90                      nop
>   3:   90                      nop
>   4:   90                      nop
>   5:   55                      push   %rbp
>   6:   48 89 e5                mov    %rsp,%rbp
>   9:   b8 00 00 00 00          mov    $0x0,%eax
>   e:   5d                      pop    %rbp
>   f:   c3                      retq
>
>
>(I am not sure who should be notified. I CCed x86-64-port maintainer
>(Jan Hubicka <hubicka@ucw.cz>), as listed on gcc/MAINTAINERS.)

Archaeology is difficult with the mailing list archive...

CC Torsten as the patch author

https://gcc.gnu.org/ml/gcc-patches/2016-09/msg02257.html [PATCH v2] add -fprolog-pad=N option to c-family
https://gcc.gnu.org/ml/gcc-patches/2017-07/msg00391.html [PATCH v12] add -fpatchable-function-entry=N,M option

Another finding is that

-fpatchable-function-entry=N[,M] is very similar to -mhotpatch=pre-halfwords,post-halfwords on S/390
https://gcc.gnu.org/onlinedocs/gcc/S_002f390-and-zSeries-Options.html

   If the hotpatch option is enabled, a “hot-patching” function prologue
   is generated for all functions in the compilation unit. The funtion
   label is prepended with the given number of two-byte NOP instructions
   (pre-halfwords, maximum 1000000). After the label, 2 * post-halfwords
   bytes are appended, using the largest NOP like instructions the
   architecture allows (maximum 1000000).



More information about the Gcc mailing list