我有一个程序,在运行时系统调用getpwnam()
失败了。为了调试这个问题,我决定使用以下代码(来自论坛)单独运行getpwnam()
:
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
struct passwd *pw;
if (argc != 2) {
printf("usage: %s username\n", argv[0]);
exit(0);
}
pw = getpwnam(argv[1]);
if (pw == NULL)
printf("getpwnam failed\n");
else
printf("home dir = %s\n", pw->pw_dir);
exit(0);
}
奇怪的是看起来似乎取决于存在 libnss_compat-2.3.5.so
:
使用 libnss_compat:
./pwnam root
home dir = /root
不使用 libnss_compat:
./pwnam root
getpwnam 失败
因此我的问题是,为什么 getpwnam()
依赖于 libnss_compat*.so
?我用 nm -D
命令发现提供 getpwnam()
的库是 libc-2.3.5.so
。
readelf -d
显示,libc
只依赖于 ld.so.1
。而这又没有依赖关系。那么为什么 libnss_compat
会有影响呢?
感谢大家的帮助!
readelf -d
没有显示出library-xyz
依赖于library-abc
,我该怎么知道呢? - Andy Jdlopen
,然后确定这些库是哪些以及代码是否曾经到达dlopen
调用。后两个问题是不可判定的。strings
、readelf
和strace
是你的好朋友,但它们不能捕捉所有情况。 - Fred FooLD_DEBUG=files
,以便查看执行过程中动态链接的每个库。如果您有全面的测试套件来自动化该过程,那么这非常方便,但即使您手动使用应用程序时,它仍然很有价值。 - Dalzhim