我试图理解g ++如何选择链接的libstdc ++版本以及当库的"系统"版本不同时它意味着什么.
我正在使用gcc/g ++ 4.1.2,根据ABI指南文档,它包含libstdc ++.so.6.0.8,当然:
-rwxr-xr-x 1 root root 4397810 May 18 2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8
Run Code Online (Sandbox Code Playgroud)
基于我对ABI前向兼容性的理解,我可以使用g ++ 4.1.2构建并期望代码在更高版本的libstdc ++而不是6.0.8的系统上运行,但不能在具有早期版本的系统上运行,因为将有一个旧版本的ABI.
在同一台机器上,/ usr/lib中有一个旧版本的libstdc ++:
-rwxr-xr-x 1 root root 804288 Jul 22 2005 /usr/lib/libstdc++.so.6.0.3
Run Code Online (Sandbox Code Playgroud)
如果我在这台机器上使用g ++ 4.1.2编译代码,那么ldd它,我看到引用的/ usr/lib中的libstdc ++版本,即6.0.3:
# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.
Run Code Online (Sandbox Code Playgroud)
这是预期的,因为首先检查/ usr/lib.应用程序运行正常.
我的问题是:这里发生了什么?
g ++ 4.1.2是否与libstdc ++版本相关联.那么这是该版本(6.0.8)的一部分吗?如果是这样,为什么可执行文件可以在运行时使用/ usr/lib中的旧版本,当它具有较旧的ABI时?运气?
或者g ++ 4.1.2在链接时获取了libstdc ++(6.0.3)的/ usr/lib版本并使用它,因为它以与运行时可执行文件相同的方式解析库路径?g ++可以做到这一点,即使libstdc ++不是它的"自己的"版本吗?在g ++ 4.1.2(6.0.8)中libstdc ++版本的目的是什么?它是否在这个过程中被使用了?
任何见解都表示赞赏.
我在检索用户是LDAP用户的Red Hat Enterprise 6的当前用户信息时遇到问题?
我有一些代码(实际上是安装工具的一部分),需要检索用户名,主目录和其他详细信息.它使用getpwuid()调用来根据用户ID执行此操作.简化细分:
uid_t uid = getuid();
printf("UID = %d\n", uid);
errno = 0;
struct passwd* udetails = getpwuid(uid);
if (udetails != NULL)
{
printf("User name = %s\n", udetails->pw_name);
}
else
{
printf("getpwuid returns NULL, errno=%d\n", errno);
}
Run Code Online (Sandbox Code Playgroud)
如果用户是本地用户(在该系统的/ etc/passwd中),则可以正常工作.
当用户是LDAP认证用户时,getuid调用返回用户ID或当前用户,但对getpwuid的调用返回0,而errno中没有设置错误代码.根据文档,这意味着用户不存在.
这有用吗?根据getpwuid手册页:
的getpwnam()函数返回一个包含在口令数据库中的记录的断开的字段的指针的结构(例如,本地密码文件/ etc/passwd中,NIS和LDAP)相匹配的用户名的名称.
getpwuid()函数返回一个指向结构的指针,该结构包含密码数据库中与用户ID uid匹配的记录的分支字段.
如果当前用户已通过LDAP验证,是否需要另外的调用来获取详细信息?是否有必要在应用程序中打开LDAP数据库,还是系统调用应该处理?
附加:我现在也在RHEL 5机箱上尝试了这个,对同一个LDAP目录进行身份验证.这可能只是RHEL 6盒子上的配置问题吗?还是更广泛的RHEL 6问题?
附加:/etc/nsswitch.conf按照Basile Starynkevitch的要求(删除了注释行):
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: …Run Code Online (Sandbox Code Playgroud)