When I add the abort and use your C++ test case, I see the abort:
bergner@ampere:~$ cat pthread_mutex_lock.c #include <stdlib.h> #include <pthread.h>
#define PTHREAD_MUTEX_NO_ELISION_NP 512 extern int __pthread_mutex_lock (pthread_mutex_t *);
int pthread_mutex_lock (pthread_mutex_t *mutex) { abort(); mutex->__data.__kind |= PTHREAD_MUTEX_NO_ELISION_NP; return __pthread_mutex_lock (mutex); } bergner@ampere:~$ gcc -fPIC -c pthread_mutex_lock.c bergner@ampere:~$ gcc -shared -Wl,-soname,libbar.so.1 -o libbar.so.1 pthread_mutex_lock.o bergner@ampere:~$ cat foo.cpp #include <mutex>
int main(int argc, char* argv[]) { std::mutex m; std::lock_guard<std::mutex> guard(m); return EXIT_SUCCESS; } bergner@ampere:~$ g++ -std=c++11 -pthread foo.cpp bergner@ampere:~$ ./a.out bergner@ampere:~$ LD_PRELOAD=./libbar.so.1 ./a.out Aborted
When I add the abort and use your C++ test case, I see the abort:
bergner@ampere:~$ cat pthread_ mutex_lock. c
#include <stdlib.h>
#include <pthread.h>
#define PTHREAD_ MUTEX_NO_ ELISION_ NP 512 mutex_lock (pthread_mutex_t *);
extern int __pthread_
int >__data. __kind |= PTHREAD_ MUTEX_NO_ ELISION_ NP; mutex_lock (mutex); mutex_lock. c libbar. so.1 -o libbar.so.1 pthread_ mutex_lock. o
pthread_mutex_lock (pthread_mutex_t *mutex)
{
abort();
mutex-
return __pthread_
}
bergner@ampere:~$ gcc -fPIC -c pthread_
bergner@ampere:~$ gcc -shared -Wl,-soname,
bergner@ampere:~$ cat foo.cpp
#include <mutex>
int main(int argc, char* argv[]) { :lock_guard< std::mutex> guard(m); ./libbar. so.1 ./a.out
std::mutex m;
std:
return EXIT_SUCCESS;
}
bergner@ampere:~$ g++ -std=c++11 -pthread foo.cpp
bergner@ampere:~$ ./a.out
bergner@ampere:~$ LD_PRELOAD=
Aborted