如何在 glibc 中为特定 (new/existing) 函数创建别名
How to create alias for particular (new/existing) function in glibc
出于某些原因,我希望为函数创建别名
pthread_mutex_trylock(pthread_mutex_t *mutex);
从 glibc 到别名命名
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 脚本告诉我一些函数(来自默认 libc)确实来自我构建的 glibc,但是使用 lab_pthread_mutex_trylock(pthread_mutex_t *mutex) 会导致错误。
glibc 的结构非常复杂,我对构建管理的了解也很薄弱,所以我觉得很多我应该做的事情都被我错过了。请帮帮我,这对我来说很重要...
gcc 错误:
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
我在 glibc 源代码中执行的步骤:
1) 如果文件 glibc-2.31/nptl/pthread_mutex_trylock.c 我添加了
weak_alias (__pthread_mutex_trylock, lab_pthread_mutex_trylock)
2) 在文件 glibc-2.31/sysdeps/nptl/pthread.h 中我添加了
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));
这个错误:
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
(如果我的猜测是正确的,预计没有输出)。
它未导出的可能原因:GLIBC 构建过程通过链接器脚本(通过组合多个 Version
文件生成)严格控制导出哪些函数以及它们具有什么版本。
特别是,您很可能需要将 lab_pthread_mutex_trylock
添加到 glibc-2.31/nptl/Versions
文件。
出于某些原因,我希望为函数创建别名
pthread_mutex_trylock(pthread_mutex_t *mutex);
从 glibc 到别名命名
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 脚本告诉我一些函数(来自默认 libc)确实来自我构建的 glibc,但是使用 lab_pthread_mutex_trylock(pthread_mutex_t *mutex) 会导致错误。
glibc 的结构非常复杂,我对构建管理的了解也很薄弱,所以我觉得很多我应该做的事情都被我错过了。请帮帮我,这对我来说很重要...
gcc 错误:
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
我在 glibc 源代码中执行的步骤:
1) 如果文件 glibc-2.31/nptl/pthread_mutex_trylock.c 我添加了
weak_alias (__pthread_mutex_trylock, lab_pthread_mutex_trylock)
2) 在文件 glibc-2.31/sysdeps/nptl/pthread.h 中我添加了
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));
这个错误:
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
(如果我的猜测是正确的,预计没有输出)。
它未导出的可能原因:GLIBC 构建过程通过链接器脚本(通过组合多个 Version
文件生成)严格控制导出哪些函数以及它们具有什么版本。
特别是,您很可能需要将 lab_pthread_mutex_trylock
添加到 glibc-2.31/nptl/Versions
文件。