mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
a1ab12856f
A statically linked executable can have a .plt due to IFUNCs, in which case .symtab is used not .dynsym. Check the section header link to see if that is the case, and then use symtab instead. Example: Before: $ cat tstifunc.c #include <stdio.h> void thing1(void) { printf("thing1\n"); } void thing2(void) { printf("thing2\n"); } typedef void (*thing_fn_t)(void); thing_fn_t thing_ifunc(void) { int x; if (x & 1) return thing2; return thing1; } void thing(void) __attribute__ ((ifunc ("thing_ifunc"))); int main() { thing(); 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 -static -Wall -Wextra -Wno-uninitialized -o tstifuncstatic tstifunc.c $ readelf -SW tstifuncstatic | grep 'Name\|plt\|dyn' [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 4] .rela.plt RELA 00000000004002e8 0002e8 000258 18 AI 29 20 8 [ 6] .plt PROGBITS 0000000000401020 001020 000190 00 AX 0 0 16 [20] .got.plt PROGBITS 00000000004c5000 0c4000 0000e0 08 WA 0 0 8 $ perf record -e intel_pt//u --filter 'filter main @ ./tstifuncstatic' ./tstifuncstatic thing1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.008 MB perf.data ] $ perf script --itrace=be --ns -F+flags,-event,+addr,-period,-comm,-tid,-cpu,-dso 15786.690189535: tr strt 0 [unknown] => 4017cd main+0x0 15786.690189535: tr end call 4017d5 main+0x8 => 401170 [unknown] 15786.690197660: tr strt 0 [unknown] => 4017da main+0xd 15786.690197660: tr end return 4017e0 main+0x13 => 401c1a __libc_start_call_main+0x6a After: $ perf script --itrace=be --ns -F+flags,-event,+addr,-period,-comm,-tid,-cpu,-dso 15786.690189535: tr strt 0 [unknown] => 4017cd main+0x0 15786.690189535: tr end call 4017d5 main+0x8 => 401170 thing_ifunc@plt+0x0 15786.690197660: tr strt 0 [unknown] => 4017da main+0xd 15786.690197660: tr end return 4017e0 main+0x13 => 401c1a __libc_start_call_main+0x6a Reviewed-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Adrian 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-8-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
47 lines
933 B
C
47 lines
933 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __PERF_SYMSRC_
|
|
#define __PERF_SYMSRC_ 1
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include "dso.h"
|
|
|
|
#ifdef HAVE_LIBELF_SUPPORT
|
|
#include <libelf.h>
|
|
#include <gelf.h>
|
|
#endif
|
|
#include <elf.h>
|
|
|
|
struct symsrc {
|
|
char *name;
|
|
int fd;
|
|
enum dso_binary_type type;
|
|
|
|
#ifdef HAVE_LIBELF_SUPPORT
|
|
Elf *elf;
|
|
GElf_Ehdr ehdr;
|
|
|
|
Elf_Scn *opdsec;
|
|
size_t opdidx;
|
|
GElf_Shdr opdshdr;
|
|
|
|
Elf_Scn *symtab;
|
|
size_t symtab_idx;
|
|
GElf_Shdr symshdr;
|
|
|
|
Elf_Scn *dynsym;
|
|
size_t dynsym_idx;
|
|
GElf_Shdr dynshdr;
|
|
|
|
bool adjust_symbols;
|
|
bool is_64_bit;
|
|
#endif
|
|
};
|
|
|
|
int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, enum dso_binary_type type);
|
|
void symsrc__destroy(struct symsrc *ss);
|
|
|
|
bool symsrc__has_symtab(struct symsrc *ss);
|
|
bool symsrc__possibly_runtime(struct symsrc *ss);
|
|
|
|
#endif /* __PERF_SYMSRC_ */
|