I am interested in compiling / linking an assembly project whose shared library function calls bypass the PLT (use the GOT directly). I Tried using -fno-plt but the resulting library calls still go through the PLT.
Questions
I am wondering:
- Why does the -fno-pltargument not work when compiling assembly?
- Is there a way to compile assembly so that shared library function calls bypass the PLT?
Assembly PLT Bypass with -fno-plt NOT Working.
Using the simplest example:
    .global main
    .text
main:
    callq   exit
When compiled with:
gcc -fno-plt test0.S -o test0
Produces the following for main:
0000000000001139 <main>:
    1139:   e8 f2 fe ff ff          callq  1030 <exit@plt>
    113e:   66 90                   xchg   %ax,%ax
Which is calling exit through the PLT.
C PLT Bypass with -fno-plt Working
Alternatively the same code in C:
extern void exit(int);
int main() {
    exit(0);
}
Compiled with:
gcc -O2 -fno-plt  test1.c -o test1 
Gets the following for main:
0000000000001040 <main>:
    1040:   f3 0f 1e fa             endbr64 
    1044:   50                      push   %rax
    1045:   58                      pop    %rax
    1046:   31 ff                   xor    %edi,%edi
    1048:   48 83 ec 08             sub    $0x8,%rsp
    104c:   ff 15 96 2f 00 00       callq  *0x2f96(%rip)        # 3fe8 <exit@GLIBC_2.2.5>
    1052:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
    1059:   00 00 00 
    105c:   0f 1f 40 00             nopl   0x0(%rax)
Which correctly bypasses the PLT for the call to exit.
 
    