在linux中,有没有办法从其中一个函数(或从链接到它的任何静态库函数)获取共享库名称 .
基本上,想要检查是否存在类似于当前可用于进程的 program_invocation_short_name/program_invocation_name 的API /变量 .
program_invocation_short_name/program_invocation_name
如果您想知道是否存在名为 "foo" 的动态符号,请使用dlsym(RTLD_DEFAULT, "foo")查找此符号的地址,如果没有此类动态符号,则使用 NULL .
"foo"
NULL
不过,我不知道为什么你会关心共享库的名字 .
当您拥有符号的地址时,您始终可以读取/proc/self/maps伪文件以找出符号来自哪个二进制文件 . (如果符号在 r-- 映射中,它是一个不可变的符号,例如字符串文字 . 如果它在 r-x 映射中,它在代码中,可能是一个函数 . 如果它在 rw- 映射中,它是一个全局变量 . )请注意,因为它是伪文件,它是内核二进制接口的一部分,并且从未本地化 .
r--
r-x
rw-
1 回答
如果您想知道是否存在名为
"foo"
的动态符号,请使用dlsym(RTLD_DEFAULT, "foo")查找此符号的地址,如果没有此类动态符号,则使用NULL
.不过,我不知道为什么你会关心共享库的名字 .
当您拥有符号的地址时,您始终可以读取/proc/self/maps伪文件以找出符号来自哪个二进制文件 . (如果符号在
r--
映射中,它是一个不可变的符号,例如字符串文字 . 如果它在r-x
映射中,它在代码中,可能是一个函数 . 如果它在rw-
映射中,它是一个全局变量 . )请注意,因为它是伪文件,它是内核二进制接口的一部分,并且从未本地化 .