如何知道我的程序在 运行 时间实际使用的是哪个共享库?
How to know which shared library my program is actually using at run time?
如何找出我的程序在 运行 时间使用的共享库的路径?
我的 CentOS 6.10 系统上有 glibc 2.12 作为主 glibc 运行ning,/opt/glibc-2.14
中还有 installed glibc 2.14。
当我用
检查我的可执行文件时
$ objdump -p ./myProgram
它提供了这个信息
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libcurl.so.4
NEEDED libc.so.6
我的 LD_LIBRARY_PATH
有这个值 /opt/glibc-2.14/lib
。
在 运行ning[=31= 时,是否可以查看我的程序实际使用 哪个 libc.so.6
库(可能带有库文件的路径) ]?
On Linux:一种可能的方法是查看 /proc/
文件系统中的相应条目。例如,对于 PID 为 X
的程序,您可以在 /proc/X/maps
中找到类似于以下内容的信息:
...
7f34a73d6000-7f34a73f8000 r--p 00000000 08:03 18371015 /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
7f34a73f8000-7f34a7535000 r-xp 00022000 08:03 18371015 /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
...
它清楚地显示了我的 libc(该程序使用的那个)在哪里。
Example(缺少一些错误处理!)以显示 fopen
的来源:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#define BSIZE 200
int main(void) {
char buffer[BSIZE];
int const pid = getpid();
snprintf(buffer, BSIZE, "/proc/%d/maps", pid);
FILE * const maps = fopen(buffer, "r");
while (fgets(buffer, BSIZE, maps) != NULL) {
unsigned long from, to;
int const r = sscanf(buffer, "%lx-%lx", &from, &to);
if (r != 2) {
puts("!");
continue;
}
if ((from <= (uintptr_t)&fopen) && ((uintptr_t)&fopen < to)) {
char const * name = strchr(buffer, '/');
if (name) {
printf("%s", name);
} else {
puts("?");
}
}
}
fclose(maps);
}
如何找出我的程序在 运行 时间使用的共享库的路径?
我的 CentOS 6.10 系统上有 glibc 2.12 作为主 glibc 运行ning,/opt/glibc-2.14
中还有 installed glibc 2.14。
当我用
检查我的可执行文件时$ objdump -p ./myProgram
它提供了这个信息
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libcurl.so.4
NEEDED libc.so.6
我的 LD_LIBRARY_PATH
有这个值 /opt/glibc-2.14/lib
。
在 运行ning[=31= 时,是否可以查看我的程序实际使用 哪个 libc.so.6
库(可能带有库文件的路径) ]?
On Linux:一种可能的方法是查看 /proc/
文件系统中的相应条目。例如,对于 PID 为 X
的程序,您可以在 /proc/X/maps
中找到类似于以下内容的信息:
...
7f34a73d6000-7f34a73f8000 r--p 00000000 08:03 18371015 /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
7f34a73f8000-7f34a7535000 r-xp 00022000 08:03 18371015 /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
...
它清楚地显示了我的 libc(该程序使用的那个)在哪里。
Example(缺少一些错误处理!)以显示 fopen
的来源:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#define BSIZE 200
int main(void) {
char buffer[BSIZE];
int const pid = getpid();
snprintf(buffer, BSIZE, "/proc/%d/maps", pid);
FILE * const maps = fopen(buffer, "r");
while (fgets(buffer, BSIZE, maps) != NULL) {
unsigned long from, to;
int const r = sscanf(buffer, "%lx-%lx", &from, &to);
if (r != 2) {
puts("!");
continue;
}
if ((from <= (uintptr_t)&fopen) && ((uintptr_t)&fopen < to)) {
char const * name = strchr(buffer, '/');
if (name) {
printf("%s", name);
} else {
puts("?");
}
}
}
fclose(maps);
}