Как создать псевдоним для конкретной (новой / существующей) функции в glibc - PullRequest
1 голос
/ 12 марта 2020

По некоторым причинам я sh хочу создать псевдоним для функции

pthread_mutex_trylock(pthread_mutex_t *mutex);

из glib c для псевдонима с именем

lab_pthread_mutex_trylock(pthread_mutex_t *mutex);

Я пытаюсь добавить

weak_alias (__pthread_mutex_trylock, lab_pthread_mutex_trylock)

в файле pthread_mutex_trylock. c (редактирование исходного кода библиотеки) и затем

./configure --prefix=/home/user/glibc
make
make install

После этого я компилирую свою программу как

  gcc \
  -L "/home/user/glibc/lib" \
  -I "/home/user/glibc/include" \
  -Wl,--rpath="/home/user/glibc/lib" \
  -Wl,--dynamic-linker="/home/user/glibc/lib/ld-linux-x86-64.so.2" \
  -std=c11 \
  -o main.out \
  -v \
  main.c \
  -pthread \
;
ldd ./main.out
./main.out

Скрипт ldd показывает, что некоторые функции (из библиотеки по умолчанию c) действительно из моей сборки glib c, но использование lab_pthread_mutex_trylock (pthread_mutex_t * mutex) вызывает ошибку.

glib * У 1040 * очень сложная структура, и у меня довольно слабые знания об управлении сборкой, поэтому я чувствую, что многие вещи, которые я должен был сделать, были упущены мной. Пожалуйста, помогите мне, это очень важно для меня ...

Ошибка от g cc:

gcc -L "/ home / anahel / glibc-test / lib" -I "/ home / anahel / glibc-test / include" -Wl, - rpath = "/ home / anahel / glibc-test / lib" -Wl , - dynamic-linker = "/ home / anahel / glibc-test / lib / ld-linux-x86-64.so.2" -std = c11 -o main.out main.c -pthread

/ usr / bin / ld: /tmp/ccivqLEz.o: in the "main" function:
main.c :(. text + 0x1b): undefined reference to "lab_pthread_mutex_trylock"
collect2: error: ld returned 1 exit status

Шаги, которые я делал в glib c sources:

1) Если файл glib c -2.31 / nptl / pthread_mutex_trylock. c Я добавил

weak_alias (__pthread_mutex_trylock, lab_pthread_mutex_trylock)

2) В файл glib c -2.31 / sysdeps / nptl / pthread.h I добавлено

extern int lab_pthread_mutex_trylock (pthread_mutex_t *__mutex)
 __THROWNL __nonnull ((1));

сразу после

/* Try locking a mutex.  */
extern int pthread_mutex_trylock (pthread_mutex_t *__mutex)
     __THROWNL __nonnull ((1));

1 Ответ

1 голос
/ 13 марта 2020

Эта ошибка:

undefined reference to "lab_pthread_mutex_trylock"

означает, что lab_pthread_mutex_trylock не экспортируется из /home/user/glibc/lib/libpthread.so.0. Вы можете подтвердить это с помощью:

nm -D /home/user/glibc/lib/libpthread.so.0 | grep lab_pthread_mutex_trylock

(не ожидайте вывода, если мои предположения верны).

Вероятная причина, по которой он не экспортируется: GLIB C процесс сборки жестко контролирует, какие функции экспортируется, и какая у них версия, через скрипт компоновщика (который генерируется путем объединения нескольких файлов Version).

В частности, вам, скорее всего, нужно добавить lab_pthread_mutex_trylock в файл glibc-2.31/nptl/Versions.

...