Bypass GOT/PLT for __ros_syscall within libc
authorAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 06:35:18 +0000 (23:35 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 06:35:18 +0000 (23:35 -0700)
commit9013130067fc2210a1c78e9a311fdf58133bda15
treeb12ec2c1df8c0467c7d5321130993ad6c2cb3902
parentfefc7262bdc1af04ed0723ebc97c8199a66fcd17
Bypass GOT/PLT for __ros_syscall within libc

Bypassing the global offset table removes one level of indirection in the
syscall path.  On RISC-V, a call via the GOT is three instructions, including
a load, whereas a direct call is a single instruction with no data memory
access.  The situation in x86 is analogous, though it's the PLT and
instruction cache that are bypassed, rather than the GOT and data cache.
(FWIW, the difference is due to self-modifying code being cheap on x86.)

In general, libc_hidden_proto/libc_hidden_def have this effect, but they
should only be used when interposition isn't necessary (e.g. you can't use
LD_PRELOAD to override function definitions if the PLT is bypassed).
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/sys/syscall.h
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/syscall.c