gprofng: 30360 Seg. Fault when application uses std::thread
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Sun, 16 Apr 2023 20:55:48 +0000 (13:55 -0700)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Mon, 17 Apr 2023 20:01:38 +0000 (13:01 -0700)
commit35fab451d9ec11a7e02df750fb24feb21e9732b8
tree64f9f7b28c6ac6a1a300ad29e2c1455ec952333d
parent7a515757db9681e86926b7068b3a4a6a2df70299
gprofng: 30360 Seg. Fault when application uses std::thread

We interpose a lot of libC functions (dlopen, fork, pthread_create, etc.).
Some of these functions have versions. For example,

% nm -D /lib64/gprofng/libgp-collector.so  | grep thread_create@ | sort
000000000004b420 T pthread_create@GLIBC_2.34
000000000004b490 T pthread_create@GLIBC_2.17
000000000004b500 T pthread_create@GLIBC_2.2.5
000000000004b570 T pthread_create@GLIBC_2.1
000000000004b5e0 T pthread_create@GLIBC_2.0

Our library does not set the default version for symbols.
This is correct because we don't know which libC will be used.

gcc and g++ links differently the version symbols when the default version is
not set. c-linker is using our pthread_create@GLIBC_2.34 and c++-linker is using
our pthread_create@GLIBC_2.0 by default.

The current implementation of the interposed functions is:
  If we are in our pthread_create@GLIBC_<NN>,
  we use dlvsym (dlflag, "pthread_create", "GLIBC_<NN>") to find and call
  the same function from libC.
In the test from PR 30360, pthread_create@GLIBC_2.0 is not in the current libC.
We need to call the default version symbol from libC.

gprofng/ChangeLog
2023-04-16  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/30360
* libcollector/iotrace.c: Find and call a default libC version symbol.
* libcollector/dispatcher.c: Likewise.
* libcollector/iotrace.c: Likewise.
* libcollector/linetrace.c: Likewise.
* libcollector/mmaptrace.c: Likewise.
* libcollector/synctrace.c: Likewise.
* libcollector/collector.h (REAL_DCL): Remove an unused argument.
gprofng/libcollector/collector.h
gprofng/libcollector/dispatcher.c
gprofng/libcollector/iotrace.c
gprofng/libcollector/linetrace.c
gprofng/libcollector/mmaptrace.c
gprofng/libcollector/synctrace.c