• Adrian Hunter's avatar
    perf symbols: Add support for x86 .plt.sec · b2529f82
    Adrian Hunter authored
    The section .plt.sec was originally added for MPX and was first called
    .plt.bnd. While MPX has been deprecated, .plt.sec is now also used for
    IBT.  On x86_64, IBT may be enabled by default, but can be switched off
    using gcc option -fcf-protection=none, or switched on by -z ibt or -z
    ibtplt. On 32-bit, option -z ibt or -z ibtplt will enable IBT.
    
    With .plt.sec, calls are made into .plt.sec instead of .plt, so it makes
    more sense to put the symbols there instead of .plt. A notable
    difference is that .plt.sec does not have a header entry.
    
    For x86, when synthesizing symbols for plt, use offset and entry size of
    .plt.sec instead of .plt when there is a .plt.sec section.
    
    Example on Ubuntu 22.04 gcc 11.3:
    
      Before:
    
        $ cat tstpltlib.c
        void fn1(void) {}
        void fn2(void) {}
        void fn3(void) {}
        void fn4(void) {}
        $ cat tstplt.c
        void fn1(void);
        void fn2(void);
        void fn3(void);
        void fn4(void);
    
        int main()
        {
                fn4();
                fn1();
                fn2();
                fn3();
                return 0;
        }
        $ gcc --version
        gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
        Copyright (C) 2021 Free Software Foundation, Inc.
        This is free software; see the source for copying conditions.  There is NO
        warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
        $ gcc -Wall -Wextra -shared -o libtstpltlib.so tstpltlib.c
        $ gcc -Wall -Wextra -z ibt -o tstplt tstplt.c -L . -ltstpltlib -Wl,-rpath=$(pwd)
        $ readelf -SW tstplt | grep 'plt\|Name'
          [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
          [11] .rela.plt         RELA            0000000000000698 000698 000060 18  AI  6  24  8
          [13] .plt              PROGBITS        0000000000001020 001020 000050 10  AX  0   0 16
          [14] .plt.got          PROGBITS        0000000000001070 001070 000010 10  AX  0   0 16
          [15] .plt.sec          PROGBITS        0000000000001080 001080 000040 10  AX  0   0 16
        $ perf record -e intel_pt//u --filter 'filter main @ ./tstplt' ./tstplt
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.015 MB perf.data ]
        $ perf script --itrace=be --ns -F+flags,-event,+addr,-period,-comm,-tid,-cpu,-dso
        38970.522546686:   tr strt                               0 [unknown] =>     55fc222a81a9 main+0x0
        38970.522546686:   tr end  call               55fc222a81b1 main+0x8 =>     55fc222a80a0 [unknown]
        38970.522546687:   tr strt                               0 [unknown] =>     55fc222a81b6 main+0xd
        38970.522546687:   tr end  call               55fc222a81b6 main+0xd =>     55fc222a8080 [unknown]
        38970.522546688:   tr strt                               0 [unknown] =>     55fc222a81bb main+0x12
        38970.522546688:   tr end  call               55fc222a81bb main+0x12 =>     55fc222a80b0 [unknown]
        38970.522546688:   tr strt                               0 [unknown] =>     55fc222a81c0 main+0x17
        38970.522546688:   tr end  call               55fc222a81c0 main+0x17 =>     55fc222a8090 [unknown]
        38970.522546689:   tr strt                               0 [unknown] =>     55fc222a81c5 main+0x1c
        38970.522546894:   tr end  return             55fc222a81cb main+0x22 =>     7f3a4dc29d90 __libc_start_call_main+0x80
    
      After:
    
        $ perf script --itrace=be --ns -F+flags,-event,+addr,-period,-comm,-tid,-cpu,-dso
        38970.522546686:   tr strt                               0 [unknown] =>     55fc222a81a9 main+0x0
        38970.522546686:   tr end  call               55fc222a81b1 main+0x8 =>     55fc222a80a0 fn4@plt+0x0
        38970.522546687:   tr strt                               0 [unknown] =>     55fc222a81b6 main+0xd
        38970.522546687:   tr end  call               55fc222a81b6 main+0xd =>     55fc222a8080 fn1@plt+0x0
        38970.522546688:   tr strt                               0 [unknown] =>     55fc222a81bb main+0x12
        38970.522546688:   tr end  call               55fc222a81bb main+0x12 =>     55fc222a80b0 fn2@plt+0x0
        38970.522546688:   tr strt                               0 [unknown] =>     55fc222a81c0 main+0x17
        38970.522546688:   tr end  call               55fc222a81c0 main+0x17 =>     55fc222a8090 fn3@plt+0x0
        38970.522546689:   tr strt                               0 [unknown] =>     55fc222a81c5 main+0x1c
        38970.522546894:   tr end  return             55fc222a81cb main+0x22 =>     7f3a4dc29d90 __libc_start_call_main+0x80
    Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/r/20230131131625.6964-3-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b2529f82
symbol-elf.c 58.4 KB