getresuid 在 c99 中是不是已弃用?
Posted
技术标签:
【中文标题】getresuid 在 c99 中是不是已弃用?【英文标题】:Is getresuid deprecated in c99?getresuid 在 c99 中是否已弃用? 【发布时间】:2015-04-27 06:16:36 【问题描述】:我正在尝试编译一个包含对getresuid
的调用的函数。但是它会产生以下警告:
setuid.c:8:3: warning: implicit declaration of function 'getresuid' is invalid
in C99 [-Wimplicit-function-declaration]
getresuid(&ruid, &euid, &suid);
^
Undefined symbols for architecture x86_64:
"_getresuid", referenced from:
_main in setuid-ba46f8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
为什么会出现链接器错误,提示找不到体系结构 x86_64 的符号?如何让它成功链接?
如果有帮助,我的原始代码是:
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
uid_t euid, ruid, suid;
getresuid(&ruid, &euid, &suid);
printf("EUID: %d, RUID: %d, SUID: %d\n", euid, ruid, suid);
return 0;
我正在尝试在 Mac OS X 10.10.2 (Yosemite) 上编译。
【问题讨论】:
直接回答是“不;getresuid()
根本不是 C99 的一部分,也不是 POSIX 2008 (2013) 的一部分”。因此,要使用它,您必须使用特定于平台的扩展。您的代码中不需要#include <sys/types.h>
。您的代码在 Ubuntu 14.04 上为我编译好。您使用的是哪个版本的 Linux?
我认为 C99 禁止隐式声明,而不是 getresuid()
,这会导致混淆。
@Jonathan Leffler:Mac OS 10.10.2?抱歉,这可能是个愚蠢的问题,但您需要什么扩展(以及在哪里可以找到参考资料)?
Mac OS X 10.10.2 不是 Linux 的变体;它是 BSD 的变体。 getresuid()
函数在 Mac 上根本不可用——它没有实现。您需要使用getuid()
和geteuid()
来表示“r”和“e”部分;我不确定有没有办法得到's'部分。请注意,在问题中准确识别平台将有助于避免陷入各种死胡同。
【参考方案1】:
您需要在所有标题之前定义
#define _GNU_SOURCE
getresuid
是一个 GNU 扩展函数。
【讨论】:
我在原始代码中做到了这一点。它仍然给出同样的错误。 @cathy:- 您是否尝试在 GCC 选项中添加-D_GNU_SOURCE
?还要确保在文件中的所有标题之前添加了#define _GNU_SOURCE
。
是的。我确实阅读了另一篇建议所有这些事情的 SO 帖子。我相信我上面的错误的主要区别是链接器错误。相关的 SO 帖子是这样的:***.com/questions/19721810/…
@cathy:当您定义_GNU_SOURCE
时,您是否收到了编译警告,或者只是链接器错误?
两者。 gcc setuid.c 产生以下结果:【参考方案2】:
直接的答案是“不;getresuid()
根本不是 C99 的一部分——也不是 POSIX 2008 (2013)”。所以要使用它,你必须使用特定于平台的扩展,而且它并非在所有平台上都可用。
顺便说一句,您的代码中不需要#include <sys/types.h>
。
您的代码在 Ubuntu 14.04 上编译正常。但是,它无法在源自 BSD 而不是 Linux 的 Mac OS X 10.10.3 (Yosemite) 上编译。 getresuid()
函数在平台上根本不可用——未实现。
您需要使用getuid()
和geteuid()
来获取“r”(真实UID)和“e”(有效UID)信息;我认为没有一种明智的方式来获取“s”(保存的 UID)信息。大多数时候,三个 UID 值是相同的。只有期望以 'setuid' 位集运行的程序需要担心这些,并且此类程序可能需要担心保存的 UID。但是,您可能仅限于在程序启动时检查有效的 UID;这是保存的 UID。
【讨论】:
以上是关于getresuid 在 c99 中是不是已弃用?的主要内容,如果未能解决你的问题,请参考以下文章
正在显示弃用警告“不推荐使用 server/replset/mongos/db 选项”