gpt4 book ai didi

c - Linux getpwnam() 库依赖

转载 作者:可可西里 更新时间:2023-11-01 11:49:05 25 4
gpt4 key购买 nike

我有一个程序,其系统调用 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
主目录 =/root

没有 libnss_compat:

./pwnam root
getpwnam 失败

所以我的问题是;为什么 getpwnam() 依赖于 libnss_compat*.so?我通过 nm -D 命令发现 libc-2.3.5.so 是提供 getpwnam() 的库。

readelf -d 告诉我 libc 反过来只依赖于 ld.so.1。这反过来又不依赖于任何东西。那么,究竟为什么 libnss_compat 会产生影响?

谢谢大家的帮助!!

最佳答案

NSS 是 Name Service Switch,一个可以在各种来源(传统密码文件、Network Information Service、LDAP)中查找用户信息的库。 getpwnam 可以在 libc 中定义,但这会在运行时加载实际的 NSS 库。查看 libc,我发现

$ strings /lib/x86_64-linux-gnu/libc.so.6 | grep libnss
libnss_
libnss_
libnss_%s.so.%d.%d

最后一行显然是 snprintf 的格式字符串,用于构造要使用 dlopen 加载的实际实现库的名称。使用 /etc/nsswitch.conf 确定实现。

编辑 我在 Glibc 源代码中找到了 the library is loaded 的位置.不是(不再?)使用snprintf,但原理还是一样。

关于c - Linux getpwnam() 库依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26672784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com