【问题标题】:How to create alias for particular (new/existing) function in glibc如何在 glibc 中为特定(新/现有)函数创建别名
【发布时间】:2020-06-24 15:53:42
【问题描述】:

出于某些原因,我希望为函数创建别名

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));

【问题讨论】:

  • 它会导致哪个错误?你介意以某种方式声明函数吗?
  • @Ctx,未定义的引用。这是我的大学任务——实现 pthread_mutex_trylock,除了 pthread_mutex_trylock 函数之外,所有的 linux lib 函数都是允许的。所以我决定只重命名 glibc 中的函数,并制作这个库以供使用
  • 不太可能是问题(还...),但您是否也将函数重命名为 pthread.h 头文件,以便使用它的代码具有正确的原型?另外:glibc 是一种复杂的野兽。重命名一个函数可能比仅仅更改一个弱别名和一个或两个引用要复杂得多。
  • @AndrewHenle,我更新了我的问题...
  • 找到 . -print0 | xargs -0 sed -i 's/search/replace/g'

标签: c linux build glibc


【解决方案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 文件中。

【讨论】:

  • 你完全正确!这是为了让一切正常工作而剩下的唯一步骤! 1) 编辑 pthread_mutex_trylock.c 2) 编辑 pthread.h 3) 并将 lab_pthread_mutex_trylock 添加到 nptl / 版本文件。我花了几天时间试图找到答案。非常感谢!
  • 我递归改函数名并将pthread_mutex_trylock()重命名为lab_pthread_mutex_trylock()后,在构建时出现类似“文件/usr/include/中没有名称pthread_mutex_trylock x86_64-linux-gnu / c++ / bits 9 /gthr-default.h 和 /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-posix.h "
  • @penny 您不能只重命名标准函数,因为其他代码(此处包含在 GCC 中的标头)依赖。您的问题创建了一个别名,that 应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2018-03-31
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多